Feign和Ribbon
Feign 和 Ribbon 是 Spring Cloud 的 Netflix 中提供的兩個實現軟負載均衡的組件,Ribbon 和 Feign 都是用於調用其他服務的,方式不同。Ribbon
可以在客戶端配置 RibbonServerList
(服務端列表),使用 HttpClient
或 RestTemplate
模擬 http 請求,步驟相當繁瑣。Feign 則是在 Ribbon 的基礎上進行了一次改進,采用接口的方式,將需要調用的其他服務的方法定義成抽象方法即可,不需要自己構建 http 請求,就像是調用自身工程的方法調用,而感覺不到是調用遠程方法,使得編寫客戶端變得非常容易。。不過要注意的是抽象方法的注解、方法簽名要和提供服務的方法完全一致。
要使用Feign,請創建一個接口並對其進行注釋。它具有可插入注釋支持,包括Feign注釋和JAX-RS注釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud添加了對Spring MVC注釋的支持,並支持使用HttpMessageConvertersSpring Web
中默認使用的注釋。Spring Cloud集成了Ribbon
和Eureka
以及Spring Cloud LoadBalancer
,以在使用Feign時提供負載平衡的http客戶端。
Feign能干什么
Feign 旨在使編寫 Java HTTP 客戶端變得更加容易。
前面在使用 Ribbon + RestTemplate 時, 利用 RestTemplate 請求的封裝處理,形成了一套模板化的調用方法。但是在實際開發中,對於服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常會針對每個微服務自行封裝一些客戶端類來包裝這些服務依賴的調用。所以,Feign 在此基礎上除了進一步封裝,由他來幫助我們定義和實現依賴服務接口的定義。在Feign 的實現下,我們只需要創建一個接口,並使用注解的方式來配置它(以前是Dao 接口上main標注 Mapper 注解,現在是一個微服務接口上面標注一個Feign 注解即可),即可完成對一個服務提供方的接口綁定,簡化了使用 Spring cloud Ribbon 時, 自動封裝服務調用客戶端。
Feign 集成了 Ribbon
利用 Ribbon 維護了服務方的服務列表信息,並且通過輪詢實現了客戶端的負載均衡,而 Ribbon 不同的是,通過Feign 只需要定義服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用。
Feign 與 OpenFeign 的區別
Feign
feign 是 spring cloud 組件中的一個輕量級 RESTful的HTTP 服務客戶端 Reign 內置了 Ribbon, 用來做客戶端服務在均衡,去調用服務注冊中心的服務,Feign 的使用方式是:使用Feign 注解自定義接口,調用這個接口,就可以低哦啊用服務注冊中心的服務。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
請注意,用上面這種方法導入依賴可能或報錯
我開始是按照這種方法導入的依賴,但是導入一直失敗,我以為是下載jar的過程中損壞了,在倉庫中刪除jar包之后重新下載還是不行。
后來我發現指定feign的版本號就能導入成功了,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
最新版本是1.4.7。
OpenFeign
openfeign 是 spring cloud 在 feign 的基礎上支持 spring mvc注解 ,如 @RequestMapping 等等,OpenFeign 的@FeignClient 可以解析Spring MVC 的 @RequestMapping注解下的接口,並通過動態代理的方式生產實現類 ,實現類中做負載均衡並且 低耦合調用其他服務。
導入方法:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>