服务调用组件OpenFeign实战
2025-02-26 14:51:29 0 举报
AI智能生成
服务调用组件OpenFeign实战,分享给大家学习。 更多干货内容,欢迎关注我的公众号:Fox爱分享
作者其他创作
大纲/内容
课程目标
掌握OpenFeign的使用和扩展配置,能根据业务需求扩展配置OpenFeign
理解OpenFeign的调用流程
怎么学
没接触过微服务的同学一定要先把《轻松玩转微服务:新手入门Spring Cloud Alibaba》这节课跟一遍
学习顺序:Nacos注册中心——>LoadBalancer——>OpenFeign
课上代码
项目地址
git切换到nacos-teach分支,选择 tag v2.2.1 (完整版)
基础回顾
为什么要使用OpenFeign
LoadBalancer+RestTemplate进行微服务调用存在缺陷
代码可读性差,编程体验不统一
参数复杂时URL难以维护
是什么
官方文档
OpenFeign是Spring Cloud框架中集成的声明式HTTP客户端工具
OpenFeign可以让远程调用服务达到像本地调用方法一样的体验。
怎么用
以会员服务调用订单服务为例
课堂演示代码:git切换到nacos-teach分支,选择 tag v2.2.0
1)引入依赖
会员服务(服务调用者)引入OpenFeign依赖
注意:需要引入loadbalancer依赖
2)在启动类上添加@EnableFeignClients注解,开启openFeign功能
3)编写OpenFeign客户端,配置订单服务(服务提供者)接口
4)会员服务发起调用,像调用本地方式一样调用订单服务
openFeign接口方法编写规范
在编写OpenFeign接口方法时,需要遵循以下规范
1.接口中的方法必须使用@RequestMapping、@GetMapping、@PostMapping等注解来声明HTTP请求的类型。
2.方法的参数可以使用@RequestParam、@RequestHeader、@PathVariable等注解来指定如何传递HTTP请求的参数。
3.可以使用@RequestBody来指定如何传递请求体中的参数。
4.可以使用@HeaderMap来传递头部信息。
案例演示
GET请求
GET请求,参数全放URL中,不建议放BODY,部分浏览器可能会限制不读取body中的数据;
GET请求参数过长的话,也会有问题,适用于参数不长的场景;
GET请求参数过长的话,也会有问题,适用于参数不长的场景;
目标接口方法
OpenFeign接口方法
post请求
@RequestBody
目标接口方法
OpenFeign接口方法
url后面追加参数
目标接口方法
OpenFeign接口方法
url中加参数
目标接口方法
OpenFeign接口方法
openFeign的调用流程
openFeign常用扩展点配置实战
openFeign 提供了很多的扩展机制,让用户可以更加灵活的使用。
测试环境
会员服务调用订单服务
日志配置
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
配置方式
Java Bean
全局生效
利用@Configuration实现全局生效,对所有的微服务调用者都生效
1)定义一个配置类,指定日志级别
4种日志级别
2) 在application.yml中配置 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径=debug"
3) 测试:分别选择BASIC和FULL级别日志,查看控制台输出
局部生效
让指定的微服务生效,在@FeignClient 注解中指定configuration
注意:此时配置类就不能添加@Configuration注解
yml配置文件
全局生效
配置 {服务名} 为 default
对所有的微服务调用者都生效
局部生效
配置 {服务名} 为 具体服务名
对调用的微服务提供者进行配置
这两种配置方式掌握一种即可,建议在yml中配置,可以利用配置中心对配置进行统一管理
测试日志配置是否生效
调整日志级别为FULL或BASIC,访问localhost:8050/user/getOrder?userId=fox,查看控制台输出
超时时间配置
OpenFeign使用两个超时参数
connectTimeout 可以防止由于较长的服务器处理时间而阻塞调用者。
readTimeout 从连接建立时开始应用,当返回响应花费太长时间时触发。
补充说明: OpenFeign的底层用的是LoadBalancer,但超时时间以OpenFeign配置为准
配置方式
Java Bean
yml配置文件
测试超时配置是否生效
利用Thread.sleep修改订单接口的调用时间,验证是否超时
契约配置(了解即可)
Spring Cloud 在 Feign 的基础上做了扩展,可以让 Feign 支持 Spring MVC 的注解来调用。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是 SpringMvcContract。
配置方式
Java Bean
yml配置文件
注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原生的注解
OrderFeignService 中配置使用Feign原生的注解
客户端组件配置
Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,没有连接池,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient5,OkHttp。
Feign发起调用真正执行逻辑:feign.Client#execute (扩展点)
配置Apache HttpClient5(推荐)
1)引入依赖
2)修改yml配置,启用Apache HttpClient5 ,引入依赖后是默认启用的,可以忽略
关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration
测试:调用会进入feign.hc5.ApacheHttp5Client#execute
配置 OkHttp
1)引入依赖
2)修改yml配置,将 Feign 的 HttpClient 禁用,启用 OkHttp
关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration
测试:调用会进入feign.okhttp.OkHttpClient#execute
GZIP 压缩配置
开启压缩可以有效节约网络资源,提升接口性能,我们可以配置 GZIP 来压缩数据
yml配置
关于配置可参考源码:org.springframework.cloud.openfeign.encoding.FeignAcceptGzipEncodingAutoConfiguration
编码器解码器配置
Feign 中提供了自定义的编码解码器设置,同时也提供了多种编码器的实现,比如 Gson、Jaxb、Jackson。我们可以用不同的编码解码器来处理数据的传输。如果你想传输 XML 格式的数据,可以自定义 XML 编码解码器来实现,或者使用官方提供的 Jaxb。
扩展点:feign.codec.Encoder & feign.codec.Decoder
配置方式
引入依赖
Java Bean
yml配置文件
拦截器配置
通过拦截器实现参数传递
常用场景:统一添加 header 信息
比如向服务提供者传递全局事务XID,会员ID, 认证token令牌,链路追踪的traceID等等
扩展点: feign.RequestInterceptor
每次 feign 发起http调用之前,会去执行拦截器中的逻辑。
自定义拦截器实现认证逻辑
需求场景
微服务调用链路需要传递请求头的token信息
如果不做任何配置,直接使用openFeign在服务间进行调用就会丢失请求头
解决方案
方案1:增加接口参数
毫无疑问,这方案不好,因为对代码有侵入,需要开发人员每次手动的获取和添加接口参数,因此舍弃
方案2:添加拦截器
1) 代码实现拦截器
2)配置拦截器生效
方式1:Java Bean
方式2: yml配置文件
测试:postman中增加请求头参数Authorization,查看会员服务openFeign日志是否有Authorization信息

收藏

收藏
0 条评论
下一页