Ribbon
一:Eureka
- Eureka是Netflix開發的服務發現框架,SpringCloud將它集成在自己的子項目spring-cloud-netflix中,實現SpringCloud的服務發現功能。Eureka包含兩個組件:Eureka Server和Eureka Client。
- Eureka Client是一個java客戶端,用於簡化與Eureka Server的交互,客戶端同時也就別一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啓動後,將會向Eureka Server發送心跳,默認週期爲30秒,如果Eureka Server在多個心跳週期內沒有
接收到某個節點的心跳,Eureka Server將會從服務註冊表中把這個服務節點移除(默認90秒)。 - Eureka Server之間通過複製的方式完成數據的同步,Eureka還提供了客戶端緩存機制,即使所有的Eureka Server都掛掉,客戶端依然可以利用緩存中的信息消費其他服務的API。綜上,Eureka通過心跳檢查、客戶端緩存等機制,確保了系統的高可用性、靈活性和可伸縮性。
1.1 依賴項
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaserver</artifactId>
</dependency>
</dependencies>
1.2 配置文件
server:
port: 6868 #服務端口
eureka:
client:
registerWithEureka: false #是否將自己註冊到Eureka服務中,本身就是所有無需
註冊
fetchRegistry: false #是否從Eureka中獲取註冊信息
serviceUrl: #Eureka客戶端與Eureka服務端進行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka/
1.3 啓動類
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
啓動運行啓動類,然後在瀏覽器地址欄輸入 http://localhost:6868/ 運行效果
1.4 服務註冊
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eurekaclient</
artifactId>
</dependency>
eureka:
client:
service‐url:
defaultZone: http://localhost:6868/eureka
@EnableEurekaClient
修改每個服務類的啓動類,添加註解@EnableEurekaClient
二:簡介
Ribbon負載均衡項目。
主要包括三個子模塊:
- ribbon-core:核心,主要負責均衡器接口定義、客戶端接口定義、內置的負載均衡實現等API
- ribbon-eureka:爲Eureka客戶端提供的負載均衡實現類
- ribbon-httpclient:對Apache的HttpClient進行封裝,提供含有負載均衡功能的REST客戶端
1.1負載均衡器組件
負載均衡器需要提供以下的功能:
- 維護服務器的IP、DNS名稱等信息
- 根據特定的邏輯在服務列表中循環
爲了實現以上的基本功能,Ribbon的負載均衡器有以下三個大子模塊
3. Rule:一個邏輯組件,這些邏輯將會決定從服務器列表中返回哪個服務器實實例
4. Ping: 該組件主要使用定時器來確保服務器網絡可以連接
5. ServerList:服務器列表,可以通過靜態的配置確定負載的服務器,也可以動態制定服務器列表。
1.2 Ribbon負載均衡機制
Ribbon提供了幾個負載均衡的組件,爲了讓請求轉給合適的服務器處理
1.2.1 負載均衡器
Ribbon的負載均衡器藉口定義了服務器的操作,主要的目的用於進行服務器選擇
eg:BaseLoadBalancer
1.2.2 自定義負載規則
如果想自定義負載均衡規定,需要編寫一個IRule接口的實現類
public class MyRule implements IRule{
}
1.2.3 Ribbon自帶的負載規則
- RoundRobinRule:系統默認的規則,通過簡單的輪詢服務列表來選擇服務器,其他規則在很多情況下仍使用RoundRobinRule
- AvailabilityFilteringRule: 該規則會忽略以下的服務器
- 無法連接的服務器
- 併發數過高的服務器
1.2.4ping機制
在負載均衡器中,提供了 Ping 機制,每隔一段時間,會去 Ping 服務器,判斷服務器是否存活,該工作由 com.netflix.loadbalancer.IPing 接口的實現類負責,如果單獨使用 Ribbon 默認情況下不會激活 Ping 機制,默認的實現類爲 DummyPing(不驗證)
package org.lixue.ribbon.client;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.Server;
public class MyPing implements IPing{
public boolean isAlive(Serverserver){
System.out.println("isAlive"+server.getHostPort());
return true;
}
}
修改 src/main/resources 目錄下的 ribbon-client.properties 配置如下:
#配置服務器列表
MyRibbonClient.ribbon.listOfServers=localhost:8080,localhost:8002
#配置負載均衡規則IRule的實現類
MyRibbonClient.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.WeightedResponseTimeRule
#配置負載均衡實現類
MyRibbonClient.ribbon.NFLoadBalancerClassName=com.netflix.loadbalancer.ZoneAwareLoadBalancer
#配置IPing的實現類
MyRibbonClient.ribbon.NFLoadBalancerPingClassName=org.lixue.ribbon.client.MyPing
#配置Ping操作的間隔
MyRibbonClient.ribbon.NFLoadBalancerPingInterval=2
加入@LoadBalanced註解口,一個RestTemplate實例就具有了負載均衡能力