SpringCloud微服務 之Ribbon(四)
前言
上一小節我們學習瞭如何在SpringCloud微服務架構中通過配置的方式來實現自定義ribbon均衡負載策略。本小節我們來學習一下如何在微服務架構下使某個服務節點失去Eureka的Ribbon均衡負載。
首先說明一下在微服務架構下使某個服務節點失去Eureka的Ribbon均衡負載這個技術實現對某些特定的業務邏輯的實現是有非常大的幫助的。首先我們知道Eureka是自帶Ribbon的均衡負載策略的,既然都自帶了均衡負載策略為什麼我們還要是某個節點失去Eureka的Ribbon均衡負載呢,人家為你做了這麼周全的設計來保證你的業務正常進行你為什麼不採納非要自己去搞一些什麼特殊情況呢?
其實不然,在生產環境下面使用Eureka自帶的Ribbon均衡負載策略固然是好的,畢竟人家做這樣的設計是經過實際考驗的,但在實現我們自己特定的業務邏輯的時候我們需要一些特殊處理,此時之前做的周全設計就顯得比較礙手礙腳了,於是乎需要自己跳出來來自己實現特定的均衡負載策略。
本小節將展示兩個業務場景與案例,案例(一)用來說明如何使某個服務節點失去Eureka的Ribbon均衡負載,案例(二)用來說明某個節點脫離了Eureka的Ribbon均衡負載之後如何自定義自己的均衡負載策略。
案例(一)
本案例用來實現和說明如何在微服務架構下使某個服務節點失去Eureka的Ribbon均衡負載。
-
Eureka Server端編寫:((參考前例))。
-
Eureka Client端服務提消費編寫(多例項) 在多個埠啟動多個例項 (參考前例)
開啟3個例項(8081、8083、8084)。
-
Eureka Client端服務提供方編寫(參考前例)
-
專案結構
-
CoreCode
@SpringBootApplication @EnableDiscoveryClient public class MicroserviceDealBrokerRibbonCustomizedApplication { @Bean @LoadBalanced /** * 新增 @LoadBalanced 使該RestTemplate具備Ribbon均衡負載演算法功能 * @return */ public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerRibbonCustomizedApplication.class, args); } }
server: port: 8082 spring: application: name: microservice-deal-broker-cloud-ribbon-without-eureka eureka: client: serviceUrl: defaultZone: http://localhost:8080/eureka/ instance: prefer-ip-address: true ribbon: #使該服務消費節點失去Eureka的Ribbon均衡負載在策略能力 eureka: enabled: false microservice-deal-cloud: #脫離Eureka的Ribbon均衡負載之後繼續宣告使用Ribbon的均衡負載策略(預設為輪詢策略。) ribbon: listOfServers: localhost:8081,localhost:8084 #宣告Ribbon均衡負載策略只對microservice-deal-cloud服務節點中的8081和8084埠上的例項實現均衡負載策略。(此時8083未做申明,Ribbon將不對8083上的例項做均衡負載策略演算法的實現即不訪問8083上的例項。) #listOfServers: localhost:8081,localhost:8084
-
-
持續訪問:http://localhost:8082/deal/2
Ribbon會使用輪詢策略定位8081和8084埠上的例項。
案例(二)
本案例用來說明某個節點脫離了Eureka的Ribbon均衡負載之後如何自定義自己的均衡負載策略。正如我們之前反覆提到的一點:Ribbon預設使用的均衡負載策略是輪詢策略。且本案例的實現是在本節案例(一)基礎是上的。
-
Eureka Server端編寫:((參考前例))
-
Eureka Client端服務提消費編寫(多例項) 在多個埠啟動多個例項 (參考案例(一中的Eureka Client端服務提消費編寫))開啟3個例項(8081、8083、8084)
-
Eureka Client端服務提供方編寫(參考前例)
-
專案結構
-
CoreCode
@SpringBootApplication @EnableDiscoveryClient public class MicroserviceDealBrokerRibbonCustomizedApplication { @Bean @LoadBalanced /** * 新增 @LoadBalanced 使該RestTemplate具備Ribbon均衡負載演算法功能 * @return */ public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerRibbonCustomizedApplication.class, args); } }
server: port: 8082 spring: application: name: microservice-deal-broker-cloud-ribbon-without-eureka eureka: client: serviceUrl: defaultZone: http://localhost:8080/eureka/ instance: prefer-ip-address: true ribbon: eureka: enabled: false microservice-deal-cloud: ribbon: listOfServers: localhost:8081,localhost:8084 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #自定義Ribbon的負載均衡策略為隨機策略。
-
-
持續訪問:http://localhost:8082/deal/2
Ribbon會使用隨機策略隨機定位到不同的例項(僅在8081和8084兩個例項中做隨機策略實現):
小結
-
A服務節點要想脫離Eureka的Ribbon均衡負載策略功能需要在A服務節點的配置檔案中做如下宣告:
ribbon:eureka:enabled: false,同時宣告A服務節點在脫離Eureka的Ribbon均衡負載策略功能之後Ribbon需要實現的均衡負載策略。以本節案例(一)為例,microservice-deal-broker-cloud-ribbon-without-eureka服務節點脫離Eureka的Ribbon均衡負載策略功能之後,後續還聲明瞭Ribbon的均衡負載策略即對microservice-deal-cloud節點上的指定例項(8081和8084)實現Ribbon的均衡負載策略(若為對策略做宣告預設使用Ribbon預設的均衡負載策略即輪詢策略,即microservice-deal-cloud: ribbon:listOfServers: localhost:8081,localhost:8084配置說明。 -
在A服務節點脫離Eureka的Ribbon均衡負載策略功能之後,我們仍需要根據不同的業務場景來實現不同均衡負載策略,本節案例(二)就是在A服務節點脫離Eureka的Ribbon均衡負載策略功能之後,通過配置的方法實現Ribbon的均衡負載策略的自定義的實現。至於實現原理請參考:SpringCloud微服務 之Ribbon(三-Customize)
-
本節用到的案例:microservice-deal-eureka、microservice-deal-cloud(8081、8083、8084)、microservice-deal-broker-cloud-ribbon-without-eureka