我们通过修改启动参数新添加一个实例 :
参数如下 :
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
指定 user-service 的8083的实例集群为上海集群
从Nacos的Web页面我们可以看到, 此时有三个实例, 两个所属杭州集群, 另外两个所属上海集群
默认情况下 Nacos 还是使用的轮询的负载均衡策略, 如果我们想要实现集群优先的负载均衡的话, 就要添加如下配置 :
user-service: # 微服务名称
ribbon: # 负载均衡规则
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
如果之前配置过 Eureka 负载均衡规则,只需要修改下即可
配置完成以后, 重启下 order-service , 然后访问 http://localhost:8080/order/101~106
如上图可以看到所有的请求都发送到了SH 集群里 , 这样我们就实现了集群的负载均衡
之所以所有的请求都发送到了SH集群里, 是因为 order-service 的微服务也属于 SH 集群, 一般情况下优先访问同一集群的服务
实际部署中会出现这样的场景:
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在nacos控制台,找到 user-service 的实例列表,点击编辑,即可修改权重:
备注 : 如果权重修改为 0,则该实例永远不会被访问
修改后需要注意的是, 上面我们把微服务8083的集群修改为SH, 和order-service微服务的集群一致
这样再次访问, 哪怕修改了权重, 大概率也是访问同一集群内的微服务实例
所以为了区分, 我们把8083的微服务实例集群修改为 BJ
重启微服务, 然后再次访问 http://localhost:8080/order/101~106 查看, 可以看到服务是优先请求权重搞的微服务实例的
Nacos提供了namespace来实现环境隔离功能。
默认情况下,所有service、data、group都在同一个namespace,名为 public:
我们可以新建一个命令空间 :
创建后是下面这样的, 我们可以通过命名空间ID去配置对应的命名空间
修改 order-service 微服务的application.yml配置 :
spring:
cloud:
nacos:
discovery:
cluster-name: SH # 配置集群
namespace: dev-01 # 配置namespace (namespace ID)
server-addr: localhost:8848
根据上面新建的namespace 自定义的 id , 添加相关配置, 配置完成以后重启微服务
重启以后即可在服务列表的dev命名空间看到, 如上图 但是要注意的是不同命名空间的服务是隔离的
也就是说, 现在 order-service 无法访问到 user-service 微服务了
当我们尝试调用的时候, 就会出现 No instances available for user-service
Nacos的服务实例分为两种类型:
配置一个服务实例为永久实例 :
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH # 配置集群
# namespace: dev-01 # 配置namespace (namespace ID)
ephemeral: true # 配置实例为永久实例
Nacos与eureka的共同点
Nacos与Eureka的区别
Nacos支持服务端主动检测提供者状态:
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
Nacos集群默认采用AP方式强调服务的可用性
当集群中存在非临时实例时,采用CP模式, 强调数据的可靠性和可用性
Eureka采用AP方式