文章目录
①. OpenFeign是什么
-
①. Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可插入的注释支持,包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud添加了对Spring MVC注释的支持,以及对使用Spring Web中默认使用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在使用Feign时提供负载平衡的http客户端。
-
③. openfeign是一个声明式的Web服务客户端,只需创建一个Rest接口并在该接口上添加注解@FeignClient即可
②. OpenFeign能干嘛
-
①. 前面在使用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,OpenFeign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并使用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外暴露可以被调用的接口方法,大大简化和降低了调用客户端的开发量,也即由服务提供者给出调用接口清单,消费者直接通过OpenFeign调用即可
-
②. OpenFeign同时还集成SpringCloud LoadBalancer
可以在使用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用 -
③. 提炼下
- 可插拔的注解支持,包括Feign注解和JAX-RS注解
- 支持可插拔的HTTP编码器和解码器
- 支持Sentinel和它的Fallback
- 支持SpringCloudLoadBalancer的负载均衡
- 支持HTTP请求和响应的压缩
③. OpenFeign通用步骤
-
①. 此次业务说明
服务消费者80 → 调用含有@FeignClient注解的Api服务接口 → 服务提供者(8001/8002)
-
②. 搭建cloud-consumer-feign-order80工程
- 引入依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 写yaml
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
- 主启动(修改类名为MainOpenFeign80)
- ③. 业务类
- 按照架构说明图进行编码准备
- 修改cloud-api-commons通用模块
引入openfeign依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
新建服务接口PayFeignApi,头上配置@FeignClient注解
参考微服务8001的Controller层,新建PayFeignApi接口
@FeignClient("cloud-payment-service")
public interface PayFeignApi {
/**
* 新增一条支付相关流水记录
* @param payDTO
* @return
*/
@PostMapping("/pay/add")
public ResultData addPay(@RequestBody PayDTO payDTO);
/**
* 按照主键记录查询支付流水信息
* @param id
* @return
*/
@GetMapping(value = "/pay/get/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id);
/**
* openfeign天然支持负载均衡演示
* @return
*/
@GetMapping(value = "/pay/get/info")
public String mylb();
}
-
④. 拷贝之前的80工程进cloud-consumer-feign-order80,记得去掉部分代码和LoadBalancer不相关特性
-
⑤. 修改Controller层的调用
@RestController
@Tag(name = "Feign支付微服务模块", description = "支付CRUD")
public class OrderController {
@Resource
private PayFeignApi payFeignApi;
@PostMapping(value = "/feign/pay/add")
public ResultData addOrder(@RequestBody PayDTO payDTO) {
ResultData resultData = payFeignApi.addPay(payDTO);
return resultData;
}
/**
* openfeign天然支持负载均衡演示
*
* @return
*/
@GetMapping(value = "/feign/pay/mylb")
public String mylb() {
return payFeignApi.mylb();
}
}
- ⑥. 测试
④. OpenFeign超时控制
- ①. 本次OpenFeign的版本要注意,最新版和网络上你看到的配置不一样
- ②. 超时设置,故意设置超时演示出错情况,自己使坏写bug
- 服务提供方cloud-provider-payment8001故意写暂停62秒钟程序
- 80服务调用结果
- ③. 官网解释+配置处理 关键配置
- 默认OpenFeign客户端等待60秒钟,但是服务端处理超过规定时间会导致Feign客户端返回报错
- 为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,默认60秒太长或者业务时间太短都不好
- connectTimeout:连接超时时间
- readTimeout:请求处理超时时间
- ④. yaml文件如何配置
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
openfeign:
client:
config:
default:
connectTimeout: 3000 #连接超时时间
readTimeout: 3000 #读取超时时间
cloud-payment-service:
connectTimeout: 2000 #连接超时时间 两秒
readTimeout: 2000 #读取超时时间 两秒
⑤. OpenFeign重试机制
-
①. 默认重试是关闭的,给了默认值
-
②. 默认关闭重试机制,测试看看
-
③. 开启Retryer功能,新增配置类FeignConfig并修改Retryer配置
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer() {
//return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的
//最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
return new Retryer.Default(100, 1, 3);
}
}
⑥. OpenFeign默认HttpClient修改
- ①. 默认用的是什么
- ②. Apache HttpClient5 配置开启说明
# Apache HttpClient5 配置开启
spring:
cloud:
openfeign:
httpclient:
hc5:
enabled: true
- ③. 替换之后
⑦. OpenFeign请求/响应压缩
- ①. 官网说明
- ②. 对请求和响应进行GZIP压缩
- Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗
- 通过下面的两个参数设置,就能开启请求与相应的压缩功能:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true
- ③. 细粒度化设置
- 对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限
- 只有超过这个大小的请求才会进行压缩:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型
spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小
- ④. yaml文件配置
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
openfeign:
client:
config:
default:
#cloud-payment-service:
#连接超时时间
connectTimeout: 4000
#读取超时时间
readTimeout: 4000
httpclient:
hc5:
enabled: true
compression:
request:
enabled: true
min-request-size: 2048 #最小触发压缩的大小
mime-types: text/xml,application/xml,application/json #触发压缩数据类型
response:
enabled: true
⑧. OpenFeign日志打印功能
-
①. Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,说白了就是对Feign接口的调用情况进行监控和输出
-
②. 日志级别
- NONE:默认的,不显示任何日志
- BASIC:仅记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
- FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据
- ③. 配置日志bean
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer() {
//return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的
//最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
return new Retryer.Default(100, 1, 3);
}
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
- ④. YML文件里需要开启日志的Feign客户端
# feign日志以什么级别监控哪个接口
logging:
level:
com:
xiaozhi:
cloud:
apis:
PayFeignApi: debug
- ⑤. 带着压缩调用和去掉压缩调用
- ⑥. 重试演示结果
- ⑦. 本节内容最后的YML
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
openfeign:
client:
config:
default:
connectTimeout: 2000 #连接超时时间
readTimeout: 2000 #读取超时时间
httpclient:
hc5:
enabled: true
compression:
request:
enabled: true
min-request-size: 2048
mime-types: text/xml,application/xml,application/json
response:
enabled: true
#cloud-payment-service:
#connectTimeout: 4000 #连接超时时间
#readTimeout: 4000 #读取超时时间
# feign日志以什么级别监控哪个接口
logging:
level:
com:
xiaozhi:
cloud:
apis:
PayFeignApi: debug