Feign | 简介
- Feign 是一个非常好用的 HTTP 客户端;
- Feign 很大程度上简化了 HTTP 调用的方式;
- Feign 很好的弥补了 Spring Cloud 的 HTTP 调用缺陷;
Feign 能干什么
- Feign 包含了多种 HTTP 的调用形式
- SpringMVC:
- 支持:@RequestMapping, @RequestParam, @RequestPathVariable, @RequestHeader, @RequestBody
- 不支持:@GetMethod, @PostMethod 等;
- SpringMVC:
- Feign 可以整合 Ribbon 和 Hystrix;
- Feign 提供了多种 HTTP 底层支持,比如 Apache HTTP Client、OkHttpClient 等;
Feign | 特性
- Feign 实现了可插拔的注解支持,包括 Feign 和 JAX-RS 注解;
- Feign 支持可插拔的 HTTP 编码器和解码器;
- Feign 支持 HTTP 请求和响应的压缩;
Feign | 相关问题
为什么 Feign 的使用,只需要定义接口就行?
- 底层使用动态代理实现了接口;
Feign 是如何支持在定义接口的时候使用 SpringMVC 的注解的?
- Contract 的默认实现是 SpringMvcContract;
- Feign 还支持其他的 Contract 的实现,但是都不如 SpringMvcContract 好用;
Feign | 整合 Ribbon
- @FeignClient 中的 name 填服务名,然后 url 不填,就算是整合了 Ribbon 了;
- Eureka Client 的依赖中就有了 Ribbon 的依赖了;
Feign | 整合 Hystrix
- application.yml;
feign:
hystrix:
enabled: true
- @FeignClient 中指定 fallback 或 fallbackFactory参数;
- 实现用于 Feign 调用的降级版接口实现,或 FallbackFactory 实现;
Feign | HTTP 性能优化
更换为 Apache HTTP Client
Feign 默认使用的是 JDK 自带的 HTTP 方式,这个东西连接池也没有,连接速率也不行;Feign 最大的优化点就是更换 HTTP 底层实现,Apache HTTP Client 是公认的最好的 HTTP 客户端实现;
- pom 依赖;
- application.yml;
解压缩
Feign 可以支持 Gzip 的请求解压缩;解压缩是一把双刃剑,谨慎使用;
- application.yml
Feign | API 继承 | backend-api
- 微服务的目标是大量复用,Feign 会导致重复工作量,比如下游服务的参数变更,所有上游服务的调用都要修改代码;
- Feign 提供了继承特性帮助我们解决这个问题;
- Feign 的接口继承最多只能有一层,切记多继承,虽然 Java 的接口继承可以多继承;
- 工程实践中,都会有一个 API 模块 backend-api,其中引入了 Feign,然后每个服务提供的接口,都定义在 backend-api 模块中;
- Consumer 在调用 Provider 提供的服务时,直接继承 backend-api 中的接口,然后加上 @FeignClient 注解;
Feign | 整合进 Provider 和 Consumer
- Provider 和 Consumer 的启动类上都要加注解 @EnableFeignClients;
- 定义接口,继承 backend-api 中的接口,然后加上 @FeignClient 注解;
- 需要服务调用的时候,直接调用自己服务中定义的,从 backend-api 中继承来的接口;
网友评论