Nacos可以搭建集群环境,以下是它的分级存储层级模型。

集群环境

现在有一个user-service的服务在提供用户相关的功能,我们可以将该服务运行在多个地方,北京、上海、杭州…则有了多个实例,在每一个地方的实例中,我们称为一个集群,当然,现实中,一个集群要通过一个集群名称来约束,让这些实例都运行在该集群名称下面,则构成了集群的环境。需要注意的是,在一个集群中,并不是只有一个服务user-service的实例在运行,还有其他的服务也在同样的集群中,相互调用,比如该系列中的order-service调用user-service,两个服务可以运行在同一集群下,这也是集群存在的意义,同一集群的相互调用必然比跨集群快。

Nacos服务分级存储模型

服务跨集群调用问题

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群。
以下模拟集群的搭建:

user-service

我们在配置文件中配置集群的参数

spring:
  application:
    name: userservice # userservice的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos的注册地址
      discovery:
        cluster-name: ShangHai    #这里的Shanghai模拟的是上海集群中的user-service服务实例

配置完成之后,启动项目,在启动之前,需要先启动Nacos服务,不然会报错。

启动成功之后,通过Idea的多实例运行方式,更改原来的配置文件为以下,模拟杭州的集群:

spring:
  application:
    name: userservice # userservice的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos的注册地址
      discovery:
        cluster-name: HangZhou    #这里的HangZhou模拟的是上海集群中的user-service服务实例

同理,将order-service的配置也更改为HangZhou的集群

以下就是配置完成的示意图:

image-1655212600800

在Nacos中也可以看到:

user-service
user-service

order-service
order-service
当杭州中的order-serviceuser-service发起请求时,会先向杭州自己集群中的user-service发起请求,如果杭州里面的user-service挂掉了,会发起一次跨集群的调用:向上海的集群发起请求,当然如果还存在其他地方的,会根据自己配置的策略来选择目标集群。

image-1655213000171

规模扩大

如果集群的规模逐渐扩大,到达以下的情况:

image-1655213457222

那么单个集群中的的服务之前的调用策略是怎么做的呢,比如:杭州集群中存在两个order-service和两个user-service,当order-service调用user-service的时候,该选择哪一个实例呢,这就要配置Nacos的负载均衡策略:
order-service服务的配置文件中,配置:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #这里也可以配置负载均衡策略------有集群的时候

可以看到很熟悉,和之前配置Ribbon的负载均衡策略是类似的,只是更换了策略的方式而已。

总结

  • Nacos服务分级存储模型

    • 一级是服务,例如user-service
    • 二级是集群,例如杭州、上海
    • 三级是实例,例如杭州机房的某台部署了user-service的服务器
  • 如何设置实例的集群属性

    • 修改application.yml配置文件,添加spring.cloud.nacos.discovery.cluster-name属性即可。