Spring Cloud中使用Feign實現負載均衡--RandomRule


前面幾篇文章,對 Ribbon 負載均衡做了詳細的分析,這一節來介紹一下使用 Feign 負載均衡。在介紹之前,我們先來對 Feign 做一下簡單的介紹,先來理解一下什么是 Feign。

1. Feign 是什么?
我們看一下官方的解釋:Feign 是一個聲明式 WebService 客戶端。使用 Feign 能讓編寫的 WebService 客戶端更加簡潔,它的使用方法式定義一個接口,然后在上面添加注解。Spring Cloud 對 Feign 進行了封裝,使其支持了 Spring MVC 標准注解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支持負載均衡。

2. 為什么要使用 Feign?
Feign 旨在使編寫 Java Http 客戶端變得更容易。

前面在使用 Ribbon + RestTemplate 時,利用 RestTemplate 對 http 請求的封裝處理,形成了一套模板化的調用方法。但是在實際開發中,由於對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。

所以,Feign 在此基礎上做了進一步的封裝,由它來幫助我們定義和實現依賴服務接口的定義。使用 Feign 只需要創建一個接口並使用一個注解來配置它即可。這就類似於我們在 dao 層的接口上標注 @Mapper 注解一樣。這樣的話,即完成了對服務提供方的接口綁定,簡化了使用 Spring Cloud Ribbon 時的開發量。

我們用實例來說明。

3. Feign 的使用
3.1 依賴導入
<!--eureka Client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign的支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.2 啟動類注解配置
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderConsumerFeign {

public static void main(String[] args) {
SpringApplication.run(OrderConsumerFeign.class, args);
}
}

啟動類需要添加注解 @EnableFeignClients,表示啟用 Feign 客戶端。

3.3 Feign 客戶端
我們先來回憶一下,提供訂單的服務名稱為:MICROSERVICE-ORDER,然后訂單服務中提供的兩個獲取訂單信息的接口url如下:

/**
* feign客戶端
* @author shengwu ni
*/
@FeignClient(value = "MICROSERVICE-ORDER")
public interface OrderClientService {

@GetMapping("/provider/order/get/{id}")
TOrder getOrder(@PathVariable(value = "id") Long id);

@GetMapping("/provider/order/get/list")
List<TOrder> getAll();
}

可以看到,Feign 客戶端要添加 @FeignClient 注解,value 屬性表示作用到哪個微服務上,這里表示負載均衡作用到請求訂單服務上。要記住,Feign 也是客戶端的負載均衡。

方法內定義了兩個接口,接口上即和普通的 SpringMVC 沒什么區別,url 即訂單提供服務的url。這就是 Feign 客戶端,通過注解 + 接口的方式來和訂單服務的接口綁定。

3.4 Feign 客戶端的使用
定義好了 Feign 客戶端接口后,我們就可以在代碼里通過 @Resource 正常引入進來,然后通過普通的方法調用即可實現對訂單服務的調用,如下:

@RestController
@RequestMapping("/consumer/order")
public class OrderConsumerController {

/**
* 上面定義的 Feign Client
*/
@Resource
private OrderClientService orderClientService;

@GetMapping("/get/{id}")
public TOrder getOrder(@PathVariable Long id) {
return orderClientService.getOrder(id);
}

@GetMapping("/get/list")
public List<TOrder> getAll() {
return orderClientService.getAll();
}
}

啟動 eureka 集群、三個訂單提供服務和這個帶有 Feign 的服務消費方(端口 9001)。通過在瀏覽器中訪問:http://localhost:9001//consumer/order/get/1 可以看到,輪流訪問三個訂單服務。說明 Feign 默認是集成了 Ribbon 的輪詢方案。

4. Feign 如何結合 Ribbon 切換均衡算法
以上就是 Feign 的使用,很簡單,也符合我們平時的接口調用習慣。但是這是默認的輪詢負載均衡算法。在上一節我們知道,Ribbon 中支持很多自帶的均衡算法,我們只要在代碼中根據具體情況,選擇合適的均衡算法即可。甚至我們可以選擇自己自定義的均衡算法。

那么使用 Feign 的時候,如何去切換到 Ribbon 中其他均衡策略呢?甚至切換到自定義的策略呢?

也很簡單,我們可以在 application.yml 配置文件中來指定,如下:

# feign和ribbon結合,指定策略。feign默認的是輪詢的策略,這里的配置可以自定義
MICROSERVICE-ORDER:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

MICROSERVICE-ORDER 表示作用到哪個微服務,com.netflix.loadbalancer.RandomRule 即前面介紹 Ribbon 時里面的隨機策略,當然,我們也可以指定為其他策略,包括我們自己定義的,只要把相應的包路徑寫到這即可,很方便。

重新啟動一下服務消費方的程序,訪問上面那個測試 url,可以看到三個訂單服務是隨機調用的,說明配置生效。
————————————————
版權聲明:本文為CSDN博主「武哥聊編程」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/eson_15/article/details/86590402


免責聲明!

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



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