1. 程式人生 > >SpringCloud微服務 之Ribbon(一)

SpringCloud微服務 之Ribbon(一)

前言

本節我們將瞭解下在使用了Eureka作為服務的註冊與發現元件時是如何使用Ribbon來實現客戶端均衡負載的。
在前面的章節中我們瞭解到了服務註冊與發現元件的機制中都基本 實現了均衡負載。

  • 服務註冊與發現元件
    服務註冊與發現組機制主要有兩種一種是基於服務端服務註冊與發現組機制,該型別的均衡負載的實現則是基於服務端的負載均衡,典型的如Consul+Nginx。另外一種是基於客戶端服務註冊與發現機制,該型別的均衡負載實現則是基於客戶端負載的負載均衡,典型的如Eureka+Netflix Ribbon。本節我們將學習一下在使用了Eureka作為服務註冊與發現機制的為服務中,是如何使用Netflix Ribbon實現客戶端均衡負載的。

  • Ribbon

    • Ribbon是Netflix開發的雲中間層服務開源專案,其主要功能是提供客戶端均衡負載演算法。Ribbon提供了一系列的完善的配置比如連結超時、重試等。簡單來說Ribbon是一個客戶端負載均衡器,我們可以在配置檔案中列出我們的Load Balance後面的所有機器,Ribbon會通過某種規則(如輪詢、隨即連結等)自動地去連結這些服務,同時我們也可以使用Ribbon定義的介面來實現自自定義負載均衡演算法以滿足特定的業務需求。
    • Ribbon負載均衡實現機制

在這裡插入圖片描述
Ribbon首先從Eureka Server的服務登錄檔中獲取已註冊服務的資訊,然後通過Ribbon中的負載均衡演算法算出被命中的例項,然後將負載均衡請求只想該節點即實際的請求將會只想該服務的指定例項。

  • Ribbon工作機制
    • 第一步選擇Eureka Server,預設地它將選擇一個Zone且負載較少的Server;
    • 第二步根據使用者指定的策略在Eureka Server上獲取服務登錄檔中選擇一個地址,其中Ribbon提供了多種策略,例如輪詢roud robin。隨機Random、根據響應時間加權等等。

案例

  • Eureka Server端編寫:請參考SpringCloud微服務 之 Eureka(二)

  • Eureka Client端服務提供方編寫(參考前例)

    • 核心程式碼與步驟
      • pom.xml

        <?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>
        
        	<artifactId>microservice-deal-broker-cloud-ribbon</artifactId>
        	<packaging>jar</packaging>
        
        	<name>microservice-deal-broker-cloud-ribbon</name>
        	<description>Demo project for Spring Boot</description>
        
        	<parent>
        		<groupId>com.example</groupId>
        		<artifactId>microservice-deal-parent</artifactId>
        		<version>0.0.1-SNAPSHOT</version>
        	</parent>
        
        	<dependencies>
        		<!-- Eureka CLient核心元件 -->
        		<dependency>
        			<groupId>org.springframework.cloud</groupId>
        			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        		</dependency>
        		<!-- Ribbon核心元件 可宣告此依賴也可以不生命,因為Eureka Client已依賴了Ribbon-->
        		<dependency>
        			<groupId>org.springframework.cloud</groupId>
        			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        		</dependency>
        	</dependencies>
        
      • Core Code

        @SpringBootApplication
        @EnableDiscoveryClient
        public class MicroserviceDealBrokerRibbonApplication {
        
        	@Bean
        	@LoadBalanced
        	/**
        	 * 新增 @LoadBalanced 使該RestTemplate具備Ribbon均衡負載演算法功能
        	 * @return
        	 */
        	public RestTemplate restTemplate() {
        		return new RestTemplate();
        	}
        
        	public static void main(String[] args) {
        		SpringApplication.run(MicroserviceDealBrokerRibbonApplication.class, args);
        	}
        }
        
        @RestController
        public class BrokerController {
          @Autowired
          private RestTemplate restTemplate;
        
          @GetMapping("/deal/{id}")
          public Deal findById(@PathVariable Long id) {
            return this.restTemplate.getForObject("http://microservice-deal-cloud/" + id, Deal.class);
          }
        }
        
  • Eureka Client端服務提消費編寫(多例項) 在多個埠啟動多個例項 (參考前例)

    • CoreCode

      @RestController
      public class DealController {
      	
      	@Value("${server.port}")
      	private String port; // 為驗證多埠啟動的例項 8081/8083
      	
      	@GetMapping("/{id}")
      	public Deal findById(@PathVariable Integer id) {
      		Deal deal = new  Deal(id, "Dustyone", "Heyt", 22, 18,port);
      		return deal;
      	}
      }
      
  • Eureka Dashboard

在這裡插入圖片描述

  • 持續訪問:http://localhost:8082/deal/1
    我們會發現請求到達microservice-deal-broker-cloud-ribbon後Ribbon實現了均衡負載(預設為輪詢)-以最終呈現的port為區分標誌。
    在這裡插入圖片描述

在這裡插入圖片描述

小結

  • Eureka 的依賴中依賴了Ribbon因而我們可以在引入了Eureka依賴之後不需要特地地新增Ribbon依賴。
  • 服務消費端的RestTempalate需要新增@LoadBalanced註解是的該RESTTamplate具有Ribbon的均衡負載功能,Ribbon均衡負載演算法的預設策略是輪詢。
  • 為直觀地展示Ribbon的均衡負載演算法實現,需要在服務提供開啟多個例項驗證均衡負載的實現。本例子開啟了兩個例項分別在8081和8083埠中。
  • 本節學習原始碼在這裡。使用到的案例:microservice-deal-eureka、microservice-deal-broker-cloud-ribbon(服務消費者)、microservice-deal-cloud(8081-8083)(服務提供者)