Spring Cloud Feign服务之间的调用

时间:2022-07-25
本文章向大家介绍Spring Cloud Feign服务之间的调用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Spring Cloud Feign服务之间的调用

文章目录

从服务之间调用方式说起…

微服务架构时代, 服务之间的调用很频繁并且有多种方式, 可以通过 JDK 原生的 URLConnection, Apache 的 Http Client, Netty 的异步 Http Client 或者 Spring 的 RestTemplate 去实现服务间的调用. 但最优雅、最方便的还是Spring Cloud 的 Open Feign.

Feign 是一种声明式、模板化的 HTTP 客户端. 在 Spring Cloud 中使用 Feign, 可以做到使用 HTTP 调用远程服务就像调用本地方法一样.

Feign 的一些特性

  1. 支持 Ribbon 的负载均衡
  2. 支持 Hystrix 和它的 Fallback
  3. 支持 HTTP 请求和响应的压缩

Feign 工作原理

  1. 主程序入口处添加 @EnableFeignClients 注解, 定义的接口处添加 @FeignClients 注解
  2. 程序启动后, 会扫描被 @FeignClients 注解的接口, 并将这些信息注入到 Spring IOC 容器中. 调用接口方法的时候, Feign 会为每一个接口方法创建一个 RestTemplate 对象. 该对象封装了HTTP 请求的所有信息
  3. 然后RestTemplate 生成 Request, 然后把 Request 交给 Client (JDK 原生的 URLConnection、Apache 的 httpclient 或者是 OK http) 处理
  4. 最后 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 进行配置(两种方式)

  1. 第一种方式是通过默认配置类来配置 @EnableFeignClients 注解有一个 defaultConfiguration 属性, 可以自定义一个 DefaultFeignConfiguration.java 类来配置 @SpringBootApplication @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
  2. 第二种方式是通过配置文件来配置. 配置文件的优先级高于配置类, 也就是说, 配置文件的属性会覆盖配置类 feign: client: config: default: connectTimeout: 5000 # 连接超时时间 readTimeout: 5000 # 读超时间 loggerLevel: basic # 日志级别

FeignClient 开启日志

Feign 为每一个 FeignClient 都提供了一个 feign.Logger实例.有两种方式.

第一种是配置文件加上 java 代码, 分为两步:

  1. 在 application.yaml 或者 application.properties 中配置日志输出 logging: level: com.deepflow.clients.api.*: debug # feignClient 接口所在的路径
  2. 通过 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

Hystrix 的配置