帶有Netflix Ribbon的Spring Cloud Rest Client簡介
1.簡介
Netflix Ribbon是一個進程間通信(IPC)雲庫。 Ribbon主要提供客戶端負載平衡算法。
除了客戶端負載平衡算法外,Ribbon還提供其他功能:
- 服務發現集成–功能區負載平衡器在動態環境(如雲)中提供服務發現。功能區庫中包含與Eureka和Netflix服務發現組件的集成
- 容錯– Ribbon API可以動態確定服務器是否已在實時環境中啟動並運行,並可以檢測到那些已關閉的服務器
- 可配置的負載平衡規則– Ribbon支持
RoundRobinRule
,AvailabilityFilteringRule
,WeightedResponseTimeRule
,還支持定義自定義規則
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存儲庫上找到上述示例的完整源代碼。