1. 程式人生 > >【SpringCloud】05—— Ribbon客戶端負載均衡

【SpringCloud】05—— Ribbon客戶端負載均衡

1.Ribbon 是什麼?
一套客戶端負載均衡工具.
舉例:視窗點餐,點餐時會分好幾個視窗,就是為了讓人員分攤到不同的視窗,來避免人員堆積,我們點餐的時候,作為客戶消費者會主動地選擇人員最少的視窗的去點餐.和客戶端結合實現負載均衡。

2.能做什麼?
負載均衡的工具,將使用者的請求分攤到多個伺服器上,從而達到高可用.,負載均衡演算法可以自定義.
LB整合到消費方,消費方通過Ribbon,從服務註冊中獲知哪些服務可用,然後根據演算法從這些可用的地址中選擇一臺合適的伺服器.

3.配置
1.新建consumer消費者專案
2.pom檔案新增Ribbon座標

<!--Ribbon 相關需要與eureka整合-->
        <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

2.配置consumer的yml檔案,追加Eureka的伺服器註冊地址

server:
  port: 8085

spring:
  application:
    name: client-consumer

#告訴consumer不要直接去找8001埠了,有個eureka叢集
eureka:
  client:
    register-with-eureka: false  #不向註冊中心註冊自己
    fetch-registry: false  #false 表示自己就是註冊中心,我的職責就是維護服務例項,並不需
    server-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

  instance:
      #註冊到eureka後,status的名字(服務在eureka的唯一標誌)
      instance-id: ${spring.application.name}:${server.port}
      #訪問路徑可以顯示IP地址
      prefer-ip-address: true

3.consumer通過RestTemplate訪問服務端,要求RestTemplate訪問服務端的時自帶負載均衡。
3.1新增@LoadBalanced負載均衡 註解(LoadBalance預設演算法是輪詢演算法),在獲得Rest時加入Ribbon的配置

@Configuration   //相當於applicationContext.xml
public class ConfigBean {
    @Bean
    @LoadBalanced    //開啟負載均衡
    public RestTemplate getRestTemplate(){
         return new RestTemplate();
    }
}

3.2將訪問後端provider的地址資訊改為伺服器名稱
provider叢集對外暴漏的服務名稱是相同的,provider和consumer都註冊進入Eureka,consumer根據演算法 通過微服務服務的名稱從Eureka 上找到provider並對其進行訪問。

@RestController
@Api(tags = {"部門表介面"})
@RequestMapping(value="/Dept")
public class DeptController_Consumer {

    //單機版
    // private static final String REST_URL_PREFIX="http://localhost:8001";

    //通過微服務名稱訪問微服務
    private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT8001";
    @Autowired
    private RestTemplate restTemplate;

    @PostMapping(value="/dept/add")
    public  boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @GetMapping(value="/dept/findById/{id}")
    public Dept findById(Long id){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findById/id",Dept.class);
        }

    @GetMapping(value="/findAll")
    public List<Dept> findAll(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findAll",List.class);
    }
}

多個Eureka叢集,多個微服務叢集負載均衡架構圖:
在這裡插入圖片描述

Ribbon是怎麼實現負載均衡的?
1.先選擇EurekaServer,優先選擇在同一個區域內負載較少的server.
2.根據使用者指定的策略(Ribbon演算法,如輪詢,隨機等),再從server中取到的服務註冊列表中選擇一個地址。

下圖是一個Eureka叢集,7001,7002,7003
Consumer消費端
Microservicecloud-dept8001微服務叢集,後面的8001,8003是叢集的結點.為了測試負載均衡,我們給8001設定的資料庫是clouddb01,8003設定的資料庫是clouddb03.
在這裡插入圖片描述

在consumer 配置swagger,訪問consumer可以直接實現對Microservicecloud-dept8001微服務的訪問,結果如下每進行一次都會進行輪訓訪問不同的結點
在這裡插入圖片描述在這裡插入圖片描述