Nacos可以搭建集群环境,以下是它的分级存储层级模型。
集群环境
现在有一个user-service
的服务在提供用户相关的功能,我们可以将该服务运行在多个地方,北京、上海、杭州…则有了多个实例,在每一个地方的实例中,我们称为一个集群,当然,现实中,一个集群要通过一个集群名称来约束,让这些实例都运行在该集群名称下面,则构成了集群的环境。需要注意的是,在一个集群中,并不是只有一个服务user-service
的实例在运行,还有其他的服务也在同样的集群中,相互调用,比如该系列中的order-service
调用user-service
,两个服务可以运行在同一集群下,这也是集群存在的意义,同一集群的相互调用必然比跨集群快。
服务跨集群调用问题
服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群。
以下模拟集群的搭建:
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的集群
以下就是配置完成的示意图:
在Nacos中也可以看到:
user-service
order-service
当杭州中的order-service
向user-service
发起请求时,会先向杭州自己集群中的user-service
发起请求,如果杭州里面的user-service
挂掉了,会发起一次跨集群的调用:向上海的集群发起请求,当然如果还存在其他地方的,会根据自己配置的策略来选择目标集群。
规模扩大
如果集群的规模逐渐扩大,到达以下的情况:
那么单个集群中的的服务之前的调用策略是怎么做的呢,比如:杭州集群中存在两个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属性即可。