5.5 Nacos 负载均衡
5.5.1 开启Nacos负载均衡策略
由于 Spring CloudLoad Balance 组件自身有负载均衡配置方式,所以不支持 Nacos 的负载均衡策略。
想使用 Nacos 负载均衡策略,需要我们先开启Nacos的负载均衡策略,也就是在远程调用方,咱们这里的 cook-service 的 .yml 配置文件中进行配置。
server:
port: 8080
spring:
application:
name: cook-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos 地址
loadbalancer:
nacos:
enabled: true # 开启 nacos 的负载均衡策略
5.5.2 权重配置策略
Nacos 对每个节点的流量进行权重配置,每个节点默认权重是 1,权重越低,分配的流量也就越少。
接下来重启 cook-service 服务,然后在 Nacos 管理面板将 9091 端口的服务上线,然后将 9091 端口的节点权重改成 0.2。
改完后,刷新下配置页面:
接下来清空三个 waiter-service 的控制台日志,然后在浏览器多次访问 http:/127.0.0.1/cook/ok?content=给55号桌上可乐鸡翅,接着观察控制台打印的日志:
此时可以发现,端口号 9091 服务权重为 0.2,果不其然被分配的流量就很少了。这就是 Nacos 的权重配置策略。
5.5.3 同集群优先策略
Nacos把同⼀个机房内的实例,划分为⼀个集群。所以同集群优先访问,在⼀定程度上也可以理解为同机
房优先访问。
就拿咱们上面的 cook-service 8080 和 waiter-service 9090/9091/9092 这四个服务来说,咱们一直都是 cook-servic 远程调用 waiter-service 的服务,通过负载均衡自主选择具体调用哪个,咱们只需要在代码中写服务名即可。
对于同集群优先策略是个什么意思呢?咱们先看下面这张图:
这个两个地区的机房,上海机房部署了 cook-service 和 waiter-service 9090,北京机房部署了 waiter-service 9091 和 waiter-service 9092。
简单来说,小区附近开了三家同样品牌的奶茶店,第一家奶茶店就在小区楼下,距离 50 米,第二家和第三家奶茶店在隔壁小区,距离500米,这三家奶茶店提供的奶茶产品都是一样的,价格也是一样的,那么你自然不会去点 第二家和第三家奶茶点的产品了。注意,这个例子有点像物理上的距离,但是在 Nacos 同集群策略中,是采用逻辑区分的,也就是在配置文件中配置,上海机房和北京的机房配置的是同一个集群也可能会出现的。
这也就是 Nacos 的同集群优先策略,会优先访问在同一个集群中的服务节点,当同一个集群中的节点下线了,再去考虑其他集群的节点,当然同一个集群这样的节点可能有多个,只有这个集群的所有节点都挂了才调用其他集群节点。
通过 cluster-name
就能在配置文件中就可以进行配置所属集群名称了。按照上图所示,咱们把 cook-service 和 waiter-service 9090 配置成 SH 上海,把 waiter-service 9091 和 9092 配置成 BJ 北京。
server:
port: 8080
spring:
application:
name: cook-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos 地址
cluster-name: SH # 配置集群名称
loadbalancer:
nacos:
enabled: true # 开启 nacos 的负载均衡策略
server:
port: 9090
spring:
application:
name: waiter-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置 nacos 地址
cluster-name: SH # 配置集群名称
接下来把 waiter-service 9091 和 9092 配置成 BJ,这两个直接在启动时指定参数就行了:
waiter-service 9092 也按照同样的方法设置就行,接下来启动 cook 和 waiter 共四个服务。
打开 Nacos 管理面板可以发现:
集群数目变了,接下来去查看 cook-service 和 waiter-service 的详情页面:
果然 cook-service 和 waiter-service 9090 都是在 SH 集群中,再来看看 waiter-service 9091 和 9092:
waiter-service 9091 和 9092 则在 BJ 集群中,按照 Nacos 的同集群优先策略,咱们此时去访问:
http://127.0.0.1:8080/cook/ok?content=给55号桌上可乐鸡翅
应该只会给 watier-service 9090 去分配流量,多次访问上述接口,查看 waiter-service 9090,9091,9092 的控制台日志输出情况:
果不其然,只有 9090 端口的服务收到了请求,只有当 9090 挂了,才会去给不同集群的 9091,9092 分配流量,这就是 Nacos 的同集群优先策略。
想测试 9090 挂了的情况,也很简单,直接让 9090 服务下线后,进行访问上述接口就 OK 了,此处就不做演示了。