1. 程式人生 > 程式設計 >Springcloud ribbon負載均衡演算法實現

Springcloud ribbon負載均衡演算法實現

一 前言

經過幾篇的cloud系列文章,我想大家都有一個堅實的基礎,後續的學習就會輕鬆很多,如果是剛剛來看的讀者需要有eureka基礎知識,或者查閱知識追尋者的cloud系列專欄;這篇文章主要講解如何使用ribbon實現web service客戶端呼叫,ribbon預設演算法實現負載均衡等!

二 ribbon簡介

ribbon是一個客戶端負載均衡器,其能夠整合不同的協議工具進行web service API 呼叫;

主要特色如下:

提供可插拔式的負載均衡整合服務發現故障彈性恢復cloud支援客戶端整合載入負載均衡

核心工程如下:

ribbon-core:整合其他模組實現負載均衡

ribbon-eureka: 基於 eureka client 實現 負載均衡

ribbon-httpclient: 包括JSR-311 實現REST 載入負載均衡

三 eureka-client

在之前的 eureka-client工程中建立controller包,並提供表現層介面,程式碼如下,然後啟動eureka-client例項2個,分別為8090埠,8091埠;

/**
 * @Author lsc
 * <p> 知識追尋者,ribbon provider the restful api</p>
 */
@RestController
public class RibbonProvidderController {


  @GetMapping("zszxz/ribbon")
  public String testRibbon(){
    return "hell i am zszxz";
  }
}

四 ribbon-client

4.1 pom.xml

在父工程低下新增新模組 ribbon-client;原來的start-web依賴在父工程中已經引入,故ribbon模組中不會再次引入該依賴;

  <dependencies>
    <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-ribbon</artifactId>
    </dependency>
  </dependencies>

4.2 config

使用restTemplate進行客戶端呼叫,故需要進行配置,並且在方法上加 @LoadBalanced 註解表示開啟ribbon負載均衡;

/**
 * @Author lsc
 * <p> ribbon-restTemplate配置 </p>
 */
@Configuration
public class RibbonConfig {

  @Bean
  @LoadBalanced//表示用於負載均衡
  RestTemplate restTemplate(){
    return new RestTemplate();
  }
}

4.3 service

建立service類,並且使用restTemplate進行HTTP API 呼叫;注意點是這邊不使用ip埠,而是直接使用服務的應用名稱 eureka-client ;

/**
 * @Author lsc
 * <p> </p>
 */
@Service
public class RibbonService {

  @Autowired
  RestTemplate restTemplate;


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

4.4 controller

建立表現層類,用於瀏覽器訪問;

/**
 * @Author lsc
 * <p> </p>
 */
@RestController
public class RibbonController {

  @Autowired
  RibbonService ribbonService;

  @GetMapping("ribbon/test")
  public String testRibbon(){
    return ribbonService.testRibbon();
  }
} 

4.5 ribbon啟動類

ribbon的啟動類也是作為 eureka 的客戶端故需要加上@EnableEurekaClient註解;

/**
 * @Author lsc
 * <p>知識追尋者 ribbon啟動類 </p>
 */
@SpringBootApplication
@EnableEurekaClient
public class RibbonApp {

  public static void main(String[] args) {
    SpringApplication.run(RibbonApp.class,args);
  }
}

4.6 application.yml

application.yml 配置中使用埠8092,服務註冊地址分別是peer1,peer2,peer3;

server:
 port: 8092
spring:
 application:
  name: eureka-ribbon # 應用名稱
eureka:
 client:
  service-url:
   # 服務註冊地址
   defaultZone: http://peer1:10081/eureka/,http://peer2:10082/eureka/,http://peer3:10083/eureka/

4.7 啟動工程

分別啟動 client,server ; 如下圖

Springcloud ribbon負載均衡演算法實現

4.8 瀏覽器訪問結果

瀏覽器結果如下,說明我們在 eureka-ribbon 中使用 restTemplate 結合 ribbon 實現了HTTP 方式從 eureka-clinet 模組中呼叫API;

Springcloud ribbon負載均衡演算法實現

五 ribbon預設負載均衡

LoadBalancerClient 是 ribbon 的一個核心類,其能夠獲得 ribbon提供負載均衡的例項資訊;在 ribbon-client模組中的controller層新增 方法 ,方法主體是獲得例項的埠和主機;以便於於我們分析ribbon負載均衡演算法;

  @Autowired
  LoadBalancerClient loadBalanced;

  @GetMapping("ribbon")
  public String ribbon(){
    ServiceInstance choose = loadBalanced.choose("eureka-client");
    String s = "host is :" + choose.getHost() + " port is :" + choose.getPort();
    System.out.println(s);
    return s;
  }

重啟ribbon-client 工程,使用瀏覽器訪問,控制檯輸出如下,分別呼叫了8090,8091兩個 eureka-client例項API,說明ribbon預設的負載均衡機制是輪詢演算法;

host is :peer1 port is :8091
host is :peer1 port is :8090
host is :peer1 port is :8091
host is :peer1 port is :8090
host is :peer1 port is :8091
host is :peer1 port is :8090
host is :peer1 port is :8091
host is :peer1 port is :8090

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。