1、概念
LB,即負載均衡(Load Balance),在微服務或分佈式集羣中經常用的一種應用。負載均衡簡單的說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA。Ribbon是客戶端的負載均衡算法。
2、Ribbon負載均衡的使用
(1)配置
- 在消費者模塊添加依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 配置application.xml:添加Eureka的服務註冊地址
eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 在配置類添加註解:該註解能夠實現在客戶端的負載均衡
@Configuration public class ConfigBean { @Bean @LoadBalanced public RestTemplate template(){ return new RestTemplate(); } }
- 在主啓動類添加EnableEurekaClient註解
通過微服務的名稱訪問已經註冊進Eureka的微服務:直接通過微服務的名稱訪問,前提是該服務已經註冊進了Eureka
@RestController public class DeptConsumerController { private static final String REST_URL_PREFIX = "PROVIDER"; @Autowired private RestTemplate restTemplate;
(2)負載均衡
- 新建與提供者(8001)相同的兩個模塊,配置pom.xml、核心配置文件中要保證三個提供者對外暴露的名字相同
spring: application: name: provider
- 新建數據庫,每一個服務的提供者都連接到不同的數據庫
- 測試
先啓動80端口(消費者)的服務,消費者通過服務的名稱來獲取服務,因爲8001、8002、8003配置中的服務的名稱是相同的,將三個服務的提供者註冊進Eureka,Eureka是一個集羣,消費者可以從集羣中獲取提供者提供的服務。
在消費中配置Ribbon的負載均衡以後,消費者獲取到的服務是按順序獲取的,並不是每次獲取到同一個服務(輪詢算法,默認)。
3、Ribbon的組件IRule
(1)分類
RoundRobinRule:輪詢,默認
RandomRule:隨機
AvailabilityFilteringRule:會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,還有併發的連接數量超過閾值的服務,然後對剩餘的服務列表按照輪詢策略進行訪問
WeightedResponseTimeRule:根據平均響應時間計算所有服務的權重,響應時間越快服務權重越大被選中的概率越高。剛啓動時如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠,會切換到
RetryRule:先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗則在指定時間內會進行重試,獲取可用的服務
BestAvailableRule:會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
ZoneAvoidanceRule:默認規則,複合判斷server所在區域的性能和server的可用性選擇服務器
(2)使用
@Configuration public class ConfigBean { @Bean @LoadBalanced public RestTemplate template(){ return new RestTemplate(); } @Bean public IRule myRule(){ return new RandomRule(); } }
在消費者的配置類中配置即可
(3)自定義負載均衡策略
在啓動類上面添加註解:
@RibbonClient(name="PROVIDER",configuration=MySelfRule.class)
定義配置類,配置類中的方法返回的是自定義策略類的對象:
@Configuration public class MySelfRule { @Bean public IRule myRule() { return new RandomRule_ZY(); } }