帶有Netflix Ribbon的Spring Cloud Rest Client簡介

1.簡介

Netflix Ribbon是一個進程間通信(IPC)雲庫。 Ribbon主要提供客戶端負載平衡算法。

除了客戶端負載平衡算法外,Ribbon還提供其他功能:

  • 服務發現集成–功能區負載平衡器在動態環境(如雲)中提供服務發現。功能區庫中包含與Eureka和Netflix服務發現組件的集成
  • 容錯– Ribbon API可以動態確定服務器是否已在實時環境中啟動並運行,並可以檢測到那些已關閉的服務器
  • 可配置的負載平衡規則– Ribbon支持RoundRobinRuleAvailabilityFilteringRuleWeightedResponseTimeRule ,還支持定義自定義規則

Ribbon API基於稱為“命名客戶端”的概念工作。在應用程序配置文件中配置Ribbon時,我們為負載平衡所包含的服務器列表提供名稱。

讓我們一起旋轉一下。

2.依賴管理

通過將以下依賴項添加到我們的pom.xml:可以將Netflix Ribbon API添加到我們的項目中pom.xml:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>

 </dependency>

最新的庫可以在 這裡找到。

3.示例應用

為了了解Ribbon API的工作RestTemplate ,我們使用Spring RestTemplate構建了一個示例微服務應用程序,並通過Netflix Ribbon API和Spring Cloud Netflix API對其進行了增強。

我們將使用Ribbon的負載平衡策略之一WeightedResponseTimeRule ,在我們的應用程序中啟用2個服務器之間的客戶端負載平衡,這兩個服務器在配置文件中的命名客戶端下定義。

4.功能區配置

Ribbon API使我們能夠配置負載均衡器的以下組件:

  • Rule –邏輯組件,用於指定我們在應用程序中使用的負載均衡規則
  • Ping –一個組件,用於指定我們用來實時確定服務器可用性的機制
  • ServerList –可以是動態的也可以是靜態的。在我們的例子中,我們使用服務器的靜態列表,因此我們直接在應用程序配置文件中定義它們

讓我們為該庫編寫一個簡單的配置:

public class RibbonConfiguration {



 @Autowired

 IClientConfig ribbonClientConfig;



 @Bean

 public IPing ribbonPing(IClientConfig config) {

 return new PingUrl();

 }



 @Bean

 public IRule ribbonRule(IClientConfig config) {

 return new WeightedResponseTimeRule();

 }

 }

注意,我們如何使用WeightedResponseTimeRule規則確定服務器,並使用PingUrl機制實時確定服務器的可用性。

根據此規則,將根據每個服務器的平均響應時間為其分配權重,響應時間越短,權重就越小。該規則隨機選擇服務器,可能性由服務器的權重確定。

然後PingUrl將對每個URL進行ping操作,以確定服務器的可用性。

5. application.yml

以下是我們為此示例應用程序創建的application.yml配置文件:

spring:

 application:

 name: spring-cloud-ribbon



 server:

 port: 8888



 ping-server:

 ribbon:

 eureka:

 enabled: false

 listOfServers: localhost:9092,localhost:9999

 ServerListRefreshInterval: 15000

在上面的文件中,我們指定了:

  • 應用名稱
  • 應用程序的端口號
  • 指定服務器列表的客戶端:“ ping服務器”
  • 通過將eureka: enabled設置為false來禁用Eureka服務發現組件
  • 定義了可用於負載平衡的服務器列表,在這種情況下,為2台服務器
  • 使用ServerListRefreshInterval配置服務器刷新率

6. RibbonClient

現在,我們設置主要的應用程序組件片段–在這裡,我們使用RibbonClient而不是普通的RestTemplate啟用負載平衡:

@SpringBootApplication

 @RestController

 @RibbonClient(

 name = "ping-a-server",

 configuration = RibbonConfiguration.class)

 public class ServerLocationApp {



 @LoadBalanced

 @Bean

 RestTemplate getRestTemplate() {

 return new RestTemplate();

 }



 @Autowired

 RestTemplate restTemplate;



 @RequestMapping("/server-location")

 public String serverLocation() {

 return this.restTemplate.getForObject(

 "http://ping-server/locaus", String.class);

 }



 public static void main(String[] args) {

 SpringApplication.run(ServerLocationApp.class, args);

 }

 }

我們定義了帶有註釋@RestController的控制器類;我們還使用@RibbonClient為類@RibbonClient了名稱和配置類。

我們在此處定義的配置類與之前定義的類相同,在該類中,我們為此應用程序提供了所需的Ribbon API配置。

注意,我們還用@LoadBalanced註釋了RestTemplate ,這表明我們希望這是負載均衡的,在本例中是Ribbon。

7.功能區中的故障恢復能力

正如我們在本文前面所討論的那樣,Ribbon API不僅提供了客戶端負載平衡算法,而且還內置了故障恢復能力。

如前所述,Ribbon API可以通過定期對服務器進行定期ping操作來確定服務器的可用性,並具有跳過不活動服務器的功能。

除此之外,它還實現了斷路器模式以根據指定的標準過濾掉服務器。

斷路器模式通過迅速拒絕失敗的服務器請求而無需等待超時,從而最大程度地降低了服務器故障對性能的影響。我們可以通過將屬性niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped設置為false來禁用此斷路器功能。

當所有服務器都關閉時,因此沒有服務器可用於處理請求, pingUrl()將失敗,並且我們收到異常java.lang.IllegalStateException並顯示消息“No instances are available to serve the request”

8.結論

在本文中,我們討論了Netflix Ribbon API及其在簡單示例應用程序中的實現。

可以在GitHub存儲庫上找到上述示例的完整源代碼。