SpringCloud學習筆記:負載均衡Ribbon(3)

libingql發表於2018-04-16

1. RestTemplate簡介

  RestTemplate是Spring Resource中一個訪問第三方RESTful API介面的網路請求框架。

  RestTemplate是用來消費REST服務的,RestTemplate的主要方法與RESTHTTP協議緊密關聯。

  HTTP:HEAD、GET、POST、PUT、DELETE和OPTIONS等

  RestTemplate:headForHeaders()、getForObject()、postForObject()、put()和delete()等

2. Ribbon簡介

  負載均衡是指將負載分攤到各個執行單元上。

  常見的負載均衡有兩種方式:

  (1)獨立程式單元:通過負載均衡策略,將請求轉發到各個不同的執行單元上。如:Nginx;

  (2)將負載均衡邏輯以程式碼的形式封裝到服務消費者的客戶端上,服務消費者客戶端維護了服務提供者的資訊列表。通過負載均衡策略將請求分攤給多個服務提供者,從而達到負載均衡的目的。

  Ribbon是一個負載均衡元件,屬於上述的第二種方式,將負載均衡邏輯封裝在客戶端中,並且執行在客戶端的程式中。

  在SpringCloud構建的微服務系統中,Ribbon作為服務消費者的負載均衡器,有兩種使用方式:

  (1)和RestTemplate相結合

  (2)和Feign相結合

  Feign預設整合了Ribbon。

  Ribbon主要子模組:

  ◊ ribbon-core:ribbon專案核心,主要包括負載均衡器介面定義、客戶端介面定義、內建發負載均衡實現等API;

  ◊ ribbon-eureka:為Eureka客戶端提供負載均衡實現類;

  ◊ ribbon-httpclient:對Apache的HttpClient進行封裝,提供包含負載均衡功能的REST客戶端;

  ◊ ribbon-loadbalancer:獨立使用或與其他模組一起使用負載均衡器API。

3. 使用RestTemplate和Ribbon消費服務

  

  建立專案eureka-ribbon-client,通過RestTemplate來遠端呼叫eureka-client服務API介面。

  新增依賴spring-cloud-starter-ribbon

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>libing</groupId>
    <artifactId>eureka-ribbon-client</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>eureka-ribbon-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>libing</groupId>
        <artifactId>libing-eureka</artifactId>
        <version>1.0.0</version>
    </parent>

    <dependencies>
        <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.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>
pom.xml

  RestTemplate結合Ribbon開啟負載均衡:

package libing.eurekaribbonclient.common;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RibbonConfig {

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

}

  RibbonService使用restTemplate呼叫eureka-client的API介面:

package libing.eurekaribbonclient.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class RibbonService {

    @Autowired
    RestTemplate restTemplate;

    public String getPort() {
        return restTemplate.getForObject("http://eureka-client/helloworld", String.class);
    }

}
RibbonService
package libing.eurekaribbonclient.controller;

import libing.eurekaribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("ribbon")
public class RibbonController {

    @Autowired
    RibbonService ribbonService;

    @GetMapping
    public String getPort(){
        return ribbonService.getPort();
    }

}
RibbonController

  啟動執行:

  執行兩個eureka-client例項

  在瀏覽器中開啟地址 http://localhost:8764/ribbon,交替顯示:

port:8762
port:8763

4. LoadBalancerClient簡介

  負載均衡的核心類為LoadBalancerClient,LoadBalancerClient可以獲取負載均衡的服務提供者的例項資訊。

package libing.eurekaribbonclient.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("ribbon")
public class RibbonController {

    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping
    public String getPort() {
        ServiceInstance instance = loadBalancer.choose("eureka-client");
        return instance.getHost() + ":" + instance.getPort();
    }

}

  LoadBalancerClient的choose("eureka-client")可以交替得到eureka-client的兩個服務例項的資訊。

  負載均衡器LoadBalancerClient是從Eureka Client獲取服務註冊列表資訊的,並將服務註冊列表資訊快取一份。在LoadBalancerClient呼叫choose()方法時,根據負載均衡策略選擇一個服務例項的資訊,從而進行負載均衡。

  示例程式碼:libing-eureka-ribbon.zip

相關文章