SpringCloud(一.2)微服务远程调用(更常用) -- Feign
通过RestTemplate实现远程调用后存在一些问题,如图:
RestTemplate缺点:
代码可读性差,编程体验不统一。
参数复杂URL难以维护。
Feign是一个声明式的http客户端(https://github.com/OpenFegin/feign),其作用就是帮助我们优雅的实现http请求的发送,解决上面RestTemplate的痛点。
Feign的定义和使用
1、引入依赖
<!--feign客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2、在启动类添加注解开启Feign功能 @EnableFeignClients
3、编写Feign客户端
新建 Client 包 ,新建接口 UserClient。
自定义Feign的配置
Feign的性能优化
1、调试错误的话用FULL, 只记录日志尽量用BASIC。平时情况下用默认的NONE或BASIC,因为记录日志也是会消耗一定性能。
2、Feign底层的客户端实现默认使用URLConnection,是JDK自带的,不支持连接池。连接每次创建都要三次握手,断开四次挥手。比较浪费性能。
解决方法:
使用连接池 Apache(阿帕奇) HttpClient 或 OKHttp (这两种方式都支持连接池)
HttpClient 举例
1、引入HttpClient依赖
<!--引入HttpClient依赖--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
2、配置连接池
feign: httpclient: enabled: true # 支持HttpClient的开关 max-connections: 200 # 最大连接数 max-connections-per-route: 50 # 单个路径的最大连接数
FeignClient模块抽取
如图:
Order-service 微服务和pay-service 微服务都要调用user-service 的某个接口。按上面Feign的配置步骤都需要 新建 Client 包 ,新建接口 UserClient。还有都要在yml中配置一些Feign的相关配置。
优化方式:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
配置
client
引入feign-api依赖,变更引用
指定要引入的FeignClient包(更推荐第二种)
弊端:
假设:user-service提供了 10个接口,pay-service需要调用2个,Order-service需要调用10个。按抽取方式引入feign-api对于pay-service而言就有些多余。