Eureka微服務之間呼叫-feign
之前的文章介紹了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的其他用法介紹?我們下章繼續。
相關文章
- SpringBoot+Eureka註冊中心+Feign進行微服務之間呼叫Spring Boot微服務
- Eureka的微服務之間呼叫微服務
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- 微服務呼叫元件 Feign微服務元件
- 微服務互相呼叫-Feign微服務
- eureka服務之間呼叫(3)
- [jaeger] 四、微服務之呼叫鏈(Feign+SpringCloud)微服務SpringGCCloud
- eureka實現服務之間的呼叫
- SpringCloud微服務(基於Eureka+Feign+Hystrix+Zuul)SpringGCCloud微服務Zuul
- Eureka實現微服務的呼叫微服務
- 微服務之間的相互呼叫微服務
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- Eureka-實現微服務的呼叫微服務
- springcloud 微服務 之 Eureka 配置SpringGCCloud微服務
- 微服務之springcloud eureka(一)微服務SpringGCCloud
- eureka踩過的坑之註冊服務相互之間呼叫
- 微服務之Eureka服務發現微服務
- 微服務學習小結-Eureka如何實現註冊中心,以及服務之間的註冊、呼叫微服務
- 初識Spring Cloud Eureka(三)(Eureka客戶端之間 服務的相互呼叫)SpringCloud客戶端
- 129、springcloud-eureka-client微服務的互相呼叫SpringGCCloudclient微服務
- 微服務之間的呼叫方式哪種最佳?微服務
- 還在用Feign?推薦一款微服務間呼叫神器,跟SpringCloud絕配!微服務SpringGCCloud
- 【Spring Cloud】Eureka實現微服務釋出與呼叫SpringCloud微服務
- SpringCloud之服務提供與呼叫(Ribbon,Feign)SpringGCCloud
- 二、Spring Cloud 之旅 -- Eureka 微服務的釋出與呼叫SpringCloud微服務
- 微服務架構 | 4.2 基於 Feign 與 OpenFeign 的服務介面呼叫微服務架構
- SpringCloud系列之使用Feign進行服務呼叫SpringGCCloud
- SpringCloud之使用Feign跨服務呼叫最佳方式SpringGCCloud
- 微服務通訊之feign的配置隔離微服務
- 微服務通訊之feign整合負載均衡微服務負載
- ②SpringCloud 實戰:引入Feign元件,發起服務間呼叫SpringGCCloud元件
- 難住了,微服務之間的呼叫方式哪種更優?微服務
- eureka如何管理服務呼叫
- 微服務實戰SpringCloud之Spring Cloud Feign替代HTTP Client微服務SpringGCCloudHTTPclient
- 呼叫註冊到eureka server上的微服務,通過微服務名字呼叫,獲取服務例項慢或者失敗的問題Server微服務
- .NET Core微服務開發服務間呼叫篇-GRPC微服務RPC
- 微服務通訊之feign的註冊、發現過程微服務
- 微服務架構之「 呼叫鏈監控 」微服務架構