SpringCloud:Ribbon(負載均衡、負載均衡的策略)

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();
  }
}

 



 

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