版權聲明:本文為CSDN博主「markix」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。 原文鏈接: https://blog.csdn.net/qq_31772441/article/details/102531862劃重點:文中提到的 Spring Cloud OpenFeign 和 OpenFeign 不是同一個東西?。?! 關于區(qū)別:簡單來講 Spring Cloud OpenFeign 是基于 OpenFeign 進行包裝,集成了 SpringMVC的注解等方便SpringBoot項目開發(fā)的一個組件。 OpenFeign github地址、文檔 Spring Cloud OpenFeign github地址、官方主頁 、官方文檔 近期需要通過http調用一個url地址可能會發(fā)生變化的第三方api接口,由于之前使用過OpenFeign,自然想到用Feign來實現(xiàn),而項目又是SpringCloud項目,再自然的想到了使用 Spring Cloud OpenFeign來實現(xiàn)。 簡單概括就是:使用Spring Cloud OpenFeign實現(xiàn) 動態(tài)url的接口請求 其實之前就試過OpenFeign實現(xiàn)動態(tài)的url請求,相關分享在 跳轉鏈接。 具體實現(xiàn)就是在接口方法加上 URI參數(shù),該URI參數(shù)會動態(tài)替換掉原有的url。 而在Spring Cloud OpenFeign中,實現(xiàn)思路基本等同于OpenFeign,不過由于Spring Cloud OpenFeign集成了眾多組件(ribbon、hystrix),所以相關配置還是有很多不同。 示例 maven依賴 客戶端代碼 逐個解析下相關細節(jié): 接口方法的定義使用了SpringMVC的注解 @GetMapping、@RequestParam,其實SpringMVC的其他注解在此處都是支持的。(有其他文章提到也支持OpenFeign原有的注解@RequestLine、@Param等,但博主實測是不支持的,相關解析類為 feign.Contract,這個存疑) 在使用方式上,OpenFeign需要手動構建代理對象,Spring Cloud OpenFeign 不同于 OpenFeign, Spring Cloud OpenFeign 幫我們自動生成了接口的代理對象(即實現(xiàn)類),并且注冊到Spring中,我們可以很方便的使用 @Autowired 注入代理對象然后使用。其默認的代理對象是 LoadBalancerFeignClient。還有一個代理對象是 feign.Client.Default。兩者區(qū)別在于: LoadBalancerFeignClient 通過服務名(下文提到)從Eureka查找相關的節(jié)點地址url,發(fā)起調用。 feign.Client.Default 僅是簡單的直接調用。 @FeignClient(name = "ThirdPartyAPI", url = "http://10.1.2.3:8080") name 屬性是 @FeignClient 注解必要的!不定義時會報錯,其默認指代Eureka上的服務名。 url 屬性,這是重點了! url屬性指定什么值其實不重要,因為最終都會被方法的URI參數(shù)值替換掉,它在這里另一個重要的作用,就是將接口的代理對象變成feign.Client.Default(上文提到默認是LoadBalancerFeignClient),這樣就繞過了從Eureka取節(jié)點地址這一步,畢竟第三方的地址不可能注冊到我們的Eureka上。(相關細節(jié)可自行debug FeignClientFactoryBean.getTarget()) 總結一下關鍵點: @FeignClient 注解需要指定其 url 屬性(值不重要)! 接口方法定義增加 URI類型的參數(shù)! 接口方法定義SpringMVC的注解 使用@Autowired 注入代理對象可直接調用 end ———————————————— 版權聲明:本文為CSDN博主「markix」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_31772441/article/details/102531862 |
|