Spring Cloud入門教程-Ribbon實現客戶端負載均衡
簡介
我們繼續以之前部落格的程式碼為基礎,增加Ribbon元件來提供客戶端負載均衡。負載均衡是實現高併發、高效能、可伸縮服務的重要組成部分,它可以把請求分散到一個叢集中不同的伺服器中,以減輕每個伺服器的負擔。客戶端負載均衡是執行在客戶端程式中的,如我們的web專案,然後通過獲取叢集的IP地址列表,隨機選擇一個server傳送請求。相對於服務端負載均衡來說,它不需要消耗伺服器的資源。
基礎環境
- JDK 1.8
- Maven 3.3.9
- IntelliJ 2018.1
- Git
專案原始碼
更新配置
我們這次需要在本地啟動兩個產品服務程式,用來驗證負載均衡,所以需要為第二個程式提供不同的埠。Spring Cloud配置服務中心的配置預設會覆蓋本地系統環境變數,而我們需要通過系統環境變數來設定產品服務的埠,所以需要在配置中心git倉庫中修改產品服務的配置檔案product-service.yml
server:
port: 8081
spring:
cloud:
config:
allow-override: true
override-system-properties: false
allow-override
的預設值即為true,寫出它來是想作說明,它的意思是允許遠端配置中心的配置項覆蓋本地的配置,並不是說允許本地的配置去覆蓋遠端的配置。當然我們可以把它設定成false,但是為了提供更精確的覆蓋規則,這裡保留了預設值。
我們添加了override-system-properties=false
,即雖然遠端配置中心的配置檔案可以覆蓋本地的配置,但是不要覆蓋本地系統變數。修改完成後提交到git倉庫。
另外,在productService
專案的ProductController
中新增一些log,用來驗證負載均衡是否生效:
package cn.zxuqian.controllers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
private static Logger log = LoggerFactory.getLogger (ProductController.class);
@RequestMapping("/products")
public String productList() {
log.info("Access to /products endpoint");
return "外套,夾克,毛衣,T恤";
}
}
為web配置Ribbon
首先在pom.xml
中新增Ribbon的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
然後修改Application
類,新增如下程式碼:
@EnableCircuitBreaker
@EnableDiscoveryClient
@RibbonClient(name = "product-service")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
@LoadBalanced
public RestTemplate rest(RestTemplateBuilder builder) {
return builder.build();
}
}
這裡用到了@RibbonClient(name = "product-service")
註解,用來標記此專案為Ribbon負載均衡的客戶端,它需要選擇產品服務叢集中其中的一臺來訪問所需要的服務,這裡的name
屬性對應於productService專案中配置的spring.application.name
屬性。
@LoadBalanced
註解標明瞭RestTemplate
會被配置為自動使用Ribbon的LoadBalancerClient
來選擇服務的uri併發送請求。
在我們在ProductService
類中新增如下程式碼:
@Service
public class ProductService {
private final RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
public ProductService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@HystrixCommand(fallbackMethod = "backupProductList")
public String productList() {
List<ServiceInstance> instances = this.discoveryClient.getInstances("product-service");
if(instances != null && instances.size() > 0) {
return this.restTemplate.getForObject(instances.get(0).getUri() + "/products", String.class);
}
return "";
}
public String backupProductList() {
return "夾克,毛衣";
}
public String productListLoadBalanced() {
return this.restTemplate.getForObject("http://product-service/products", String.class);
}
}
這裡新添加了一個productListLoadBalanced
方法,跟之前的productList
方法訪問的是同一服務,只不過是用Ribbon Client去做了負載均衡,這裡的uri的host變成了product-service
即要訪問的服務的名字,跟@RibbonClient
中配置的name
屬性保持一致。最後在我們的ProductController
中新增下面的程式碼:
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping("/products")
public String productList() {
return productService.productList();
}
@RequestMapping("/productslb")
public String productListLoadBalanced() {
return productService.productListLoadBalanced();
}
}
來建立一個專門處理/productslb
請求的方法,呼叫productServie
提供負載均衡的方法。
到這裡我們的程式碼就完成了,程式碼看似簡單,其實是所有的配置都使用了預設值。Ribbon提供了程式設計式和配置式兩種方式來配置Ribbon Client。現簡單介紹下,後續深入Ribbon時再和大家一起看看如何修改它的配置。Ribbon提供如下配置(左邊是介面,右邊是預設實現):
IClientConfig
ribbonClientConfig: DefaultClientConfigImplIRule ribbonRule
: ZoneAvoidanceRuleIPing ribbonPing
: DummyPingServerList<Server>
ribbonServerList: ConfigurationBasedServerListServerListFilter<Server>
ribbonServerListFilter: ZonePreferenceServerListFilterILoadBalancer
ribbonLoadBalancer: ZoneAwareLoadBalancerServerListUpdater
ribbonServerListUpdater: PollingServerListUpdater
因為我們這個專案用了Eureka,所以有些配置項和預設實現有所不同,如Eureka使用DiscoveryEnabledNIWSServerList
取代ribbonServerList
來獲取在Eureka上註冊的服務的列表。下邊有一個簡單的Congiguration類,來自Spring官網:
public class SayHelloConfiguration {
@Autowired
IClientConfig ribbonClientConfig;
@Bean
public IPing ribbonPing(IClientConfig config) {
return new PingUrl();
}
@Bean
public IRule ribbonRule(IClientConfig config) {
return new AvailabilityFilteringRule();
}
}
Ribbon預設不會發送Ping檢查server的健康狀態,預設均正常,然後IRune預設實現為ZoneAvoidanceRule
用來避免AWS EC2問題較多的zone,這在本地測試環境來說是用不到的,然後替換成了AvailabilityFilteringRule
,這個可以開啟Ribbon自帶的斷路器功能,來過濾不正常工作的伺服器。
測試
首先啟動我們的configserver
配置中心服務,然後啟動registry
Eureka註冊與發現服務,然後啟動兩個productService
,第一個我們可以正常使用spring-boot:run
外掛來啟動,第二個我們需要給它提供一個新的埠,可以用如下命令啟動:
$ SERVER_PORT=8082 mvn spring-boot:run
最後啟動我們的web
客戶端專案,訪問http://localhost:8080/productslb
,然後重新整理幾次,會看到執行著productService
的兩個命令列視窗會隨機出現我們的log:
Access to /products endpoint
相關推薦
Spring Cloud入門教程-Ribbon實現客戶端負載均衡
簡介 我們繼續以之前部落格的程式碼為基礎,增加Ribbon元件來提供客戶端負載均衡。負載均衡是實現高併發、高效能、可伸縮服務的重要組成部分,它可以把請求分散到一個叢集中不同的伺服器中,以減輕每個伺服器的負擔。客戶端負載均衡是執行在客戶端程式中的,如我們的w
Spring Cloud-04使用Ribbon實現客戶端負載均衡
文章目錄 概述 Ribbon演示 服務提供者微服務改造為使用MySql資料庫 新建服務消費者微服務,配置Ribbon 注意事項 原始碼 概述 Spring Cloud-03將微服務註冊到Eur
SpringCloud筆記(三)使用DiscoveryClient手動實現客戶端負載均衡
1、什麼是客戶端負載均衡(Ribbon)? Ribbon是從eureka註冊中心伺服器端上獲取服務註冊資訊列表,快取到本地,然後在本地實現輪訓負載均衡策略。既在客戶端實現負載均衡。 2、什麼是服務端負載均衡(Nginx)? Nginx是客戶端所有請求統一交給Nginx,由
Spring Cloud 入門教程(五): Ribbon實現客戶端的負載均衡
接上節,假如我們的Hello world服務的訪問量劇增,用一個服務已經無法承載, 我們可以把Hello World服務做成一個叢集。 很簡單,我們只需要複製Hello world服務,同時將原來的埠8762修改為8763。然後啟動這兩個Spring Boot應用, 就可
Spring Cloud 入門教程(六): 用宣告式REST客戶端Feign呼叫遠端HTTP服務
首先簡單解釋一下什麼是宣告式實現? 要做一件事, 需要知道三個要素,where, what, how。即在哪裡( where)用什麼辦法(how)做什麼(what)。什麼時候做(when)我們納入how的範疇。 1)程式設計式實現: 每一個要素(where,wh
深入理解Spring Cloud Ribbon客戶端負載均衡原理(一 實現服務實例地址轉換)
missing 組織 not final str dynamics string pla pan 在使用spring cloud搭建微服務架構時,需要進行負載均衡操作。負載均衡分為硬件負載均衡和軟件負載均衡,軟件負載均衡又分為服務端負載均衡和客戶端負載均衡。本系列主要介紹利
筆記: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入門教程-Hystrix斷路器實現容錯和降級
hystrix spring cloud spring cloud hystri 簡介 Spring cloud提供了Hystrix容錯庫用以在服務不可用時,對配置了斷路器的方法實行降級策略,臨時調用備用方法。這篇文章將創建一個產品微服務,註冊到eureka服務註冊中心,然後我們使用web客戶端訪
《Spring Cloud微服務實戰》讀書筆記之客戶端負載均衡:Spring Cloud Ribbon - 4
摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網路壓力、處理能力擴容的重要手段之一。通常
Spring Cloud Ribbon(客戶端負載均衡)(2)
1.引數配置 對於Ribbon的引數配置通常有兩種方式:全域性配置以及指定客戶端配置: 全域性配置:ribbon.<key>=<value>格式進行配置即可。<key>代表了Ribbon客戶端配置的引數名,<value>代表了對應引數值。比
《Spring Cloud微服務實戰》讀書筆記之客戶端負載均衡:Spring Cloud Ribbon
摘要 客戶端負載均衡元件部署在客戶端,由客戶端維護要訪問的服務端清單(清單來源於服務註冊中心)。在Spring Cloud 中預設使用Ribbon作為客戶端負載均衡。 關鍵詞:客戶端負載均衡,Ribbon 一、什麼是客戶端負載均衡 負載均衡是對系統高可用、緩解網
3.Spring Cloud初相識--------Ribbon客戶端負載均衡
前言: 在生產環境中,未避免單點故障,每個微服務都會做高可用部署。 通白的說,就是每一個一模一樣的服務會根據需求提供多分在多臺機器上。 那麼在大併發的情況下,如何分配服務可以快速得到響應,就成為了我們要解決的問題。 Ribbon就是一款優秀的客戶端負載均衡機制。 什麼是客戶端負載均衡呢? 就是由服務的消費方來
第四章 客戶端負載均衡:Spring Cloud Ribbon
Spring Cloud R巾bon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 NetflixRibbon 實現。 通過 Spring Cloud 的封裝, 可以讓我們輕鬆地將面向服務的 REST 模板請求自動轉換成客戶端負載均衡的服務呼叫 客戶端負載均衡 我
SpringCloud之客戶端負載均衡Spring Cloud Ribbon例項
一、簡介 Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 Netflix Ribbon 實現。 通過 Spring Cloud 的封裝, 可以讓
spring cloud (四) 服務端客戶端負載均衡(Ribbon)
概述Ribbon是一個客戶端負載均衡器, 它可以讓您對HTTP和TCP客戶端的行為有很大的控制權。 Feign已經使用Ribbon,所以如果您使用的是@FeignClient, 那麼這個部分也適用。 Ribbon中一個重要的概念是named client。 Spring Cloud使用Ri
Spring cloud微服務的客戶端負載均衡 Ribbon
在我們已經有了服務註冊中心和服務提供者(這裡為了節省時間,此專案即是服務提供者,也是服務消費者),下面就嘗試建立服務消費者,它主要完成兩個目標,發現服務和消費服務。其中發現服務由 Eureak 的客戶端完成,而服務消費的任務由 Ribbon 完成。Ribbon 是一個
Spring Cloud 入門教程(二): 服務消費者(rest+ribbon)(Greenwich.RELEASE)
一、準備工作,eclipse執行兩個例項 1、修改 eurekaclient1 中 application.yml
Spring Cloud第四篇 | 客戶端負載均衡Ribbon
本文是Spring Cloud專欄的第四篇文章,瞭解前三篇文章內容有助於更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用元件介紹概覽 Spring Cloud第二篇 | 使用並認識Eureka註冊中心 Spring Cloud第三篇 | 搭
springCloud(7):Ribbon實現客戶端側負載均衡-消費者整合Ribbon
spring cloud ribbon 消費者整合ribbon 一、簡介 Ribbon是Netfix發布的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很