Feign
Feign 是一个声明式的 REST客户端,它能让 REST 调用更加简单
Feign 供了 HTTP 请求的模板,通过 接口 、注解的形式,定义好 HTTP 参数
示例
大致流程概述:
- 消费者 引入依赖
- 消费者 启动器类 添加注解
@EnableFeignClients
- 消费者 创建 服务客户端接口 (用于访问请求的
- 消费者 创建 新的controller (用于测试 步骤3访问可行
-
消费者
pom.xml
<!-- Feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
消费者 启动类,添加注解
@EnableFeignClients
@SpringCloudApplication @EnableFeignClients // 启动 feign功能 public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean // Ribbon 启动负载均衡 @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
-
消费者 创建Feign客户端,以接口形式存在
//标识 Feign客户端 @FeignClient("user-service") public interface UserClient { // http://user-service/user/1 (前提:该url可访问 @GetMapping("user/{id}") User queryById(@PathVariable ("id")Long id); }
- 该接口主要作用是 无需手动拼接 url,通过注释进行拼接url(不同方法都有各自的拼接结果
-
@FeignClient
注释的value需要指定 服务名称
-
消费者 创建新的 controller
ConsumerFeignController类
@RestController @RequestMapping("cf") public class ConsumerFeignController { @Autowired private UserClient client; @GetMapping ("{id}") public User queryById(@PathVariable Long id) { return client.queryById(id); } }
用于测试接口访问
-
测试
访问 http://localhost:8080/cf/1 (代码以上篇文章为基础,因此访问IP一样
Feign-Ribbon
Ribbon主要用于配置请求时长、重新访问等相关配置
Feign本身集成了 Ribbon依赖 和 自动配置(无需再次配置Ribbon
由于自动配置的缘故,我们只需关注主要的配置信息
配置 | 值 (默认) | 说明 |
---|---|---|
ribbon.ConnectTimeout |
int (1000ms) | 连接超时时长 (两端连接最长时长,超出则超时) |
ribbon.ReadTimeout |
int (1000ms) | 请求处理超时时长 (连接后读取资源最长时长,超出则超时)! |
ribbon.MaxAutoRetries |
int (0) | 对请求的失败重试次数 |
ribbon.MaxAutoRetriesNextServer |
int (1) | 对请求失败重试换节点次数 |
ribbon.OkToRetryOnAllOperations |
boolean (false) | 是否对所有的请求方式都重试 |
支持 全局配置 或 单个服务配置
以上参数自行在浏览器测试
Feign-Hystrix
Feign 默认也集成 Hystrix依赖
详细了解:04Spring Cloud 熔断器Hystrix
应用说明:
- 默认是关闭Hystrix ,需要手动配置Hystrix打开
- 需要为 Feign客户端 注解添加降级服务的指定类
- 需要为 Feign客户端 编写falback作为降级处理
示例
在以上代码基础上进行编辑测试
-
启动Hystrix。消费者 配置启动
# feign-hystrix feign : hystrix : # 熔断器打开 enabled : true
-
降级服务模板。为 Feign客户端 创建 Fallback模板
// 为UserClient接口 Fallback降级服务 @Component @Slf4j public class UserClientFallback implements UserClient{ @Override public User queryById(Long id) { User user = new User(); user.setId(id); user.setName("用户异常"); log.error("访问拥堵!{}",id); return user; } }
-
@Component
注解 自动扫描对象 (添加容器自动注入的应用 - 实现 指定服务的接口
-
-
Feign客户端 降级服务。注解 fallback值:需要指定Fallback模板类
//标识 Feign客户端 (添加 Fallback降级服务 @FeignClient(value = "user-service",fallback = UserClientFallback.class) public interface UserClient { // http://user-service/user/1 @GetMapping("user/{id}") User queryById(@PathVariable ("id")Long id); }
-
测试
- 依次打开 Eureka、server、consumer 三个服务
- 浏览器访问 http://localhost:8080/cf/1 (访问成功
- 关闭 server 再次访问以上请求
- 再次访问以上链接,会返回 降级的fallback模板
Feign-日志
Feign日志 专门记录 请求/响应 的信息
Level级别
Level级别 会根据不同的配置,分别记录不同的信息
Level级别 | 说明 |
---|---|
NONE (默认) |
不记录任何信息 |
BASIC |
只记录请求方法,URL以及响应状态码、执行时间 |
HEADERS |
在BASIC的基础上,额外记录 请求/响应 头信息 |
FULL |
记录 请求/响应 明细信息(请求头、请求体、元数据) |
应用说明:
- Feign日志 需要在指定包下配置 日志级别
- Feign客户端 也需添加注解 configuration值 指定 Feign日志配置类
示例
-
配置日志级别。消费者 配置 日志级别
debug
# 日志级别 logging : level : com.sans : debug
-
创建 Feign日志配置类 。消费者 创建 Feign日志配置类 指定 level级别
package com.sans.config; // 配置类 @Configuration public class FeignConfig { /* 请求级别: - NONE:不记录任何信息(默认值) - BASIC:只记录请求方法,URL以及响应状态码、执行时间 - HEADERS:在BASIC的基础上,额外记录 请求/响应 头信息 - FULL:记录 请求/响应 明细信息(请求头、请求体、元数据) * */ @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
-
接口注释。消费者 Feign客户端
@FeignClient
注解 configuration值 添加 Feign日志配置类@FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class) public interface UserClient { // http://user-service/user/1 @GetMapping("user/{id}") User queryById(@PathVariable ("id")Long id); }
-
测试
- 依次打开 Eureka、server、consumer 三个服务
- 浏览器访问 http://localhost:8080/cf/1 (访问成功
- 查看控制台日志
http压缩
Feign 也支持 请求/响应 进行GZIP压缩,减少传输性能损耗
需要手动启动 配置示例:
feign :
# 日志 请求/响应 分别启动
compression:
request:
# 开启请求压缩
enabled: true
# 设置压缩的数据类型 (默认)
mime-types: text/html,application/xml,application/json
# 设置触发压缩的大小下限 (默认)
min-request-size: 2048
response:
# 开启响应压缩
enabled: true
以上配置除了 压缩 启动,其他应用默认值即可