SpringCloud系列之四---Ribbon負載均衡使用

前言

本篇主要介紹的是SpringCloud中的負載均衡(Ribbon)功能的實現以及使用Feign結合Ribbon實現負載均衡,Ribbon適合RPC的遠程調用。

GitHub源碼鏈接位於文章底部。

一、工程

首先需要創建四個工程,包括一個轉發請求的客戶端,兩個接收請求的服務端,以及eureka註冊中心。

二、配置

1.導入依賴

springcloud-ribbon-eureka作爲eureka註冊中心,因此需要添加eureka的服務端依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

其他三個工程需要註冊到eureka中,相對於eureka來說是客戶端,因此添加以下依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
2.配置

springcloud-ribbon-eureka

server:
  port: 8100

spring:
  application:
    name: eureka-server

#eureka基本配置信息
eureka:
  client:
    service-url:
      #Eureka 客戶端與 Eureka 服務端進行交互的地址
      defaultZone: http://127.0.0.1:${server.port}/eureka
    #是否將自己註冊到Eureka服務中,本身就是註冊中心所以無需註冊
    register-with-eureka: false
    #是否從Eureka中檢索註冊信息,本身就是註冊中心所以無需檢索
    fetch-registry: false
  server:
    # 測試時關閉自我保護機制,保證不可用服務及時踢出
    enable-self-preservation: false
    ##剔除失效服務間隔
    eviction-interval-timer-in-ms: 2000

springcloud-ribbon-client

spring:
  application:
    name: springcloud-ribbon-client
server:
  port: 8000
eureka:
  client:
    service-url:
      #Eureka 客戶端與 Eureka 服務端進行交互的地址
      defaultZone: http://127.0.0.1:8100/eureka

springcloud-ribbon-server1

spring:
  application:
    name: springcloud-ribbon-server
server:
  port: 8001
eureka:
  client:
    service-url:
      #Eureka 客戶端與 Eureka 服務端進行交互的地址
      defaultZone: http://127.0.0.1:8100/eureka

springcloud-ribbon-server2

spring:
  application:
    name: springcloud-ribbon-server
server:
  port: 8002
eureka:
  client:
    service-url:
      #Eureka 客戶端與 Eureka 服務端進行交互的地址
      defaultZone: http://127.0.0.1:8100/eureka
3.配置類

在springcloud-ribbon-client中添加ribbon配置類,第一個方法是啓動負載均衡,第二個方法是選擇負載均衡策略,如果不寫,默認爲輪詢策略。負載均衡策略的種類在文末貼出。

@Configuration
public class RibbonConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    public IRule ribbonRule() {
        //隨機負載
        return new RandomRule();
    }
}

三、測試代碼

在server1中添加一個接口接收請求

@RestController
public class RibbonController {
	@RequestMapping("/ribbon")
    public String index(@RequestParam String name) {
        return name+",Hello World! 這裏是server1!!";
    }
}

在server2中添加一個接口接收請求

@RestController
public class RibbonController {
	@RequestMapping("/ribbon")
    public String index(@RequestParam String name) {
        return name+",Hello World! 這裏是server2!!";
    }
}

在client中添加一個接口發送請求,遠程調用的地址是springcloud-ribbon-server加上接口名,springcloud-ribbon-server是由配置文件中的spring.application.name決定的。

@RestController
public class RibbonController {
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/ribbon")
    public String ribbon(@RequestParam String name) {
        //進行遠程調用
        return restTemplate.getForObject("http://springcloud-ribbon-server/ribbon/?name="+name, String.class);
    }
}

依次啓動eureka,server,client,訪問客戶端接口,轉發到兩個server。輸入 localhost:8000/ribbon/?name=lxg 轉發到兩個server多刷新幾次會有變化,輪詢機制由配置類決定。

四、第二種方式-整合Feign進行遠程調用

在client中添加依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

添加remote的interface

@FeignClient(name = "springcloud-ribbon-server")
public interface RibbonRemote {
    @RequestMapping(value = "/ribbon")
    public String ribbon(@RequestParam(value = "name") String name);
}

在controller中添加方法

    @Autowired
    private RibbonRemote ribbonRemote;
    @RequestMapping("/ribbon/{name}")
    public String ribbonFeign(@PathVariable("name") String name) {
        //進行遠程調用
        return ribbonRemote.ribbon(name);
    }

注意:要在啓動類上加上Feign啓動註解

然後訪問localhost:8000/ribbon/lxg 轉發到兩個server多刷新幾次會有變化,輪詢機制由配置類決定。

五、負載均衡策略

策略名 策略描述 實現說明
BestAvailableRule 選擇一個最小的併發請求的server 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server
AvailabilityFilteringRule 過濾掉那些因爲一直連接失敗的被標記爲circuit tripped的後端server,並過濾掉那些高併發的的後端server(active connections 超過配置的閾值) 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status裏記錄的各個server的運行狀態
WeightedResponseTimeRule 根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。 一個後臺線程定期的從status裏面讀取評價響應時間,爲每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成status時,使用roubine策略選擇server。
RetryRule 對選定的負載均衡策略機上重試機制。 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
RoundRobinRule roundRobin方式輪詢選擇server 輪詢index,選擇index對應位置的server
RandomRule 隨機選擇一個server 在index上隨機,選擇index對應位置的server
ZoneAvoidanceRule 複合判斷server所在區域的性能和server的可用性選擇server 用性選擇server 使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用於過濾掉連接數過多的Server

本文GitHub源碼:https://github.com/lixianguo5097/springcloud/tree/master/springcloud-ribbon

CSDN:https://blog.csdn.net/qq_27682773
簡書:https://www.jianshu.com/u/e99381e6886e
博客園:https://www.cnblogs.com/lixianguo
個人博客:https://www.lxgblog.com

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