1.Nacos-NacosRule負載均衡
准備二個微服務項目 order(消費者)、payment(生產者)。
NacosRule負載均衡策略
- 優先選擇同集群服務實例列表
- 本地集群找不到提供者,才去其它集群尋找,並且會報警告。
- 確定了可用實例列表后,再采用隨機負載均衡挑選實例。
1.修改order中的application.yml,設置集群為shanghai:
1 spring: 2 application: 3 name: payment 4 cloud: 5 nacos: 6 server-addr: 127.0.0.1:8848 # nacos服務地址 7 discovery: 8 cluster-name: shanghai #payment服務在上海集群,order使用默認集群(DEFAULT)在調用payment服務優先選擇DEFAULT集群,如果DEFAULT集群宕機的情況下才會找到上海集群服務實例列表
2.然后在order服務中設置負載均衡的IRule為NacosRule,這個規則優先會尋找與自己同集群的服務,局部配置 只針對 payment這個服務生效:
1 payment: 2 ribbon: 3 NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
跨集群調用預警信息:
2022-01-18 13:25:44.211 [http-nio-8080-exec-4] [WARN ][com.alibaba.cloud.nacos.ribbon.NacosRule] - A cross-cluster call occurs,name = payment, clusterName = DEFAULT, instance = [Instance{instanceId='null', ip='172.17.120.97', port=8082, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='shanghai', serviceName='DEFAULT_GROUP@@payment', metadata={preserved.register.source=SPRING_CLOUD}}]
2.Nacos-服務實例的權重配置
使用場景:服務器設備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔更多的用戶請求。
Nacos提供了權重配置來控制訪問頻率,權重越大則訪問頻率越高,實例的權重控制。
- Nacos控制台可以設置實例的權重值,0~1之間
- 同集群內的多個實例,權重越高被訪問的頻率越高
- 權重設置為0則完全不會被訪問
舉栗子:把 payment:8081服務權重調整為0,此時payment:8081服務不接收用戶請求,這時做停機操作對用戶是無感知操作。我們可以做版本升級,升級結束后權重調小點(如:0.01),對小部分用戶開放等沒問題再把權重調大。這樣操作對用戶是無感知的,平滑升級非常優雅。
設置權重負載均衡:
在Nacos控制台可以設置實例的權重值,如下圖:
設置權重:
將實例權重設置為0,該實例將不再接收用戶請求。當實例權重設置為0.01,被訪問到的頻率就大大的減小了。
注意:默認情況下只在Nacos控制台修改權重配置是沒有作用的。因為Nacos 的負載均衡底層是基於Ribbon實現的。而Ribbon默認的rule是輪詢,在沒有設置的情況下默認規則是輪詢策略。如果想使用結合Nacos后台權重設置的策略,需要在服務的配置文件(yml)中配置NacosRule規則(或者將NacosRule 注冊成為Bean),替換默認的 Rule即可。
3.自定義負載均衡策略
1 package com.order.nacos.config; 2 3 import com.alibaba.nacos.api.exception.NacosException; 4 import com.alibaba.nacos.api.naming.pojo.Instance; 5 import com.netflix.client.config.IClientConfig; 6 import com.netflix.loadbalancer.AbstractLoadBalancerRule; 7 import com.netflix.loadbalancer.DynamicServerListLoadBalancer; 8 import com.netflix.loadbalancer.Server; 9 import lombok.extern.slf4j.Slf4j; 10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties; 12 import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer; 13 14 /** 15 * 基於Nacos權重的負載均衡 16 * 17 * @Author mingtian 18 * @create 2022/01/18 14:54 19 */ 20 @Slf4j 21 public class NacosWeightLoadBalancerRule extends AbstractLoadBalancerRule { 22 23 @Autowired 24 private NacosDiscoveryProperties nacosDiscoveryProperties; 25 26 @Override 27 public void initWithNiwsConfig(IClientConfig iClientConfig) { 28 // 讀取配置文件,並初始化NacosWeightLoadBalancerRule 29 } 30 31 @Override 32 public Server choose(Object o) { 33 DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer(); 34 // 請求的微服務名稱 35 String applicationName = loadBalancer.getName(); 36 try { 37 // nacos 通過基於權重的負載均衡算法,算出一個健康的服務實例以供調用 38 Instance instance = nacosDiscoveryProperties.namingServiceInstance().selectOneHealthyInstance(applicationName); 39 return new NacosServer(instance); 40 } catch (NacosException e) { 41 log.error("獲取服務實例異常:{}", e.getMessage()); 42 } 43 return null; 44 } 45 }
4.局部配置與全局配置區別
4.1 局部配置
調用指定服務提供的服務時,使用基於Nacos權重的負載均衡算法,針對於單個服務的負載均衡策略配置。
order服務yml配置:
# 被調用的微服務名 payment: ribbon: # 指定使用Nacos提供的基於權重的負載均衡 NFLoadBalancerRuleClassName: com.order.nacos.NacosWeightLoadBalancerRule
4.2 全局配置
調用其他微服務,一律使用基於Nacos權重的負載均衡算法
1 package com.order.nacos.config; 2 3 import com.netflix.loadbalancer.IRule; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 7 @Configuration 8 public class RibbonConfiguration { 9 10 @Bean 11 public IRule ribbonRule() { 12 return new NacosWeightLoadBalancerRule(); 13 } 14 15 }