Ribbon負載均衡的使用
1、什麼是Ribbon
Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用。Spring Cloud Ribbon雖然只是一個工具類框架,它不像服務註冊中心、配置中心、API網關那樣需要獨立部署,但是它幾乎存在於每一個Spring Cloud構建的微服務和基礎設施中。包括Feign提供的聲明式服務嗲用也是基於該Ribbon實現的。
Ribbon默認提供7種負載均衡算法
- 輪詢策略(默認)
- 權重輪詢策略
- 隨機策略
- 最少併發策略
- 重試策略
- 可用性敏感策略
- 區域敏感策略
如果以上七種算法都不滿足需求,還可以自定義負載均衡算法
2、Ribbon的作用是什麼
Ribbon提供了一套適用於微服務的負載均衡解決方案。
3、負載均衡不同方案的區別
目前業界主流的負載均衡方案可以分爲兩類
- 集中式負載均衡(服務器負載均衡)
- 進程式負載均衡(客戶端負載均衡,Ribbon就屬於該方案)
3.1、集中式負載均衡
集中式負載均衡既是在Consumer和provider之間使用獨立的負載均衡設置(硬件或者軟件),由該設置負責把訪問請求通過某種策略轉發只provider。
3.2、進程內負載均衡
將負載均衡邏輯集成到Consumer,Consumer從服務註冊中心貨值有哪些地址可以使用,然後自己再從這些地址中選擇出一個適合的Provider。Ribbon就屬於這種,它只是一個雷虎,集成與Consumer進程,Consumer通過它來獲取Provider的地址。
4、負載均衡策略
4.1、輪詢策略(默認)
ClassName:RoundRobinRule
實現原理:按照順序依次獲取,每次都獲取下一個,循環。
4.2、權重輪詢策略
ClassName:WeightedResponseTimeRule
實現原理:根據每個Provider的相應時間分配一個權重,相應時間越長,權重越小,被選中的可能性就越低。一開始爲輪詢策略,並開啓一個計時器,每30秒收集一次每個Provider的平均響應時間,當信息足夠時,給每個Provider附上一個權重,並按權重隨機選擇Provider,權重越高的Provider會被高概率選中。
4.3、隨機策略
ClassName:RandomRule
實現原理:從Provider中隨機選取一個。
4.4、最少併發數策略
ClassName:BestAvailableRule
實現原理:選在請求中併發量最小的Provider,排除熔斷的Provider。
4.5、重試策略
ClassName:RetryRule
實現原理:輪詢策略的增強版,區別在於,輪詢策略當服務器不可用時,不會做任何處理,而重試策略在服務不可用時會重新嘗試集羣中的其他節點。
4.6、可用性策略
ClassName:AvailabilityFilteringRule
實現原理:過濾掉性能差的Provider,過濾掉Eureka中處於一直連接失敗的Provide。過濾掉高併發的Provider。
4.7、區域敏感策略
ClassName:ZoneAvoidanceRule
實現原理:以一個區域爲單位,一旦這個這個區域中的服務出現不可用,則丟棄整個區域,從其他區域中選取可用的Provider。如果這個IP區域中有一個或多個實例不可達或響應變慢,都會降低該區域內其他IPs被選中的權重。
5、使用
5.1、入門使用
Provider02添加依賴
Eureka中包含Ribbon依賴
<!-- 項目依賴 -->
<dependencies>
<!-- netflix eureka client 依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- spring boot web 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok 依賴 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- spring boot actuator 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- spring boot test 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Provider配置文件
多個Provider之間端口不可重複。但是應用名稱要一致。
server:
port: 7070 # 端口
spring:
application:
name: service-provider # 應用名稱(集羣下相同)
# 配置 Eureka Server 註冊中心
eureka:
instance:
prefer-ip-address: true # 是否使用 ip 地址註冊
instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port
client:
service-url: # 設置服務註冊中心地址
defaultZone: http://root:123456@localhost:8761/eureka/,http://root:123456@localhost:8762/eureka/
# 度量指標監控與健康檢查
management:
endpoints:
web:
exposure:
include: shutdown # 開啓 shutdown 端點訪問
endpoint:
shutdown:
enabled: true # 開啓 shutdown 實現優雅停服
配置完成,默認就是輪詢策略。
5.2、指定其他負載均衡策略
Ribbon是進程內負載均衡,所以需要在Consumer中進行指定要使用的負載均衡策略。
5.2.1、全局
在啓動類中或配置類中注入負載均衡策略對象,則所有的服務在請求時均使用該策略。
// IOC容器注入RandomRule
// RandomRule輪詢策略
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
5.2.2、局部
修改配置文件指定服務的負載均衡策略
# service-provider是服務的名稱
service-provider:
ribbon:
# 指定負載均衡策略類名
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
6、點對點直連
在開發中,每次測試都從註冊中心獲取服務,比較麻,所以可以直接繞過註冊中心,直連服務提供者獲取服務。這種就叫做點對點直連。
添加修改依賴
註釋掉Consumer原有的Eureka依賴,添加Ribbon依賴
<!-- netflix eureka server 依賴 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
修改Consumer配置文件
# service-provider是服務的名稱
service-provider:
ribbon:
# 指定負載均衡策略類名
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# Provider服務列表,多個服務之間使用,分隔
listOfServers: http://localhost:7070,http://localhost:7071
# 關閉Eureka實現Ribbon點對點直連
ribbon:
eureka:
enabled: false # false關閉