(二)SpringCloud之Ribbon負載均衡

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關閉
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章