溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中如何使用Feign 實(shí)現(xiàn)負(fù)載均衡

發(fā)布時(shí)間:2021-12-18 16:55:52 來(lái)源:億速云 閱讀:881 作者:柒染 欄目:互聯(lián)網(wǎng)科技

Spring Cloud中如何使用Feign 實(shí)現(xiàn)負(fù)載均衡,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

下面來(lái)介紹一下使用 Feign 負(fù)載均衡。在介紹之前,我們先來(lái)對(duì) Feign 做一下簡(jiǎn)單的介紹,先來(lái)理解一下什么是 Feign。

1. Feign 是什么?

我們看一下官方的解釋:Feign 是一個(gè)聲明式 WebService 客戶端。使用 Feign 能讓編寫(xiě)的 WebService 客戶端更加簡(jiǎn)潔,它的使用方法式定義一個(gè)接口,然后在上面添加注解。

Spring Cloud 對(duì) Feign 進(jìn)行了封裝,使其支持了 Spring MVC 標(biāo)準(zhǔn)注解和 HttpMessageConverters。Feign 可以與 Eureka 和 Ribbon 組合使用以支持負(fù)載均衡。

2. 為什么要使用 Feign?

Feign 旨在使編寫(xiě) Java Http 客戶端變得更容易。前面在使用 Ribbon + RestTemplate 時(shí),利用 RestTemplate 對(duì) http 請(qǐng)求的封裝處理,形成了一套模板化的調(diào)用方法。但是在實(shí)際開(kāi)發(fā)中,由于對(duì)服務(wù)依賴的調(diào)用可能不止一處,往往一個(gè)接口會(huì)被多處調(diào)用,所以通常都會(huì)針對(duì)每個(gè)微服務(wù)自行封裝一些客戶端類來(lái)包裝這些依賴服務(wù)的調(diào)用

所以,F(xiàn)eign 在此基礎(chǔ)上做了進(jìn)一步的封裝,由它來(lái)幫助我們定義和實(shí)現(xiàn)依賴服務(wù)接口的定義。使用 Feign 只需要?jiǎng)?chuàng)建一個(gè)接口并使用一個(gè)注解來(lái)配置它即可。

這就類似于我們?cè)?dao 層的接口上標(biāo)注 @Mapper 注解一樣。這樣的話,即完成了對(duì)服務(wù)提供方的接口綁定,簡(jiǎn)化了使用 Spring Cloud Ribbon 時(shí)的開(kāi)發(fā)量。我們用實(shí)例來(lái)說(shuō)明。

3. Feign 的使用

3.1 依賴導(dǎo)入

<!--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 啟動(dòng)類注解配置

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderConsumerFeign {

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

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

3.3 Feign 客戶端

我們先來(lái)回憶一下,提供訂單的服務(wù)名稱為:MICROSERVICE-ORDER,然后訂單服務(wù)中提供的兩個(gè)獲取訂單信息的接口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();
}

可以看到,F(xiàn)eign 客戶端要添加 @FeignClient 注解,value 屬性表示作用到哪個(gè)微服務(wù)上,這里表示負(fù)載均衡作用到請(qǐng)求訂單服務(wù)上。要記住,F(xiàn)eign 也是客戶端的負(fù)載均衡。

方法內(nèi)定義了兩個(gè)接口,接口上即和普通的 SpringMVC 沒(méi)什么區(qū)別,url 即訂單提供服務(wù)的url。這就是 Feign 客戶端,通過(guò)注解 + 接口的方式來(lái)和訂單服務(wù)的接口綁定。

3.4 Feign 客戶端的使用

定義好了 Feign 客戶端接口后,我們就可以在代碼里通過(guò) @Resource 正常引入進(jìn)來(lái),然后通過(guò)普通的方法調(diào)用即可實(shí)現(xiàn)對(duì)訂單服務(wù)的調(diào)用,如下:

@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();
   }
}

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

4. Feign 如何結(jié)合 Ribbon 切換均衡算法

以上就是 Feign 的使用,很簡(jiǎn)單,也符合我們平時(shí)的接口調(diào)用習(xí)慣。但是這是默認(rèn)的輪詢負(fù)載均衡算法。在上一節(jié)我們知道,Ribbon 中支持很多自帶的均衡算法,我們只要在代碼中根據(jù)具體情況,選擇合適的均衡算法即可。甚至我們可以選擇自己自定義的均衡算法。

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

也很簡(jiǎn)單,我們可以在 application.yml 配置文件中來(lái)指定,如下:

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

MICROSERVICE-ORDER 表示作用到哪個(gè)微服務(wù),com.netflix.loadbalancer.RandomRule 即前面介紹 Ribbon 時(shí)里面的隨機(jī)策略,當(dāng)然,我們也可以指定為其他策略,包括我們自己定義的,只要把相應(yīng)的包路徑寫(xiě)到這即可,很方便。

重新啟動(dòng)一下服務(wù)消費(fèi)方的程序,訪問(wèn)上面那個(gè)測(cè)試 url,可以看到三個(gè)訂單服務(wù)是隨機(jī)調(diào)用的,說(shuō)明配置生效。

看完上述內(nèi)容,你們掌握Spring Cloud中如何使用Feign 實(shí)現(xiàn)負(fù)載均衡的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI