前言
本篇主要介紹的是SpringCloud中的負載均衡(Ribbon)功能的實現以及使用Feign結合Ribbon實現負載均衡,Ribbon適合RPC的遠程調用。
GitHub源碼鏈接位於文章底部。
一、工程
首先需要創建四個工程,包括一個轉發請求的客戶端,兩個接收請求的服務端,以及eureka註冊中心。
二、配置
1.導入依賴
springcloud-ribbon-eureka作爲eureka註冊中心,因此需要添加eureka的服務端依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
其他三個工程需要註冊到eureka中,相對於eureka來說是客戶端,因此添加以下依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2.配置
springcloud-ribbon-eureka
server:
port: 8100
spring:
application:
name: eureka-server
#eureka基本配置信息
eureka:
client:
service-url:
#Eureka 客戶端與 Eureka 服務端進行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka
#是否將自己註冊到Eureka服務中,本身就是註冊中心所以無需註冊
register-with-eureka: false
#是否從Eureka中檢索註冊信息,本身就是註冊中心所以無需檢索
fetch-registry: false
server:
# 測試時關閉自我保護機制,保證不可用服務及時踢出
enable-self-preservation: false
##剔除失效服務間隔
eviction-interval-timer-in-ms: 2000
springcloud-ribbon-client
spring:
application:
name: springcloud-ribbon-client
server:
port: 8000
eureka:
client:
service-url:
#Eureka 客戶端與 Eureka 服務端進行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
springcloud-ribbon-server1
spring:
application:
name: springcloud-ribbon-server
server:
port: 8001
eureka:
client:
service-url:
#Eureka 客戶端與 Eureka 服務端進行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
springcloud-ribbon-server2
spring:
application:
name: springcloud-ribbon-server
server:
port: 8002
eureka:
client:
service-url:
#Eureka 客戶端與 Eureka 服務端進行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
3.配置類
在springcloud-ribbon-client中添加ribbon配置類,第一個方法是啓動負載均衡,第二個方法是選擇負載均衡策略,如果不寫,默認爲輪詢策略。負載均衡策略的種類在文末貼出。
@Configuration
public class RibbonConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public IRule ribbonRule() {
//隨機負載
return new RandomRule();
}
}
三、測試代碼
在server1中添加一個接口接收請求
@RestController
public class RibbonController {
@RequestMapping("/ribbon")
public String index(@RequestParam String name) {
return name+",Hello World! 這裏是server1!!";
}
}
在server2中添加一個接口接收請求
@RestController
public class RibbonController {
@RequestMapping("/ribbon")
public String index(@RequestParam String name) {
return name+",Hello World! 這裏是server2!!";
}
}
在client中添加一個接口發送請求,遠程調用的地址是springcloud-ribbon-server加上接口名,springcloud-ribbon-server是由配置文件中的spring.application.name決定的。
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/ribbon")
public String ribbon(@RequestParam String name) {
//進行遠程調用
return restTemplate.getForObject("http://springcloud-ribbon-server/ribbon/?name="+name, String.class);
}
}
依次啓動eureka,server,client,訪問客戶端接口,轉發到兩個server。輸入 localhost:8000/ribbon/?name=lxg 轉發到兩個server多刷新幾次會有變化,輪詢機制由配置類決定。
四、第二種方式-整合Feign進行遠程調用
在client中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加remote的interface
@FeignClient(name = "springcloud-ribbon-server")
public interface RibbonRemote {
@RequestMapping(value = "/ribbon")
public String ribbon(@RequestParam(value = "name") String name);
}
在controller中添加方法
@Autowired
private RibbonRemote ribbonRemote;
@RequestMapping("/ribbon/{name}")
public String ribbonFeign(@PathVariable("name") String name) {
//進行遠程調用
return ribbonRemote.ribbon(name);
}
注意:要在啓動類上加上Feign啓動註解
然後訪問localhost:8000/ribbon/lxg 轉發到兩個server多刷新幾次會有變化,輪詢機制由配置類決定。
五、負載均衡策略
策略名 | 策略描述 | 實現說明 |
---|---|---|
BestAvailableRule | 選擇一個最小的併發請求的server | 逐個考察Server,如果Server被tripped了,則忽略,在選擇其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | 過濾掉那些因爲一直連接失敗的被標記爲circuit tripped的後端server,並過濾掉那些高併發的的後端server(active connections 超過配置的閾值) | 使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status裏記錄的各個server的運行狀態 |
WeightedResponseTimeRule | 根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。 | 一個後臺線程定期的從status裏面讀取評價響應時間,爲每個server計算一個weight。Weight的計算也比較簡單responsetime 減去每個server自己平均的responsetime是server的權重。當剛開始運行,沒有形成status時,使用roubine策略選擇server。 |
RetryRule | 對選定的負載均衡策略機上重試機制。 | 在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server |
RoundRobinRule | roundRobin方式輪詢選擇server | 輪詢index,選擇index對應位置的server |
RandomRule | 隨機選擇一個server | 在index上隨機,選擇index對應位置的server |
ZoneAvoidanceRule | 複合判斷server所在區域的性能和server的可用性選擇server | 用性選擇server 使用ZoneAvoidancePredicate和AvailabilityPredicate來判斷是否選擇某個server,前一個判斷判定一個zone的運行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用於過濾掉連接數過多的Server |
本文GitHub源碼:https://github.com/lixianguo5097/springcloud/tree/master/springcloud-ribbon
CSDN:https://blog.csdn.net/qq_27682773
簡書:https://www.jianshu.com/u/e99381e6886e
博客園:https://www.cnblogs.com/lixianguo
個人博客:https://www.lxgblog.com