Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相对于Eureka功能更加丰富,在国内受欢迎程度较高。
home (nacos.io)
在WIndows环境下安装,首先我们要进入Nacos的官网,然后点击【前往Github】的按钮,来到Nacos的项目地址:
然后我们点击红色框中的位置,这个位置就是下载的位置,版本可能不一样,点进来之后就像是这样的:
在这里的这个位置就是对应的版本的下载,然后很明显,tar包就是Linux的,zip就是Windows的,所以我们选择下载zip包,这个下载过程会比较慢。
下载好之后,我们就可以将压缩包解压到一个没有中文目录的路径下,解压之后就是这个样子的:
其中,Nacos的默认端口号是8848,如果你发现你的端口已经被占用了,那么你可以到conf目录下找到application.properties文件修改serve.port的值:
我们来到bin目录下:
其中,startup就是启动的文件,然后我们在当前目录下打开一个黑窗口,然后输入命令启动:
./startup.cmd -m standalone
其中-m表示启动模式,standlone表示单机模式,之后会介绍到集群启动模式。
启动之后就是这样的:
服务启动成功之后,我们就可以输入服务的网址然后查看服务的UI控制界面:
输入上面的网址之后,你看到的服务界面是这样的:
磨人的账号密码都是nacos:
之后,我们就进入到了nacos的控制台。
服务注册到Nacos
修改对应服务的yml配置文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
其实就是一个指定cacos服务的过程。
然后,在Nacos的UI界面中的服务列表中,就可以看到配置的两个服务消息:
在之前我们看到过将将启动一个服务的多个实例,在Nacos中,引入了地域的概念,或者称为机房的概念,Nacos将存在于同一个机房中的多个服务称为集群,也就是在Nacos的服务分级中,首先最上级的是服务,然后服务下面是存在于不同地域的集群,集群下面,是存在于不同服务器上的实例:
服务调用尽可能选择本地集群服务,跨集群调用延迟较高
本地集群不可访问,再去访问其他集群。这就是为什么Nacos要配置地域的概念,就是尽量减少跨服务器访问的延迟。
spring:
cloud:
nacos:
serber-addr: localhost:8848 # Nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州
然后我们点击【详情】按钮,就可以查看具体有哪些集群,以及集群中都各自有哪些实例:
现在就可以看到有两个集群,分别是HZ和SH
在默认情况下,即使配置了Nacos的地域,也不会马上应用Nacos的地域优先的访问规则,而是继续之前的轮询的负载均衡规则,这时候就需要手动修改负载均衡的规则:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
discovery:
cluster-name:HZ # 配置集群名称,也就是机房位置
userserver:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
然后当我们访问业务的时候,就会优先选择与请求服务的服务器处于同一地域的服务器。
当同一地域中包含多个同一服务的实例的时候,这时候的选择规则是随机选择。也就是说他的负载规则就是优先地域,而后随机。
如果停掉与请求服务处于同一地域的其他服务器,那么再次请求的时候,会请求其他地域的服务,此时会出现一条警告:
意思就是说,我现在是出于HZ的集群,但是我访问了一个处于SH的集群的服务。如果你看到类似的警告出现,那么就说明你的本地集群的服务出现了问题没有被优先访问。
实际部署中会出现这样的场景:
服务器设备性能有差异,部分梳理所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大访问频率越高。
权重就是手动控制某个服务器承担更多负载的手段。
设置负载均衡可以使用Nacos的UI界面进行设置:
首先点击【详情】:
然后点击【编辑】:
在这里,就可以设置服务器的权重:
一般权重的设置范围是0~1之间,如果权重为0,则不会访问这台服务器。作用就是在版本升级,或者需要关闭,重启服务器的时候,就可以将权重设置为0,然后可以重启服务器进行升级,然后慢慢的升高权重,做到【无感升级】
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层的隔离:
对于命名空间的设置同样可以在Nacos的UI界面中设置:
然后点击【新建命名空间】:
然后填写命名空间相关信息:
命名空间的名称和描述是我们必填的,然后命名空间的ID如果不填就默认是一个UUID。
点击【确定】就可以看到一个新的命名空间:
spring:
cloud:
nacos:
serever-addr: localhost:8848
discovery:
cluster-name: SH
namespace: # 命名空间的ID
然后重启对应的服务的实例,就可以在UI界面中看到服务已经转移到了另一个环境中。
在不同环境下的两个服务永远不会被访问到。
nacos的原理与之前的eureka的执行原理是基本相同的,有一点与之前不一样的是,在服务消费者请求服务的时候,并不是每次请求的时候才回去拉取服务器列表,而是定时拉取,并缓存在自己的服务列表缓存中,这样就不用每次请求都拉取可用服务器列表。
并且nacos还有一个特点是【临时实例】,也就是cos将实例分为临时实例和非临时实例,两者最大的区别就是在做心跳检测的时候。当某一台实例是临时实例的时候,nacos会和Eureka一样,定时做心跳检测,当某一次检测时候,临时实例挂掉了,那么nacos就把这个实例剔除自己的维护列表中,这一过程和Eureka是一样的。但是当某一台实例是非临时实例的时候,并不会由提供者去发心跳检测,而是由nacos主动去发请求去询问服务器的健康状态,等于是相反的过程,并且当非临时实例,nacos并不会直接将实例剔除自己的维护列表,而是将实例标记为不健康,并等待实例恢复健康。
并且还有一个区别在于消费者在拉取列表的时候,在之前的Eureka的时候,是消费者要发送请求的时候,主动拉取并缓存服务列表,但是这个拉取有时间延迟,如果有服务器在这个延迟期间挂了,但是在下一次拉取之前有人访问这个服务,那么就会出现问题,所以nacos在拉取列表的时候,除了可以让消费者主动拉取之外,nacos的注册中心还会【主动推动变更消息】,也就是当服务器发生变化的时候,主动将这个变化发送到消费者端。
然后就是在服务中配置非临时实例,测试一下两个实例的不同之处,服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
设置好之后,来到UI界面的实例详情界面,就可以看到这里的服务器发生了变化:
临时实例为true的表示临时实例,临时实例为false的,就是刚才配置的非临时实例。
当我们把服务停掉的时候,nacos并不会将它删除,知道操作人员手动删除实例。