Feign
一、基于Feign远程调用
RestTemplate方式调用存在的问题
String url="http://userservice/user/"+userId;User user=restTemplate.getForObject(url,User.class);
存在下面的问题:
1.代码可读性差,编程体验不统一
2.参数复杂URL难以维护
1.定义和使用Feign客户端
1.引入依赖
<!-- feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
2.在order-service的启动类添加注解开启Feign的功能
3.编写Feign客户端:
@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.用feign远程调用User user = userClient.findById(order.getUserId());System.out.println("user:"+user);// 3.封装user到orderorder.setUser(user);// 4.返回return order;}
二、自定义配置
方式一:基于配置文件
全局:
feign:client:config:default: # 配置全局的 feign 的策略loggerLevel: full
针对某个微服务:
feign:client:config:userservice: # 配置指定服务的 feign 的策略loggerLevel: full
方式二:基于java代码
局部有效:
全局有效:
三、Feign的性能优化
调整连接池配置 默认情况下Feign使用HTTPURLConnection,性能较差。建议替换为Apache HttpClient或OKHttp,通过连接池复用减少TCP连接建立的开销。
日志级别尽量用basic
1.引入依赖
<!-- httpclient依赖--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
2.配置文件开启httpClient功能,设置连接池参数:
feign:httpclient:enabled: true # 开启 httpclientmax-connections: 200 # 最大连接数max-connections-per-route: 50 # 每个路径的最大连接数
四、Fegin的最佳实现
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的PO10、默认的Feign配置都放到这个模块中,提供给所有消费者使用
方式二实现:
1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖
2.引入feign的starter依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies>
3.将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中
4.在order-service中引入feign-api的依赖
<dependency><groupId>cn.itcast</groupId><artifactId>feign-api</artifactId><version>1.0</version></dependency>
5.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
6.重启测试