目录
1. Nacos是什么?
Nacos是Alibaba推出的一款全新的,可以替代Eureka注册中心的微服务组件之一。
我们都知道,在做微服务项目时,我们可以通过Eureka将各个服务注册进去,完成服务的拉取调用;那么我们的Nacos也是一个服务注册中心。而且,Nacos不仅可以作为一个注册中心,还可以当作配置中心来使用,直接可以替换掉我们之前所使用的 SpringCloudConfig 组件,可以说是一个顶俩,此外,Nacos还有一些附加的功能属性,这里就不再一一举例了,我们直接进入正题。
2. Nacos注册中心功能怎么用?
想要使用Nacos这款分布式组件,首先我们要下载它,下载的过程可能有些繁琐耗时,这里就不展示了,没有下载的可以去搜索相关博客进行下载。
在微服务项目中想要使用Nacos完成功能模块的注册,简单分为一下几步
(1)启动Nacos
安装好我们的Nacos之后,打开nacos文件中的bin文件夹,
点击启动就可以了,这里要注意使用单机启动,因为Nacos默认为集群启动。
如果不知道怎么改,有两个办法,看我演示
方法一:使用命令行的形式
还是进入我们nacos文件的bin目录文件下,如下所示
输入cmd回车,会出现黑窗口命令行,在黑窗口中输入startup.cmd -m standalone "翻译过来就是以单机模式启动"
启动成功如下图
方式二:修改文件配置
使用编辑模式打开我们的启动器 startup.cmd 文件,把文件中的集群改成单机set MODE=“standalone”就可以了,这里我已经改好了
改过之后保存,仍然双击这个文件就可以启动了,启动成功之后页面和方式以是一样的。
(2)在父工程中方添加Spring-Cloud-Alibaba依赖
<!--nacos的管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
这里面的版本可不是乱用的,每个alibaba组建的版本所对用的springboot版本和springcloud版本都是有联系的,如果你的与我不一致,可以去alilbababa官网搜索与自己版本一致的使用,否则后期可能会出现一些奇怪的小bug
(3)添加Nacos客户端依赖
<!-- nacos客户端依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
这里的客户端依赖要在每一个微服务项目的pom.xml文件中都要引入,否则Nacos是不会注册它们的。
(4)修改yml文件
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos端口地址
在pom文件中添加依赖之后,还要在各个项目的yml文件中配置nacos的地址和端口,因为我的是本机,所以就写成了localhost,但是在实际开发中,nacos都是集群配置,每一个nacos都要写真实的ip和端口,端口号不改默认就是8848.
(5)启动项目测试
完成了上述依赖配置和文件配置,我们就可以进行测试了,打开浏览器输入localhost:8848;
如下图所示,这里我已经注册成功了几个实例,点击详情还可以查看各个实例的详细信息。
3. Nacos服务分级存贮模型
在我们的nacos中,它还添加了一个服务分级存贮模型的概念,什么意思呢?
我们都知道,一个微服务项目是非常庞大的,可能我们的一个业务会有很多的模块,在部署的时候,我们可以把它部署在同一台机器上,一个服务下面对应多个实例,这就好比是把所有的鸡蛋放在同一个篮子里。如下图所示:
但是,有一个问题,如果有一天机房出现故障了,那业务不就停掉了吗?这肯定是不行的,那该怎么办呢?
nacaos中就设置了分级存储模型,添加了一个集群的概念。
在之前,我们的一个服务可以对应多个实例;但现在,我们的一个服务可以对应若干个集群,集群下面又对应多个实例,在中间加了一层,如下所示
当我们的业务越做越大,我们可以在多个城市部署多个集群;就算未来有一天,某个机房出故障了,那也只是其中的一个集群挂掉了,但另外的集群仍然可以运作,对我们的业务不会造成较大影响。
那么在nacos中怎样设置分级存储模型呢?
很简单,我们只需要在yml文件中设置一个属性就可以了,
nacos:
discovery:
cluster-name: SZ
我们在yml文件中nacos的下一级设置一个discovery的属性,这里有一个cluster-name就是用来设置集群名称的,名字可以随便起,配置好之后,我们重启项目,在浏览器中再去看nacos,点击我们配置的一个实例,点击详情,这里就会显示我们刚才配置的集群名称“SZ”
4. NacosRule负载均衡
我们知道,在Eureka中,我们可以配置负载均衡规则,在nacos中,也是可以配置负载均衡规则的。
配置方法也是在yml文件中
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
因为我们的orderservice业务调用了userservice业务,所以要在orderservice的yml文件中配置调用userservice时的负载均衡规则。
而且,当我们配置了NacosRule之后,它会默认优选选择同集群的机器访;当同集群的机器都出现故障访问不了时,它才会访问同业务的其他集群,并会爆出跨集群访问警告,但不会报错;此外,NacosRule是随机负载均衡。
5. Nacos服务权重配置
当我们设置了集群之后,请求会到达我们的多台设备,nacos会根据随机负载均衡去挑选一台设备。但是,有些激起他们的性能是有差异的;假设有两台机器,机器A性能好,机器B性能差,我们希望机器A能多处理一些请求,机器B能少处理一些请求,怎么做呢?
我们就可以通过设置服务权重来实现,在nacos控制台,如下图
点击一个实例,我们可以点击编辑,设置其权重,所有实例默认都为1,权重越小,被随机访问的概率越低,就能达到我们的目的。
另外,当我们权重调成0时,是无法被访问的,我们就可以在实际开发中做到一个平滑的升级。
6. Nacos环境隔离
因为我开在开发时,有开发环境,有生产环境,有测试环境。怎么样能将它们隔开呢?
这里就可以用到我们Nacos的环境隔离,怎么做呢?
很简单
第一步:
第二步:
第三步:
第四步:在yml文件中进行配置,如下
我么还是在orderservice业务的yml文件下,discovery下方配置namespace属性即可,namespace的值为随机生成的id。
完成上述步骤之后,重启服务,当我们再查询订单时,就查不到了,也因为他们的namespace不一样,被隔离在了两个环境下。
7. Nacos与Eureka的区别
Eureka注册中心是AP,更加注重可用性,我们的服务消费者会调用服务提供者,并把服务提供者列表缓存起来,每隔30s会再次从Eureka拉去一次更新,如果在30s内有服务挂掉,Eureka是不会主动提醒服务消费者的,就会造成不一致性,而且Eureka发现有服务挂掉之后,是不会把它从服务列表中剔除的,而是等它恢复正常。
Nacos是AP+CP,既可以选择AP,又可以选择CP。在Nacos中,所有的实例默认都是临时实例,当所有实例都是临时实例时,nacos和eureka一样都是AP,当nacos中有非临时实例时,就会转变成CP。
服务提供者
因为在Nacos中,我们可以为一个实例设置是永久实例还是临时实例。它们两个在做健康检测时,是不太一样的。
如果是临时实例,也是通过心跳总检测,与Eureka一样,每隔一段时间发送一次心跳,发送频率比Eureka要快;当它挂掉之后,Nacos会把它从服务列表中剔除。
如果是非临时实例,Nacos会主动向非临时实例发送请求,询问它是否还健康可用;当它挂掉之后,Nacos不会把它剔除,而是将它标记为不健康状态,等它恢复正常。
服务消费者
Eureka采用的是Pull拉取的方式,消费者会从Eureka注册中心中拉取自己所需要的服务列表,并短暂的缓存起来,这样下次再调用同一个服务时,就不需要再次拉取了,而是直接从缓存服务列表中拿到消费即可;
Nacos是采用Pull+Push(拉取和推送),除了Pull和Eureka一样之外,多了一个Push(推送)的功能,Nacos每隔一段时间会主动将服务列表推送给消费者;
Nacos每隔一段时间去更新服务列表,而且,当我们有服务挂掉之后,nacos会马上推送消息给服务消费者,告诉它有所变更,保证了服务的一致性。