Nacos 2.x 系列【13】服务权重管理

1. 概述

Nacos服务管理模块,提供了服务权重管理功能,用于给服务实例设置权重,权重越高,被分配的流量越大,即基于权重的负载均衡。

典型的应用场景:

  • 金丝雀发布:新版本上线时,开放小部分流量入口,即设置较小的权重,然后逐步增加,直到完全上线
  • 根据服务器性能合理分配:性能好的服务器分配更高的权重,性能差的服务器分配较小的权重

2. 负载均衡器

在使用服务权重管理功能之前,需要对应用框架进行梳理,否则会导致流量未按照预期权重进行分配:

  • 是否支持按权重分配流量的负载均衡
  • 是否存在自身的负载均衡配置方式,没有使用Nacos的权重属性进行负载均衡

在之前的案例中使用的是以下技术栈:

  • Spring Cloud Alibaba
  • Spring Cloud Gateway
  • Spring Cloud OpenFign
  • Spring Cloud LoadBalancer

案例相关文档:

单个服务的流量入口,主要有外部通过网关直接访问,以及其他服务远程调用。例如订单服务,查询订单时,直接通过网关调用订单服务。下单时,通过用户服务远程调用订单服务(不一定是)。简单示意图如下:
在这里插入图片描述
Spring Cloud Gateway和服务发现中,都使用了 Spring Cloud LoadBalancer作为客户端负载均衡器,它负责从注册中心按照负载均衡策略查询可用实例,默认使用的是轮询策略。

        <!--客户端负载均衡器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

Spring Cloud LoadBalancer作为官方的应用组件, Spring Cloud Alibaba已经集成了基于Nacos权重的负载均衡,相关源码位置如下:
在这里插入图片描述
ConditionalOnLoadBalancerNacos注解中,有一个开关配置:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@ConditionalOnProperty(
    value = {"spring.cloud.loadbalancer.nacos.enabled"},
    havingValue = "true"
)
public @interface ConditionalOnLoadBalancerNacos {
}

所有在Spring Cloud Gateway和服务提供者的应用配置中,都需要添加如下配置,以开启支持基于Nacos权重的负载均衡:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

3. 配置权重

权重为浮点数,范围为 0-10000。权重越大,分配给该实例的流量越大。可以通过以下方式进行权重的配置:

  • 控制台服务详情页面(最简单常用)
  • 客户端 SDK
  • Open API

在控制台中,进入服务列表,点击服务详情,在编辑实例页面中,可以配置权重:
在这里插入图片描述
在集成了Spring Cloud Alibaba时,可以在application.yml中配置:

spring:
  cloud:
    nacos:
      # 服务端用户名密码
      username: nacos
      password: nacos
      # 服务发现
      discovery:
        # 命名空间
        namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
        # 服务端地址,默认:127.0.0.1:8848
        server-addr: 127.0.0.1:8848
        # 服务权重
        weight: 100

在官方Open API 指南中,可以看到在创建、更新实例时,可以指定权重:
在这里插入图片描述

4. 案例演示

4.1 环境搭建

order-demo订单服务中,创建查询当前启动端口的接口,用于区分当前调用的是哪个服务实例:

@RequestMapping("/order")
@RestController
public class OrderController {

    @Value("${server.port}")
    String port;

    @GetMapping("/getPort")
    public String getPort() {
        return port;
    }
}

user-demo用户服务中,通过Feign调用order-demo

@FeignClient("order-demo")
public interface OrderFeignClient {

    @GetMapping("/order/getPort")
    String getPort();
}

@RequestMapping("/feign")
@RestController
public class FeignController {

    @Autowired
    OrderFeignClient orderFeignClient;

    @GetMapping("/getPort")
    public String getPort() {
        return orderFeignClient.getPort();
    }
}

所有服务开启支持基于Nacos权重的负载均衡:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

4.2 默认权重

启动所有服务,其中启动了两个order-demo服务实例,启动端口分别为80808081
在这里插入图片描述

查看order-demo服务实例详情,可以看到默认的权重为1
在这里插入图片描述
通过网关,或者通过用户服务远程调用订单服务:

// 网关访问
http://localhost/order-demo/order/getPort
// 用户服务远程调用
http://localhost:9002/feign/getPort

多次访问查看接口返回的端口值,可以看到权重值一样时,默认是随机访问。

4.3 权重值为零

设置8080端口对应服务的权重值为0
在这里插入图片描述
多次访问查看接口返回的端口值,可以看到权重值为零,该实例将不会被访问到。

4.4 权重不一样

设置8080端口对应服务的权重值为9
在这里插入图片描述
多次访问查看接口返回的端口值,可以看到权重值越高,该实例被访问的次数越多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨 禹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值