Ribbon 是 Netflix 下的負載均衡項目,在集群中為各個客戶端的通信提供支持,主要實現中間層應用程序的負載均衡,提供以下特性:
- 負載均衡器,可支持插拔式的負載均衡規則
- 對多種協議提供支持,例如HTTP、TCP
- 集成了負載均衡功能的客戶端
Ribbon 可以與 Eureka 服務注冊中心整合使用,並且被整合到 Spring Cloud Netflix 子項目中。Ribbon 主要有三大模塊,模塊說明如下:
- ribbon-core:該模塊為Ribbon項目的核心,主要包括負載均衡器接口定義、客戶端接口定義、內置的負載均衡實現等API
- ribbon-eureka:為 Eureka 客戶端提供的負載君均衡實現類
- ribbon-httpclient:對 Apache 的 HttpClient 進行封裝,該模塊提供了含有負載均衡功能的 REST 客戶端
Ribbon 的負載均衡器主要是與集群中的各個服務器進行通信,因此負載均衡器需要提供維護服務器IP、DNS名稱等信息、根據特定邏輯在服務器列表中循環的功能,為了實現這些功能 Ribbon 的負載均衡器提供了以下三大模塊:
- Rule:該組件用於處理從服務器列表中選擇那個服務器實例
- Ping:該組件主要用定時器來確保服務器網絡可以連接
- ServerList:服務器列表,可以通過靜態的配置確定負載的服務器,也可以動態指定服務器列表,如果動態指定服務器列表,則會有后台線程來刷新該列表
在使用 Ribbon 時,可以使用配置也可以使用代碼設置配置項,需要使用代碼來設置配置項,示例代碼如下:
ConfigurationManager.getConfigInstance()
.setProperty("MyRibbonClient.ribbon.listOfServers","localhost:8080,localhost:8002");
如果希望使用配置文件來設置項,在 src/main/resources 目錄創建 properties 文件,並在文件中增加配置項,格式如下:
<client>.<namespace>.<property>=<value>
其中,<client> 表示為客戶的名稱,聲明配置屬於那個客戶端,在使用 ClientFactory 時可傳入客戶端的名稱來獲取對應的實例;<namespace>為該配置的命名空間,默認為 ribbon;<property>為屬性名;<value>為屬性值;如果希望對全部客戶端生效,則配置格式如下:
<namespace>.<property>=<value>
Ribbon使用示例
-
創建項目
創建 maven 項目,命名為 ribbon-client,並增加 ribbon 依賴,POM.xml 內容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lixue</groupId>
<artifactId>ribbon-client</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.7.4</version>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-loadbalancer</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-core</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
</project>
-
增加配置文件
在 src/main/resources 目錄創建 ribbon-client.properties 文件,並增加配置項,配置如下:
MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002
-
增加測試類
package org.lixue.ribbon.client;
import com.netflix.client.ClientFactory;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
public class RibbonClient{
public static void main(String[]args)throwsException{
ConfigurationManager.loadCascadedPropertiesFromResources("ribbon-client");
ILoadBalancerloadBalancer=ClientFactory.getNamedLoadBalancer("MyRibbonClient");
Irule chooseRule=new RoundRobinRule();
chooseRule.setLoadBalancer(loadBalancer);
for(inti=0;i<10;i++){
Server server=chooseRule.choose(null);
System.out.println("request"+server.getHostPort());
}
}
}
-
測試驗證
啟動項目,我們代碼獲取了10次的服務器,地址分別為 localhost:8080 和 localhost:8002 ,通過輸出結果可以發現,使用了輪詢調度算法來選擇服務器,輸出結果如下:
request localhost:8002
request localhost:8080
request localhost:8002
request localhost:8080
request localhost:8002
request localhost:8080
request localhost:8002
request localhost:8080
request localhost:8002
request localhost:8080