Eureka微服務之間呼叫-feign

wp136470發表於2020-01-01

之前的文章介紹了RestTemplate+Ribbon實現Eureka微服務之間的呼叫,微服務之間呼叫一

今天我們來進行第二種呼叫方式:feign。

Feign簡介

之前使用的RestTemplate+Ribbon雖然也可以實現,但是呢,如果URL複雜很多的話,這樣的方式就比較難維護;這個時候我們可以考慮下其他方式使用。

Feign是Netflix開發的宣告式、模板化的HTTP客戶端,可以幫我們更加便捷、優雅的呼叫Http請求。SpringCloud對Feign進行了增強,並整合了Ribbon和Eureka,從而讓Feign的使用更加方便。

Feign的使用很簡單,它的使用方法是定義一個介面,然後在上面新增註解,同時也支援JAX-RS標準的註解,程式碼就完成了。聽上去確實很簡單,那具體使用又是如何的呢?

Feign的使用

前面的我們還是依舊保持不變,只不過消費端需要更改,我們之前使用的式RestTemplate+Ribbon,這個時候我們移除依賴包,並且刪除該程式碼。

pom檔案:

<!-- add feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!--遮蔽ribbon-->
<!--<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>-->

啟動類中:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //add feignClient
public class DemoApplication {

    /*@Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }*/
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

接下來我們需要建立一個介面,並且使用@FeignClient註解:

@FeignClient(name = "eurekaClientTest-provider")
public interface ConsumerService {

    @RequestMapping(value = "/api/getPrice", method = RequestMethod.POST)
    public String getPrice(@RequestBody String name);
}

@FeignClient:原始碼會掃描這個註解載入其配置等;

該註解中的name是提供者的Client名稱,這個名稱是已經註冊到Eureka上,因為Feign已經整合了Ribbon,所以會自動幫我們解析該服務名稱為具體的地址,並且實現了負載均衡的功能。

@RequestMapping:為提供者一樣的介面名稱和Http method;

消費者的controller層修改如下:

@RestController
@RequestMapping("consume")
public class ConsumerController {

    @Resource
    private ConsumerService consumerService;


    @PostMapping("testFeign")
    public Object getTest() {
        String price = consumerService.getPrice("eurekaClientTest-consumer");
        return price;
    }

}

這樣我們啟動EurekaServer,EurekaClient-provider1,EurekaClient-provider2,EurekaClient-consumer.

訪問consumer的地址:

多次訪問該方法發現,看不出來負載均衡的實現。為了能夠看明白負載均衡的功能,我們將provider的日誌更改;

再重新啟動之後多次訪問,日誌確實是不同的。

如此看,Feign的使用是不是異常簡單。

總結一下Feign的原理,從我們的例子上來看其工作原理:

啟動類增加的@EnableFeignClients會進行包掃描,掃描所有 @FeignClients 的註解的類,並將這些資訊注入 Spring IOC 容器中。當定義的 Feign 介面中的方法被呼叫時,通過JDK的代理的方式,來生成具體的 RequestTemplate。當生成代理時,Feign 會為每個介面方法建立一個 RequetTemplate 物件,該物件封裝了 HTTP 請求需要的全部資訊,如請求引數名、請求方法等資訊都是在這個過程中確定的。
然後由 RequestTemplate 生成 Request,然後把 Request 交給 Client 去處理,這裡指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最後 Client 被封裝到 LoadBalanceclient 類,這個類結合 Ribbon 負載均衡發起服務之間的呼叫。

那Feign具體實現又是如何?Feign的其他用法介紹?我們下章繼續。

相關文章