1.1 简介
1.1.1 概述
Feign 旨在使编写 Java Http 客户端变得更容易。在使用 Ribbon RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign 在 Ribbon 基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用 Spring cloud Ribbon 时,自动封装服务调用客户端的开发量。与 Ribbon 不同的是,通过 Feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用 Feign 已经停止维护,OpenFeign 是 Spring Cloud 在 Feign 的基础上进一步开发出来替代 Feign 的技术,支持了 SpringMVC 的注解,如 @RequesMapping 等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
1.1.2 相关依赖
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 简单使用
1.2.1 基础工程
☞ eureka 项目
1.2.2 Feign 客户端
代码语言:javascript复制/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/11/5
* @description Feign 接口
*/
@Component
@FeignClient("ProviderServer") // 服务提者名称
public interface ProviderFeign {
@GetMapping("/provider/get") // 服务地址
public String get();
}
1.2.3 启动类
代码语言:javascript复制@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
1.2.4 调用服务
我们可以发现 Feign 自带负载均衡配置,而 OpenFeign 默认支持 Ribbon,我们可以通过 Ribbon 的配置来修改负载均衡策略。Ribbon 详情参考 ☞ Spring Cloud 系列之负载均衡 Ribbon
1.3 其他配置
1.3.1 超时控制
代码语言:javascript复制# 设置 feign 客户端超时时间, 默认 1s
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
# OpenFeign 默认支持 Ribbon,也可以使用以下配置
ribbon:
# 建立连接所用时间,适用于网络正常的情况下,两端连接所用的时间
ConnectTimeout: 5000
# 建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 5000
1.3.2 数据压缩
代码语言:javascript复制feign:
compression:
request:
# 开启数据压缩请求
enabled: true
# 压缩数据类型
mime-types: text/xml, application/xml, application/json
# 数据压缩下限 2048表示传输数据大于2048 才会进行数据压缩(最小压缩值标准)
min-request-size: 2048
# 开启数据压缩响应
response:
enabled: true
1.3.3 日志配置
☞ 日志级别
♞ NONE
:不开启日志(默认)
♞ BASIC
:记录请求方法、URL、响应状态、执行时间
♞ HEADERS
:在 BASIC 基础上增加请求/响应头
♞ FULL
:在 HEADERS 基础上增加 body 和请求元数据
☞ 配置类
代码语言:javascript复制@Configuration
public class LogConfig {
@Bean
Logger.Level loggerLevel(){
return Logger.Level.FULL;
}
}
☞ 配置文件
代码语言:javascript复制logging:
level:
# 以什么级别监控那个接口
com.software.controller: debug
☞ 输出
☞ 源码