Spring Cloud Feign原理詳解


目錄

1.什么是Feign?

2.Open Feign vs Spring Cloud Feign

2.1.OpenFeign

2.2.Spring Cloud Open Feign 

3.Spring Cloud Feign 的使用

4.Spring Cloud Feign 的源碼解析


1.什么是Feign?

Feign 的初衷是:feign makes writing java http clients easier ,可以理解為一個Http Client。

只不過這個http client 對http 請求進行了一個封裝。后面我們會講到它的一個工作方式就是處理注解,封裝參數,放入到一個Http請求模板,並能解析返回的結果。

2.Open Feign vs Spring Cloud Feign

2.1.OpenFeign

OpenFeign 是最原始,最早的feign。與Spring 無關。就是一個Java的組件,封裝了對http請求和響應的處理。

它的具體demo可以參考 Readme.txt

2.2.Spring Cloud Open Feign 

Spring Cloud 中的微服務都是以Http 接口的形式向外提供服務。

提供Http 服務的形式有多種:

  • JDK 原生的URLConnction
  • Apache 的HttpClient
  • Spring 的RestTemplate

Spring Cloud 對Feign 也進行了增強,直接支持Hystrix 和 Ribbon,也支持SpringMVC 的注解。這樣使得Feign 的使用非常方便。

3.Spring Cloud Feign 的使用

在Spring Cloud 1.XX 系列版本中,feign 沒有被單獨拿出來,而是放在spring-cloud-netflix 下面。依賴的pom是:


    
    
   
   
           
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-feign</artifactId>
  4. </dependency>

而到了Spring Cloud 2.XX 系列版本后,feign 成為了Spring Cloud 下的一級項目,項目地址是:

https://spring.io/projects/spring-cloud-openfeign

依賴的pom是:


    
    
   
   
           
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

一定要注意的版本的兼容性,否則項目會啟動不了。很多錯誤都有可能是這種版本不兼容導致的。

現在的版本兼容狀況可以參考:https://spring.io/projects/spring-cloud

Table 1. Release train Spring Boot compatibility
Release Train Boot Version

Greenwich

2.1.x

Finchley

2.0.x

Edgware

1.5.x

Dalston

1.5.x

上面的兩個pom中,都沒有寫明version,這是因為使用Spring Cloud 都會集成dependencyManagement。這里會指定Spring-Cloud的版本。那它下面的組件版本就會和它保持一致


    
    
   
   
           
  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>Finchley.SR2</version>
  7. < type>pom</ type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

a.首先要在主類上增加注解@EnableFeignClients


    
    
   
   
           
  1. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
  2. @EnableEurekaClient
  3. @EnableFeignClients
  4. public class ConsumerApp
  5. {
  6. public static void main( String[] args )
  7. {
  8. SpringApplication.run(ConsumerApp.class,args);
  9. }
  10. }

b.聲明一個調用Feign的接口,可以指定服務,接口參數,接口地址,請求方法等


    
    
   
   
           
  1. @FeignClient("producer-1")
  2. public interface ConsumerFeignClient {
  3. @GetMapping("/getProducerUser")
  4. String getProducerUser();
  5. }

c.服務提供者接口編寫


    
    
   
   
           
  1. @GetMapping("/getProducerUser")
  2. public String getProducerUser(){
  3. log.info( "8004 producer-1 getUser");
  4. return "8004 producer-1";
  5. }

d.將接口注入到調用處使用


    
    
   
   
           
  1. @Autowired
  2. private ConsumerFeignClient consumerFeignClient;
  3. @GetMapping("/getProducerUser")
  4. public String getProducerUser(){
  5. log.info( "consumer getProducerUser");
  6. return consumerFeignClient.getProducerUser();
  7. }

這樣就可以完成Feign 的整個調用了。

可以看到,Spring Cloud Feign 是從 Open Feign發展而來,又集成了很多自己的東西,比如對@RequestMapping,@GetMapping等的支持。

另外需要注意:

Open Feign 模式是開啟Retry(重試)機制的,而Spring Cloud Feign 默認是不開啟Retry 的,但支持配置打開。

4.Spring Cloud Feign 的源碼解析

Feign的原理步驟可以理解為:

a.通過主類上的EnableFeignClients 注解開啟FeignClient;

b.根據Feign 的規則實現接口,並加上FeignClient注解,供調用的地方注入調用;

c.程序啟動后,會掃描所有FeignClient 注解的類,並將這些信息注入到IOC 容器中;

d.當b中接口被調用時,通過jdk代理,以及反射(Spring處理注解的方式),來生成具體的RequestTemplate

e.RequestTemplate 生成Reqest

f.Request 交給httpclient處理,這里的httpclient 可以是OkHttp,也可以是HttpUrlConnection 或者HttpClient

g.最后Client被封裝到LoadBalanceClient類,這個類結合Ribbon 實現負載均衡

參考:

深入理解Feign之源碼解析

feign client 淺談

快速使用Spring Cloud Feign作為客戶端調用服務提供者


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM