目录:
1、Nacos的服务分级存储模型
2、Nacos的权重配置
3、Nacos的环境隔离
一、Nacos的服务分级存储模型
1、概念
一个服务可以有多个实例,例如我们的user-service,可以有:
-
127.0.0.1:8081
-
127.0.0.1:8082
-
127.0.0.1:8083
假如这些实例分布于全国各地的不同机房,例如:
-
127.0.0.1:8081,在上海机房
-
127.0.0.1:8082,在上海机房
-
127.0.0.1:8083,在杭州机房
Nacos就将同一机房内的实例 划分为一个集群。
也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:
杭州机房内的order-service应该优先访问同机房的user-service。
2、给user-service配置集群
1、配置文件:application.properties
#配置当前服务的集群名称,名称自定义的 HZ代指杭州
spring.cloud.nacos.discovery.cluster-name=HZ
2、启动三个用户实列,看看效果
可以看见这里有两个集群,总共三个实列,点击详情可以看见:
存在两个集群,分别是HZ和SH。
小知识,IDEA上面一个服务启动多个实列和配置实列的参数:
选中实列,点击复制,就可以出现新的实列了,也可以在红框哪里给新的实列配置各种参数。
3、服务之间集群调用的使用
1、给订单服务添加集群配置和负载均衡配置:application.properties
#配置当前服务的集群名称,名称自定义的 HZ代指杭州
spring.cloud.nacos.discovery.cluster-name=HZ
#负载均衡策略为:优先访问本集群的服务,如果本集群有多个实列,那么对本集群实列的访问就是随机
#如果本集群没有实列,那么访问其他集群的实列时,采用的是随机策略。
userservice.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
注意:需要把用户服务的权重设置为1。
注意:如果访问的不是本地集群,那么会出现下列的警告:跨集群访问警告
2022-04-20 21:53:26.832 WARN 17844 --- [nio-8080-exec-8] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='192.168.0.103#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.0.103', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}, Instance{instanceId='192.168.0.103#8082#SH#DEFAULT_GROUP@@userservice', ip='192.168.0.103', port=8082, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]
总结:com.alibaba.cloud.nacos.ribbon.NacosRule 负载均衡策略
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才去其它集群寻找,并且会报警告
- 确定了可用实例列表后,再采用随机负载均衡挑选实例
二、Nacos的权重配置
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承但更
多的用户请求。
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
总结:实例的权重控制
- Nacos控制台可以设置实例的权重值,0~1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
三、Nacos的环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
一般开发中,都会存在三个环境,dev-开发环境,uat-测试环境,master-生产环境,这里的环境隔离就是可以根据这个来划分,用来防止 开发环境的服务 访问到了 测试环境的服务。
1、Nacos控制台可以创建namespace,用来隔离不同环境
2、然后填写一个新的命名空间信息:
3、保存后会在控制台看到这个命名空间的id:
4、修改订单服务的配置文件:application.properties
# 命名空间,填ID dev环境
spring.cloud.nacos.discovery.namespace=492a7d5d-237b-46a1-a99a-fa8e98e4b0f9
5、效果
6、此时通过订单服务访问用户服务会报错,因为它们不在同一个环境中。
总结:Nacos环境隔离
- 每个 namespace 都有唯一id
- 服务设置 namespace 时要写id而不是名称
- 不同 namespace下的服务互相不可见,即相互之间不能访问