分享

Spring Cloud OpenFeign 动态Url

 竹林湘馆 2021-05-15

版权声明:本文为CSDN博主「markix」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_31772441/article/details/102531862



划重点:文中提到的 Spring Cloud OpenFeign 和 OpenFeign 不是同一个东西!!!

关于区别:简单来讲 Spring Cloud OpenFeign 是基于 OpenFeign 进行包装,集成了 SpringMVC的注解等方便SpringBoot项目开发的一个组件。

OpenFeign github地址、文档

Spring Cloud OpenFeign github地址、官方主页 、官方文档

近期需要通过http调用一个url地址可能会发生变化的第三方api接口,由于之前使用过OpenFeign,自然想到用Feign来实现,而项目又是SpringCloud项目,再自然的想到了使用 Spring Cloud OpenFeign来实现。

简单概括就是:使用Spring Cloud OpenFeign实现 动态url的接口请求

其实之前就试过OpenFeign实现动态的url请求,相关分享在 跳转链接。 具体实现就是在接口方法加上 URI参数,该URI参数会动态替换掉原有的url。

而在Spring Cloud OpenFeign中,实现思路基本等同于OpenFeign,不过由于Spring Cloud OpenFeign集成了众多组件(ribbon、hystrix),所以相关配置还是有很多不同。

示例

maven依赖

客户端代码

逐个解析下相关细节:

接口方法的定义使用了SpringMVC的注解 @GetMapping、@RequestParam,其实SpringMVC的其他注解在此处都是支持的。(有其他文章提到也支持OpenFeign原有的注解@RequestLine、@Param等,但博主实测是不支持的,相关解析类为 feign.Contract,这个存疑)

在使用方式上,OpenFeign需要手动构建代理对象,Spring Cloud OpenFeign 不同于 OpenFeign, Spring Cloud OpenFeign 帮我们自动生成了接口的代理对象(即实现类),并且注册到Spring中,我们可以很方便的使用 @Autowired 注入代理对象然后使用。其默认的代理对象是 LoadBalancerFeignClient。还有一个代理对象是 feign.Client.Default。两者区别在于:

LoadBalancerFeignClient 通过服务名(下文提到)从Eureka查找相关的节点地址url,发起调用。

feign.Client.Default 仅是简单的直接调用。

@FeignClient(name = "ThirdPartyAPI", url = "http://10.1.2.3:8080")

name 属性是 @FeignClient 注解必要的!不定义时会报错,其默认指代Eureka上的服务名。

url 属性,这是重点了! url属性指定什么值其实不重要,因为最终都会被方法的URI参数值替换掉,它在这里另一个重要的作用,就是将接口的代理对象变成feign.Client.Default(上文提到默认是LoadBalancerFeignClient),这样就绕过了从Eureka取节点地址这一步,毕竟第三方的地址不可能注册到我们的Eureka上。(相关细节可自行debug FeignClientFactoryBean.getTarget())

总结一下关键点:

@FeignClient 注解需要指定其 url 属性(值不重要)!

接口方法定义增加 URI类型的参数!

接口方法定义SpringMVC的注解

使用@Autowired 注入代理对象可直接调用

end

————————————————

版权声明:本文为CSDN博主「markix」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_31772441/article/details/102531862

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多