实际上集群分区概念在之前的Eureka中也有出现,比如:
- eureka:
- client:
- fetch-registry: false
- register-with-eureka: false
- service-url:
- defaultZone: http://localhost:8888/eureka
- # 这个defaultZone是个啥玩意,为什么要用这个名称?为什么要要用这样的形式来声明注册中心?
在一个分布式应用中,相同服务的实例可能会在不同的机器、位置上启动,比如我们的用户管理服务,可能在成都有1台服务器部署、重庆有一台服务器部署,而这时,我们在成都的服务器上启动了借阅服务,那么如果我们的借阅服务现在要调用用户服务,就应该优先选择同一个区域的用户服务进行调用,这样会使得响应速度更快。
因此,我们可以对部署在不同机房的服务进行分区,可以看到实例的分区是默认:
我们可以直接在配置文件中进行修改:
- spring:
- application:
- name: borrowservice
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
- # 修改为重庆地区的集群
- cluster-name: Chongqing
当然由于我们这里使用的是不同的启动配置,直接在启动配置中添加环境变量spring.cloud.nacos.discovery.cluster-name
也行,这里我们将用户服务和图书服务两个区域都分配一个,借阅服务就配置为成都地区:
修改完成之后,我们来尝试重新启动一下(Nacos也要重启),观察Nacos中集群分布情况:
可以看到现在有两个集群,并且都有一个实例正在运行。我们接着去调用借阅服务,但是发现并没有按照区域进行优先调用,而依然使用的是轮询模式的负载均衡调用。
我们必须要提供Nacos的负载均衡实现才能开启区域优先调用机制,只需要在配制文件中进行修改即可:
- spring:
- application:
- name: borrowservice
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
- cluster-name: Chengdu
- # 将loadbalancer的nacos支持开启,集成Nacos负载均衡
- loadbalancer:
- nacos:
- enabled: true
现在我们重启借阅服务,会发现优先调用的是同区域的用户和图书服务,现在我们可以将成都地区的服务下线:
可以看到,在下线之后,由于本区域内没有可用服务了,借阅服务将会调用重庆区域的用户服务。
除了根据区域优先调用之外,同一个区域内的实例也可以单独设置权重,Nacos会优先选择权重更大的实例进行调用,我们可以直接在管理页面中进行配置:
或是在配置文件中进行配置:
- spring:
- application:
- name: borrowservice
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
- cluster-name: Chengdu
- # 权重大小,越大越优先调用,默认为1
- weight: 0.5
通过配置权重,某些性能不太好的机器就能够更少地被使用,而更多的使用那些网络良好性能更高的主机上的实例。