持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
Feign是一个声明式的web服务客户端,它使编写web服务客户端更加简单。
使用Feign需要创建一个接口并注释,具有可插拔的注解支持,还支持可插拔的编码器和解码器。
Spring Cloud增加了对Spring MVC注解的支持,Spring Web默认使用HttpMessageConverters支持。
Spring Cloud集成了Ribbon、Eureka、Spring Cloud LoadBalancer以便在使用Feign时提供负载均衡的http客户端。
组成部分
接口 | 描述 | 默认实现类 |
---|---|---|
Client | 线程安全的HTTP请求处理 | LoadBalancerFeignClient |
FeignLoadBalancer | extends LoadBalancerContext |
核心逻辑
类 | 描述 |
---|---|
FeignAutoConfiguration | [自动配置类],初始化HTTP连接池 |
HttpClientFeignConfiguration | [自动配置类],初始化HTTP连接池 |
CachingSpringLoadBalancerFactory | Feign负载均衡工厂类,带缓存 |
源码分析
使用
1. 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<exclusions>
<exclusion>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.7.4</version>
</dependency>
2. 配置
配合ribbon一起使用时,HttpClient连接池配置会覆盖ribbon的配置
feign:
httpclient:
# 开启HttpClient连接池
enabled: true
# 禁用SSL验证,默认false
disable-ssl-validation: false
# 允许自动重定向,默认true
follow-redirects: false
# 整个连接池的最大连接数
max-connections: 200
# 每个route默认的最大连接数
max-connections-per-route: 50
# 持久连接的最大生存时间(秒)
time-to-live: 900
# 获取连接超时时间(毫秒)
connection-timeout: 2000
# 关闭连接线程轮询时间间隔(毫秒)
connection-timer-repeat: 3000
# 压缩模块
compression:
request:
# 开启压缩,条件满足则追加Header(Content-Encoding: gzip, deflate)
enabled: true
# 支持的类型,默认text/xml,application/xml,application/json
mime-types: text/xml,application/xml,application/json
# 开启压缩的最小请求内容大小,默认2048byte
min-request-size: 2048
response:
# 开启响应压缩
enabled: true
# 使用gzip压缩
useGzipDecoder: true
# 客户端配置(可以按clientName单独配置,default为全局默认)
client:
default:
connectTimeout: 5000
readTimeout: 30000
# 控制日志级别none/basic/headers/full,默认none
loggerLevel = basic
demo-service:
connectTimeout: 5000
readTimeout: 30000
3. 代码
启动类
@SpringBootApplication
@EnableFeignClients
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
配置类
@Configuration
public class RestTemplateConfiguration {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
业务调用类
@RestController
@Slf4j
public class Demo1Controller {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/user/get")
public User userGet(@RequestParam("name") String name) {
return userService.get(name);
}
}