步骤:
引入依赖
org.springframework.cloud spring-cloud-starter-openfeign
启动类上添加注解@EnableFeignClients
编写Feign客户端
@FeignClient("userService")
public interface UserApi {@GetMapping("/user/{id}")
User findById(@PathVariable Long id);
}
使用
这是RestTemplate的代码
@Service
public class OrderService {@Autowired
private OrderMapper orderMapper;
@Autowired
RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.调用REST接口查询数据
User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class);
// 3.封装数据
order.setUser(user);
// 4.返回
return order;
}
}
这是Feign的代码:
@Service
public class OrderService {@Autowired
private OrderMapper orderMapper;
@Autowired
UserApi userApi;
public Order queryOrderById(Long orderId) {// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.调用REST接口查询数据
User user = userApi.findById(order.getUserId());
// 3.封装数据
order.setUser(user);
// 4.返回
return order;
}
}
代码可读性更高了,并且自带负载均衡。
feign可以自定义配置一些东西:
springboot中配置一般都是两种方式,代码或者application.yml
代码
@Bean
public Logger.Level feignLogLevel() {return Logger.Level.FULL;
}
若是全局生效,需要在启动类的注解中加上该配置类:
@EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
若是局部,只需要在对应的客户端中声明:
@FeignClient(value = "userService", configuration = CustomConfiguration.class)
application.yml
配置文件同样也可以配置全局或者局部
全局:
feign:
client:
config:
default: # 这个就是区分全局或者局部的 若是default则是全局
logger-level: full
局部:
feign:
client:
config:
userService: # 这个就是区分全局或者局部的 若是default则是全局
logger-level: full
Feign底层实现默认是URLConnection,不支持连接池,效率低。
我们可以选择Apache HttpClient或是OKHttp(俩都支持连接池)来优化Feign的性能。
以HttpClient为例:
引入依赖
io.github.openfeign feign-httpclient
配置连接池
feign:
httpclient:
enabled: true # 开启feign对httpclient的支持
max-connections: 200 # 大连接数
max-connections-per-route: 50 # 每个路径大连接数
简单说就是使用NONE级别或是BASIC级别,级别高了消耗性能。
四、最佳实践 方式一:继承给消费者的FeignClient和提供者的Controller定义一个统一的父接口作为标准。
缺点:紧耦合
方式二:抽取就是搞一个公共的模块,把多个微服务都需要的接口写在里面,需要使用时引入即可。
缺点就是会引入很多不用的东西。
实现:
创建新的公共模块,导入feign的依赖,创建普通maven项目即可,不然打包时有坑。
将order-service中的Feign客户端、实体类、Feign的配置等移入该公共模块
在order-service中引入该公共模块
如:
com.example feign-api 0.0.1-SNAPSHOT
指定客户端
两种方式
扫描包,全部导入
@EnableFeignClients(basePackages = "com.example.feignapi.apis")
该包下的所有feign客户端都会被扫描
指定客户端导入
@EnableFeignClients(clients = {UserAPI.class})
指定客户端,可以是一个数组
建议使用第二种。
测试
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款