转自:https://cloud.tencent.com/developer/article/1701342
Spring Cloud Feign服务之间的调用
文章目录
从服务之间调用方式说起…
微服务架构时代, 服务之间的调用很频繁并且有多种方式, 可以通过 JDK 原生的 URLConnection, Apache 的 Http Client, Netty 的异步 Http Client 或者 Spring 的 RestTemplate 去实现服务间的调用. 但最优雅、最方便的还是Spring Cloud 的 Open Feign.
Feign 是一种声明式、模板化的 HTTP 客户端. 在 Spring Cloud 中使用 Feign, 可以做到使用 HTTP 调用远程服务就像调用本地方法一样.
Feign 的一些特性
- 支持 Ribbon 的负载均衡
- 支持 Hystrix 和它的 Fallback
- 支持 HTTP 请求和响应的压缩
Feign 工作原理
- 主程序入口处添加 @EnableFeignClients 注解, 定义的接口处添加 @FeignClients 注解
- 程序启动后, 会扫描被 @FeignClients 注解的接口, 并将这些信息注入到 Spring IOC 容器中. 调用接口方法的时候, Feign 会为每一个接口方法创建一个 RestTemplate 对象. 该对象封装了HTTP 请求的所有信息
- 然后RestTemplate 生成 Request, 然后把 Request 交给 Client (JDK 原生的 URLConnection、Apache 的 httpclient 或者是 OK http) 处理
- 最后 Client 被封装到 LoadBalanceClient类, 这个类结合 Ribbon 负载均衡发起服务间的调用
Feign 配置参数
FeignClient 注解的属性
- name/value: 指定了微服务的名称, 用户服务发现
- url: 一般用于调试, 可以手动指定 @FeignClient 的调用地址 (如果同时指定 name 和 url 属性: 则以 url 属性为准, name 属性指定的值便当做客户端的名称)
- configuration: Feign 配置类, 可以自定义 Feign 的 Encoder, Decoder, LogLevel, Contant
- path: 定义当前 FeignClient 的统一前缀
对单个 FeignClient 进行配置
可以通过 application.properties 或者 application.yaml 类配置
feign:
client:
config:
feignName: joke-resource
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读超时间
loggerLevel: full # 日志级别
errorDecoder: com.example.SimpleErrorDecoder # 错误解码器
retryer: com.example.SimpleRetryer # 配置重试
requestInterceptors: # 配置拦截器
- com.example.FooRequestInterceptor
- com.example.BarReqeustInterceptor
decode404: false
encoder: com.example.SimpleEncoder # 编码器
decoder: com.example.SimpleDecoder # 解码器
contract: com.example.SimpleContract # Contract 配置
对所有的 FeignClient 进行配置(两种方式)
- 第一种方式是通过默认配置类来配置 @EnableFeignClients 注解有一个 defaultConfiguration 属性, 可以自定义一个 DefaultFeignConfiguration.java 类来配置 @SpringBootApplication @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 第二种方式是通过配置文件来配置. 配置文件的优先级高于配置类, 也就是说, 配置文件的属性会覆盖配置类 feign: client: config: default: connectTimeout: 5000 # 连接超时时间 readTimeout: 5000 # 读超时间 loggerLevel: basic # 日志级别
FeignClient 开启日志
Feign 为每一个 FeignClient 都提供了一个 feign.Logger实例.有两种方式.
第一种是配置文件加上 java 代码, 分为两步:
- 在 application.yaml 或者 application.properties 中配置日志输出 logging: level: com.deepflow.clients.api.*: debug # feignClient 接口所在的路径
- 通过 java 代码的方式在程序入口的地方配置日志 Bean(也可以通过创建 @Configuration 注解的类配置日志 Bean) import feign.Logger; // Logger.Level 具体级别 // NONE: 不记录任何信息 // BASIC: 仅记录请求方法、URL以及响应的头信息 // HEADERS: 除了记录BASIC 信息外, 还记录请求和响应的头信息 // FULL: 记录所有请求与响应的明细, 包括头信息、请求体、元数据 @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }
第二种方式, 纯配置方式
feign:
client:
config:
default:
loggerLevel: full # 日志级别
logging:
level:
com.deepflow.clients.api.*: debug # feign 接口所在的路径
Feign 超时设置
Feign 的调用分为两层, 即 Ribbon 的调用和 Hystrix 的调用, 高版本的 Hystrix 是默认关闭的
Ribbon 的配置
ribbon.ReadTimeout: 120000
ribbon.ConnectTimeout: 30000