1. 程式人生 > >SpringCloud之客戶端負載均衡Spring Cloud Ribbon例項

SpringCloud之客戶端負載均衡Spring Cloud Ribbon例項

一、簡介

Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 Netflix Ribbon 實現。 通過 Spring Cloud 的封裝, 可以讓我們輕鬆地將面向服務的 REST 模板請求自動轉換成客戶端負載均衡的服務呼叫。 
Spring Cloud Ribbon 雖然只是一個工具類框架,它不像服務註冊中心、 配置中心、 API 閘道器那樣需要獨立部署, 但是它幾乎存在於每一個Spring Cloud 構建的微服務和基礎設施中。 因為微服務間的呼叫,API 閘道器的請求轉發等內容實際上都是通過Ribbon 來實現的,包括後續我們將要介紹的 Feign, 它也是基於 Ribbon實現的工具。 所以, 對 Spring Cloud Ribbon 的理解和使用, 對於我們使用 Spring Cloud 來構建微服務非常重要。

二、負載均衡

負載均衡建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。

負載均衡在系統架構中是一個非常重要,並且是不得不去實施的內容。 因為負載均衡是對系統的高可用、 網路壓力的緩解和處理能力擴容的重要手段之一。 我們通常所說的負載均衡都指的是服務端負載均衡, 其中分為硬體負載均衡和軟體負載均衡。 硬體負載均衡主要通過在伺服器節點之間安裝專門用於負載均衡的裝置,比如 F5 等;而軟體負載均衡則是通過在伺服器上安裝一些具有均衡負載功能或模組的軟體來完成請求分發工作, 比如Nginx 等。 不論採用硬體負載均衡還是軟體負載均衡,只要是服務端負載均衡都能以類似下圖的架構方式構建起來:



通過Spring Cloud Ribbon的封裝, 我們在微服務架構中使用客戶端負載均衡呼叫非常簡單, 只需要如下兩步:

  • 服務提供者只需要啟動多個服務例項並註冊到一個註冊中心或是多個相關聯的服務註冊中心。
  • 服務消費者直接通過呼叫被@LoadBalanced 註解修飾過的 RestTemplate 來實現面向服務的介面呼叫。

三、準備工作

在上一篇中,我們啟動eurekaserver,埠5555,和helloserver埠:5556後,現在停止helloserver,並將helloserver的埠改為5557,再次啟動。會發現在eurekaserver下有二個例項,這就相當於一個小叢集了。訪問:http://127.0.0.1:5555/


  • 啟動eurekaserver,埠5555。
  • helloserver中啟動類中return "Hello SpringCloud~"改為:
@EnableEurekaServer
@SpringBootApplication
@RestController
public class HelloserverApplication {
    private final Logger log = (Logger) LoggerFactory.getLogger(HelloserverApplication.class);
    @Autowired
    private DiscoveryClient client;

    @Value("${server.port}")
    String port;

    @RequestMapping(name = "/hello", method = RequestMethod.GET)
    public String index() {
        ServiceInstance instance = client.getLocalServiceInstance();
        log.info("/hello, host:" + instance.getHost() + ",service_id:" + instance.getServiceId());
        return "Hello SpringCloud~HOST:" + instance.getHost() + ",PORT:" + port + ",service_id:" + instance.getServiceId();
    }

    public static void main(String[] args) {
        SpringApplication.run(HelloserverApplication.class, args);
    }
}
  • helloserver打包,然後用java -jar helloserver-0.0.1-SNAPSHOT.jar --server.port=5556/5557,分別啟動。


四、新建springcloud ribbon工程

(1)pom.xml(依賴spring-boot-starter-web、spring-cloud-starter-eureka、spring-cloud-starter-ribbon)

	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka-server</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>
(2)application.yml
server:
  port: 5560

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:5555/eureka/

spring:
  application:
    name: service-ribbon
  • 指定服務的註冊中心地址為http://localhost:5555/eureka/,程式名稱為 service-ribbon,程式埠為5560。
(3)啟動類
@EnableDiscoveryClient
@SpringBootApplication
public class SpringcloudribbonApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
(4)HelloService
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    public String helloService() {
        return restTemplate.getForObject("http://HELLOSERVER/hello", String.class);
    }
}
  • 這裡的http://HELLOSERVER/hello,HELLOSERVER就是第三步中啟動的helloserver名稱,也就是http://127.0.0.1:5555/中Application的名稱。


(5)HelloController

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @RequestMapping("/hello")
    public String hello() {
        return helloService.helloService();
    }
}
(6)測試

訪問:http://127.0.0.1:5560/hello。


重新整理:


(7)增加helloserver的服務例項

命令:java -jar helloserver-0.0.1-SNAPSHOT.jar --server.port=5558


(8)再次重新整理測試,訪問:http://127.0.0.1:5560/hello。


  • 就相當於在nginx下做的負載均衡配置。

(9)訪問服務中心eurekaserver:http://127.0.0.1:5555/


五、此時的架構

  1. 一個服務註冊中心,eurekaserver,埠為5555;
  2. helloservice工程跑了三個例項,埠分別為5556、5557、5558,分別向服務註冊中心註冊
  3. sercvice-ribbon埠為5560,向服務註冊中心註冊
  4. 當sercvice-ribbon通過restTemplate呼叫helloservice的hello介面時,因為用ribbon進行了負載均衡,會輪流的呼叫helloservice:5556、5557和5558埠的hello介面;
  5. 服務註冊中心也會顯示sercvice-ribbon資訊。

新手一枚,歡迎拍磚~ ~ ~


相關推薦

SpringCloud客戶負載均衡Spring Cloud Ribbon例項

一、簡介 Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 Netflix Ribbon 實現。 通過 Spring Cloud 的封裝, 可以讓

SpringCloud 客戶負載均衡策略

一、負載均衡介紹 負載均衡(Load Balance): 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺

Spring Cloud微服務實戰》讀書筆記客戶負載均衡Spring Cloud Ribbon - 4

摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網路壓力、處理能力擴容的重要手段之一。通常

Spring Cloud微服務實戰》讀書筆記客戶負載均衡Spring Cloud Ribbon

摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網

Spring Cloud客戶負載平衡器:Ribbon

highlight 情況下 upd block poll sla conf project 遠程服務 Ribbon是一個客戶端負載均衡器,它可以很好地控制HTTP和TCP客戶端的行為。Feign已經使用Ribbon,所以如果您使用@FeignClient,則本節也適用。

跟我學習Spring Cloud客戶負載平衡器:Ribbon

電子商務 springcloud spring cloud springcloud微服務 微服務雲架構 Ribbon是一個客戶端負載均衡器,它可以很好地控制HTTP和TCP客戶端的行為。Feign已經使用Ribbon,所以如果您使用@FeignClient,則本節也適用。Ribbon中的中

SpringCloud系列客戶負載均衡Netflix Ribbon

### 1. 什麼是負載均衡? 負載均衡是一種基礎的網路服務,它的核心原理是按照指定的負載均衡演算法,將請求分配到後端服務叢集上,從而為系統提供並行處理和高可用的能力。提到負載均衡,你可能想到nginx。對於負載均衡,一般分為服務端負載均衡和客戶端負載均衡 * 服務端負載均衡:在消費者和服務提供方中間使

Spring Cloud負載均衡Spring Cloud RibbonSpring Cloud Feign

一、客戶端負載均衡:Spring Cloud Ribbon。 Spring Cloud Ribbon是基於HTTP和TCP的客戶端負載工具,它是基於Netflix Ribbon實現的。通過Spring Cloud的封裝,可以輕鬆地將面向服務的REST模板請求,自動轉換成客戶

Spring系列學習Spring Cloud Netflix微服務發現容錯及路由客戶負載均衡

英文原文:https://spring.io/projects/spring-cloud-netflix 目錄 概述 特性 入門 快速開始 學習 文件 示例 概述 Spring Cloud Netflix通過自動配置和Spring環境以及其他Spring程

筆記:Spring Cloud Ribbon 客戶負載均衡

系統架構 aging gap release 架構 err 接口 frame enable Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,基於 Netflix Ribbon 實現,通過Spring Cloud 的封裝,可以讓

客戶負載均衡Ribbon之一:Spring Cloud Netflix負載均衡組件Ribbon介紹

erl status spring 使用 -c ive res 性能 bili Netflix:[‘netfli?ks] ribbon:英[?r?b?n]美[?r?b?n]n. 帶; 綬帶; (打印機的) 色帶; 帶狀物;v. 把…撕成條帶; 用緞帶

Spring Cloud Ribbon(客戶負載均衡)(2)

1.引數配置 對於Ribbon的引數配置通常有兩種方式:全域性配置以及指定客戶端配置: 全域性配置:ribbon.<key>=<value>格式進行配置即可。<key>代表了Ribbon客戶端配置的引數名,<value>代表了對應引數值。比

Spring Cloud-04使用Ribbon實現客戶負載均衡

文章目錄 概述 Ribbon演示 服務提供者微服務改造為使用MySql資料庫 新建服務消費者微服務,配置Ribbon 注意事項 原始碼 概述 Spring Cloud-03將微服務註冊到Eur

3.Spring Cloud初相識--------Ribbon客戶負載均衡

前言: 在生產環境中,未避免單點故障,每個微服務都會做高可用部署。 通白的說,就是每一個一模一樣的服務會根據需求提供多分在多臺機器上。 那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。 Ribbon就是一款優秀的客戶端負載均衡機制。 什麼是客戶端負載均衡呢? 就是由服務的消費方來

第四章 客戶負載均衡Spring Cloud Ribbon

  Spring Cloud R巾bon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 NetflixRibbon 實現。 通過 Spring Cloud 的封裝, 可以讓我們輕鬆地將面向服務的 REST 模板請求自動轉換成客戶端負載均衡的服務呼叫   客戶端負載均衡   我

Spring Cloud入門教程-Ribbon實現客戶負載均衡

簡介 我們繼續以之前部落格的程式碼為基礎,增加Ribbon元件來提供客戶端負載均衡。負載均衡是實現高併發、高效能、可伸縮服務的重要組成部分,它可以把請求分散到一個叢集中不同的伺服器中,以減輕每個伺服器的負擔。客戶端負載均衡是執行在客戶端程式中的,如我們的w

spring cloud (四) 服務客戶負載均衡Ribbon

概述Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。   Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。      Ribbon中一個重要的概念是named client。    Spring Cloud使用Ri

spring-cloud客戶負載均衡(初試)

目錄結構 maven <groupId>WeiXinClient</groupId> <artifactId>WeiXinClient</artifactId> <version>1.0</vers

Spring cloud微服務的客戶負載均衡 Ribbon

    在我們已經有了服務註冊中心和服務提供者(這裡為了節省時間,此專案即是服務提供者,也是服務消費者),下面就嘗試建立服務消費者,它主要完成兩個目標,發現服務和消費服務。其中發現服務由 Eureak 的客戶端完成,而服務消費的任務由 Ribbon 完成。Ribbon 是一個

深入理解Spring Cloud Ribbon客戶負載均衡原理(一 實現服務實例地址轉換)

missing 組織 not final str dynamics string pla pan 在使用spring cloud搭建微服務架構時,需要進行負載均衡操作。負載均衡分為硬件負載均衡和軟件負載均衡,軟件負載均衡又分為服務端負載均衡和客戶端負載均衡。本系列主要介紹利