SpringCloud之LoadBalancer負載均衡服務調用過程
前言
LoadBalancer是Ribbon的未來替換方案
一、LoadBalancer是什么?
LB負載均衡(Load Balance)是什么
- 簡單的說就是將用戶的請求平攤的分配到多個服務上,從而達到系統的HA(高可用)
- 常見的負載均衡有軟件Nginx,LVS,硬件 F5等
spring-cloud-starter-loadbalancer組件是什么
- Spring Cloud LoadBalancer是由SpringCloud官方提供的一個開源的、簡單易用的客戶端負載均衡器,它包含在SpringCloud-commons中用它來替換了以前的Ribbon組件。
- 相比較于Ribbon,SpringCloud LoadBalancer不僅能夠支持RestTemplate,還支持WebClient(WeClient是Spring Web Flux中提供的功能,可以實現響應式異步請求)
官網:http://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html
客戶端負載和服務端負載區(qū)別:
- Nginx是服務器負載均衡,客戶端所有請求都會交給nginx,然后由nginx實現轉發(fā)請求,即負載均衡是由服務端實現的。
- loadbalancer本地負載均衡,在調用微服務接口時候,會在注冊中心上獲取注冊信息服務列表之后緩存到JVM本地,從而在本地實現RPC遠程服務調用技術。
二、使用步驟
1、啟動consul
詳見:SpringCloud--consul服務注冊與發(fā)現、配置管理、配置持久化
2、客戶端加入依賴
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>3、以服務名稱調用
public static final String PaymentSrv_URL = "http://cloud-payment-service";//服務注冊中心上的微服務名稱
@GetMapping(value = "/consumer/pay/get/info")
private String getInfoByConsul(){
return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/info", String.class);
}用restTemplate調用服務時,使用服務名稱調用后,在consul中注冊相同服務名稱的的服務會通過loadbalancer實現負載均衡,使得每個相同服務名稱的服務被訪問的次數平均。
三、負載均衡算法替換
1、 默認算法輪詢(相同服務名下的所有服務枚舉調用)
- restTemplate配置:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced //按服務名稱調用時默認負載均衡 要加上該注解支持負載均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}2、替換隨機算法(相同服務名下的所有服務隨機調用)
- restTemplate配置:
@Configuration
@LoadBalancerClient(
//下面的value值大小寫一定要和consul里面的名字一樣,必須一樣
value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{
@Bean
@LoadBalanced //使用@LoadBalanced注解賦予RestTemplate負載均衡的能力
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中StringBuilder字符串類型的操作方法及API整理
Java中的StringBuffer類繼承于AbstractStringBuilder,用來創(chuàng)建非線程安全的字符串類型對象,下面即是對Java中StringBuilder字符串類型的操作方法及API整理2016-05-05

