5.openFeign
5.1. 简介
- Feign是一个声明式的Web Service客户端,使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个接口,然后在上面添加注解.
- 可插拔的注解支持,包括Feign注解和JAX-RS注解.
- 支持可插拔的编码器和解码器.
- 支持Sentinel和Fallback
- 支持SpringCloudLoadBalancer的负载均衡
- 支持HTTP请求和响应的压缩
5.2. 服务架构
服务消费者 -》 OpenFeign -》 服务提供者
5.3.快速上手
服务提供者:nacos-pay-provider
@RestController
public class PayAlibabaController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/pay/nacos/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id) {
return ResultData.success("nacos registry serverPost: " + serverPort + ", id: " + id) ;
}
}
feign api:nacos-feign-api
@FeignClient(value = "nacos-pay-provider") //微服务对应application.name
public interface PayFeignApi {
@GetMapping("/pay/nacos/{id}")
public ResultData getPayInfo(@PathVariable("id") Integer id);
}
服务消费者:
cloud-consumer-openfeign-order
@RestController
public class OrderController {
@Resource
private PayFeignApi payFeignApi;
@GetMapping(value = "/feign/pay/nacos/{id}")
public ResultData getOrder(@PathVariable("id") Integer id){
System.out.println("feign add order");
return payFeignApi.getPayInfo(id);
}
}
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启feign客户端
public class MainOpenFeign80 {
public static void main(String[] args) {
SpringApplication.run(MainOpenFeign80.class,args);
}
}
5.4. OpenFeign超时控制
- OpenFeign默认等待60s,超过60s就会报错,可以通过配置文件修改超时时间。
openfeign:
client:
config:
default: # 设置feign客户端超时时间
connectTimeout: 5000
readTimeout: 5000
nacos-pay-provider: # 为nacos-pay-provider服务单独设置超时时间
connectTimeout: 5000
readTimeout: 5000
5.5. OpenFeign重试机制
- OpenFeign默认是没有重试机制的,需要手动配置。
- 默认不开启OpenFeign重试机制
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer(){
return Retryer.NEVER_RETRY;
}
}
- 开启OpenFeign重试机制
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Retryer myRetryer(){
return new Retryer.Default(100, 1000, 3);
}
}
5.6. OpenFeign httpclient配置
- OpenFeign默认使用的是HttpURLConnection,没有连接池,性能较差,可以切换为Apache HttpClient5
5.6.1. 引入依赖
io.github.openfeign
feign-hc5
13.1
org.apache.httpcomponents.client5
httpclient5
5.3.1
5.6.2. 配置文件
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
cloud:
nacos:
discovery:
server-addr: localhost:8848
openfeign:
client:
config:
default: # 设置feign客户端超时时间
connectTimeout: 5000
readTimeout: 5000
nacos-pay-provider: # 为nacos-pay-provider服务单独设置超时时间
connectTimeout: 5000
readTimeout: 5000
httpclient:
hc5:
enabled: true
5.7. OpenFeign请求响应压缩
- OpenFeign支持对请求和响应进行GZIP压缩,减少通信过程的性能损耗。
- 细粒度设置:指定压缩的请求数据类型并设置请求压缩的大小下限,超过大小才进行压缩。
- 配置文件
server:
port: 80
spring:
application:
name: cloud-consumer-openfeign-order
cloud:
nacos:
discovery:
server-addr: localhost:8848
openfeign:
compression:
request:
enabled: true
min-request-size: 2048 # 请求压缩的最小值
mime-types: text/xml,application/xml,application/json # 请求压缩的MIME类型
response:
enabled: true
5.8. OpenFeign日志
- OpenFeign提供了日志打印功能,方便开发人员排查问题。
5.8.1. 日志级别
级别
说明
NONE
不记录任何日志
BASIC
只记录请求方法、URL、响应状态码及执行时间
HEADERS
在BASIC的基础上,记录请求和响应的头信息
FULL
在HEADERS的基础上,记录请求和响应的正文信息
5.8.2. 配置日志
- 配置类
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
- 配置文件
logging:
level:
org:
example:
cloud:
apis:
org.example.cloud.apis.PayFeignApi: debug
6.Micrometer
6.1. 简介
- 在微服务框架中,一个由客户端发起的请求,可能会经过多个微服务,每个微服务又可能调用多个其他微服务,形成了一个复杂的调用链路,任何一环出现高延时或错误都会引起整个请求最后的失败。
- Micrometer分布式链路追踪,就是将一次分布式请求还原成一个调用链路,对每个环节进行日志记录和性能监控,并将一次分布式请求的调用情况集中web展示从而让我们可以直观地发现错误发生在哪个环节,以及耗时主要耗费在哪个环节,便于我们快速定位问题。
6.2.分布式链路原理
- 基于Spring Cloud Sleuth实现分布式链路追踪,Sleuth可以记录一次分布式请求的调用链路,并生成一个全局唯一的TraceID,用于标识一次分布式请求(链路),同时还会生成多个SpanID,用于标识一次分布式请求的多个阶段(请求信息)。
6.3.Zipkin
- Zipkin是一个分布式链路追踪系统,可以收集分布式系统的服务调用数据,并生成可视化的调用链路图,方便开发人员排查问题。
- Zipkin由两部分组成:Collector和Storage,Collector负责接收服务调用数据,Storage负责存储服务调用数据,并提供查询接口。
- Zipkin还提供了Web UI,用于展示服务调用链路图。
6.3.1. 安装
- 下载Zipkin
登录官网下载jar包
- 运行Zipkin
java -jar zipkin-server-3.4.4-exec.jar
访问
http://localhost:9411/zipkin/
6.3.2. 集成
- 引入依赖
io.micrometer
micrometer-tracing-bom
${micrometer-tracing.version}
pom
import
io.micrometer
micrometer-tracing
${micrometer-tracing.version}
io.micrometer
micrometer-tracing-bridge-brave
${micrometer-tracing.version}
io.micrometer
micrometer-observation
${micrometer-observation.version}
io.github.openfeign
feign-micrometer
${feign-micrometer.version}
io.zipkin.reporter2
zipkin-reporter-brave
${zipkin-reporter-brave.version}
- 服务配置文件
management:
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
tracing:
sampling:
probability: 1.0 # 采样率默认为0.1(十次记录一次),值越大收集越及时