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而言就有些多余。

浙公网安备 33010602011771号