Nacos- 負載均衡和服務實例的權重配置


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM