Spring Cloud Feign的上手使用
Spring Cloud Feign
Feign 是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。
Feign 的特性
- 集成 Ribbon 的负载均衡功能
- 集成了 Hystrix 的熔断器功能
- 支持请求压缩
- 大大简化了远程调用的代码,同时功能还增强啦
- Feign 以更加优雅的方式编写远程调用代码,并简化重复代码
Spring Cloud Feign 作用
Feign
可以把HTTP
的请求进行隐藏,伪装成类似 SpringMVC
的 Controller
一样。你不用再自己拼接 url
,拼接参数等等操作,一切都交给 Feign
去做。
创建好了用户,订单,商品微服务,这三个微服务是互相隔离的,那么微服务和微服务之间如何互相调用呢,显然三个微服务都可以采用 http 通信,也就是 restTemplate
进行互相访问,但是这种方式对参数传递和使用都不是很方便,所以弃用此方式,采用 feign
进行服务之间的调用,可以简化调用流程,真正感觉到是在同一个项目中调用另一个类的方法
当我们通过RestTemplate
调用其它服务的 API 时,所需要的参数须在请求的 URL 中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下。
在开发 Spring Cloud 微服务的时候,我们知道,服务之间都是以 HTTP 接口的形式对外提供服务的,因此消费者在进行调用的时候,底层就是通过 HTTP Client 的这种方式进行访问。Spring 的 RestTemplate 去实现服务间的调用。但是最方便、最优雅的方式是通过 Spring Cloud Feign 进行服务间的调用。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient
注解。
快速上手
使用 Feign
替代 RestTemplate
发送 HTTP
请求。
1、导入依赖
在user-consumer
中添加spring-cloud-starter-openfeign
依赖
1 | <!--配置feign--> |
2、创建 Feign 客户端
在user-consumer
中创建com.atguigu.feign.UserClient
接口
1 | package com.atguigu.feign; |
Feign 会通过动态代理,帮我们生成实现类。
注解@FeignClient
声明 Feign 的客户端,注解 value 指明服务名称
接口定义的方法,采用 SpringMVC 的注解。Feign 会根据注解帮我们生成 URL 地址
注解@RequestMapping 中的/user,不要忘记。因为 Feign 需要拼接可访问地址
3、编写控制层
在user-consumer
中创建com.atguigu.controller.ConsumerFeignController
,在 Controller
中使用@Autowired
注入FeignClient
1 |
|
4、开启 Feign
修改user-consumer
的启动类,在启动类上添加@EnableFeignClients
注解,开启 Feign
1 |
|
浏览器请求:http://localhost:18082/feign/2
5、负载均衡
Feign 自身已经集成了 Ribbon,因此使用 Feign 的时候,不需要额外引入依赖
Feign 内置的 ribbon 默认设置了请求超时时长,默认是 1000ms,可以修改
ribbon 内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试可以关闭配置:
在 user-consumer
配置文件添加如下配置
1 | # 修改服务地址轮询策略,默认是轮询,配置之后变随机 |
6、熔断器支持
Feign 默认也有对 Hystrix 的集成
实现步骤:
- 在配置文件 application.yml 中开启 feign 熔断器支持
- 编写 FallBack 处理类,实现 FeignClient 客户端
- 在@FeignClient 注解中,指定 FallBack 处理类
① 开启 Hystrix
在 user-consumer
配置文件 application.yml
中开启 feign
熔断器支持:默认关闭
1 | feign: |
② 熔断降级类创建
修改user-consumer
,创建一个类com.atguigu.feign.fallback.UserClientFallback
,实现刚才编写的 UserClient,作为 FallBack 的处理类
1 |
|
③ 指定 Fallback 处理类
在@FeignClient 注解中,指定 FallBack 处理类
④ 测试
关闭服务消费方,浏览器请求:http://localhost:18082/feign/2
⑤ 请求压缩
SpringCloudFeign 支持对请求和响应进行 GZIP 压缩,以减少通信过程中的性能损耗。
user-consumer
通过配置开启请求与响应的压缩功能:(简单压缩)
1 | feign: |
也可以对请求的数据类型,以及触发压缩的大小下限进行设置(完整压缩)
1 | feign: |
⑥Feign 的日志级别配置
一般都是通过 loggin.level.xx=debug 来设置日志级别。然而这个对 Feign 客户端不会产生效果。因为@FeignClient 注解修饰的客户端在被代理时,都会创建一个新的 Feign.Logger 实例。我们需要额外通过配置类的方式指定这个日志的级别才可以。
实现步骤
- 在 application.yml 配置文件中开启日志级别配置
- 编写配置类,定义日志级别 bean
- 在接口的@FeignClient 中指定配置类
- 重启项目,测试访问
[1]普通日志等级配置
在user-consumer
的配置文件application.yml
中设置com.atguigu
包下的日志级别都为debug
1 | # com.atguigu 包下的日志级别都为Debug |
[2]Feign 日志等级配置
在user-consumer
中的 application 启动类com.atguigu.UserConsumerApplication
,定义日志级别
1 | /** |
[3]日志级别说明
Feign 支持 4 中级别:
NONE:不记录任何日志,默认值
BASIC:仅记录请求的方法,URL 以及响应状态码和执行时间
HEADERS:在 BASIC 基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
运行程序:http://localhost:18082/feign/2
即可看到每次访问的日志, 文件压缩
⑦Feign 工作原理
① 在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients
配置的扫描包路径。如果没配置,默认为启动类的包路径。
② 当程序启动时,会进行包扫描,扫描所有 @FeignClient
的注解的类,并将这些信息注入 Spring IOC
容器中。
③ 校验 @FeignClient
修饰的类,包括类必须是 interface
,以及@FeignClient
的fallback
及fallbackFactory
配置的必须是接口的实现类。
7、小结
Feign 的作用:不再使用拼接 URL 的方式实现远程调用,以接口调用的方式实现远程调用,简化了远程调用的实现方式,增强了远程调用的功能,例如:增加了负载均衡、熔断、压缩、日志启用。
Feign 的使用过程:引入 Feign 依赖包 ———> 创建 Feign 接口,feign 接口中需要指定调用的服务名字 ———> 使用
@EnabledFeignClients
启用 Feign 功能Feign 的负载均衡配置:在配置文件中配置{spring.application.name}:ribbon: 负载均衡属性配置
1 | user-provider: |
- Feign 的熔断配置:在 application.yml 中开启 Hystrix ———> 给 Feign 接口创建一个实现类 ———> 给 Feign 指定 fallback 类
- Feign 的压缩配置:在 application.yml 中指定压缩属性即可
- Feign 的日志配置:在 application.yml 中开启普通日志等级 ———> 创建一个类 ———> 定义 Feign 日志等级,在 Feign 接口中指定定义日志的配置