在如今,微服务架构因其灵活性、高可用性等优点,已是后端开发者面向中大厂不可或缺的一项技术。而微服务架构管理服务器集群的核心,便是注册中心。Nacos作为阿里巴巴开发的一种功能强大的注册中心,其收到了广大开发者的推崇。这篇文章,将会从Nacos的背景、安装、使用配置等方面进行讲述,让你领略Nacos的强大之处
背景
在前言中笔者也提到过,Nacos是一个阿里巴巴开发的产品,现在也是成为SpringCloud的一个组件(附SpringCloud官网链接,感兴趣的可以去看一下)
为什么要有注册中心?其中一个很重要的原因便是服务器ip映射。试想一下,如果你使用硬编码的方式将服务器ip写入配置文件,到时候服务器挂掉了,你就需要换一个服务器继续运行服务,要重新修改配置文件,再重新进行部署等一系列操作,这就显得十分臃肿。而注册中心可以将你预先设置好的服务名映射到服务器ip。先将服务名、服务器ip和端口进行注册,当注册中心进行服务发现时,你便可以直接向它询问服务名所对应的服务器ip,这样注册中心便会给你返回一个可用的、健康的服务器ip,服务器切换也不用重新修改配置部署,十分灵活
在Nacos出现之前,其实已经有另外一款很火的注册中心产品名叫Eureka,相比于Eureka,Nacos的功能更加丰富(比如分布式配置),能够满足更多的开发需要
安装
Nacos官网:
Nacos GitHub仓库:
下载完压缩包后解压,解压后文件目录如下:

其中nacos的配置文件在.\conf\application.properties

nacos默认端口8848,配置文件中可以修改端口等一些设置,可以自行配置
nacos服务启动脚本位于 .\bin\startup.cmd,windows双击即可启动,或者使用cmd命令:
1 | startup.cmd -m standalone |
-m代表模式(model)
standalone表示单击启动模式
使用
Nacos服务管理
Nacos服务注册与发现
微服务各框架之间其中一个相同点在于都具备注册中心的服务发现(ServiceDiscovery)和服务注册(ServiceRegistry),接下来让我们在springboot脚手架中引入依赖,这里有两种方式生成脚手架:
1.spring官网生成(推荐)
SpringBoot脚手架生成:
springboot推荐使用3.2.x版本,此版本与springcloud兼容性很好
父工程脚手架生成示例:

然后点击页面下方GENERATE生成
2.idea生成
直接上图
先新建工程

填写项目信息

选择依赖

然后点击create创建
因为spring官方没有在脚手架提供nacos依赖,所以我们得在子工程中手动引入。创建子工程,什么依赖都不用引入,然后在父工程的pom.xml的dependencies节点中中引入:
1 | <dependency> |
在子工程的pom.xml中加入(引入nacos之前要记得把eureka依赖注释掉):
1 | <dependency> |
依赖引入完成
启动naocs
注:可能在启动nacos的时候会出现一些问题导致无法启动,这大概率是Nacos 开启了认证功能,但没有配置 token.secret.key,此时如果你的电脑装有python环境,可以运行: py -c “import os, base64; print(base64.b64encode(os.urandom(32)).decode())” 。然后在nacos配置文件中填入密钥
对Nacos进行配置
在子工程的application.yml文件中加入以下配置:
1 | spring: |
此时便完成了对nacos进行注册
之后访问nacos可以直接访问服务名来获取服务的各种信息
Nacos服务分级存储
Nacos支持对服务器集群进行管理
一个服务可以部署在多个集群,集群之下又有多个实例
大致的nacos服务分级存储模型如下:

这里可能会有人问:为什么要加入“集群”这个概念?
A:就像你玩minecraft与朋友进行联机时一样,你与同你在一个局域网下的朋友联机时,一般不会又多少延迟,游戏体验极好;如果你与远在外省的朋友尝试内网穿透联机的时候,可能会因为延迟问题十分头疼
一个互联网大厂,它可能有很多个服务器集群,一个在北京,一个在上海,一个在杭州,一个在深圳,服务在它们集群内部互相调用访问与跨集群调用,相信大部分人都知道哪个方式访问的效率更高。由此可见,跨集群调用是服务调用的下策
当然,集群属性可以在服务配置文件中修改:
1 | spring: |
这样,你的服务就配置在了BJ集群中,到时候BJ集群内部服务会优先访问
有时,nacos服务端也会被放到一个集群中进行统一管理来实现nacos的高可用
Nacos负载均衡
当有十万个用户对你们的网站进行访问,面对如此大的访问量,负载均衡就显得十分必要了
负载均衡的原理简单来说就是你配置一套用户访问服务器的规则,使用户的每次访问合理得分配到多台服务器中,使这一整个服务器集群一同承担着用户得大量请求
nacos同样也支持负载均衡,你可以在application.yml中进行配置:
1 | usernacos: # 服务名、 |
NacosRule的规则是优先访问本地集群,如果本地集群不存在服务器再随机访问外部集群
有时集群内的服务器情况也不是一致的,可能会有老机子能够承担的访问量比较少,又或者有些机子性能很高能够承担更多的访问,这时,我们可以配置服务的权重
在nacos服务面板的服务右侧有服务的编辑按钮


这样,你就成功修改了访问权重,一般地,访问频率会与服务之间的权重比成正比
如果你将某个服务的权重设为0,等一下它的被访问频率变为0,你就可以对这个服务进行平滑升级,整个过程十分丝滑(/▽\)
Nacos环境隔离
这里引入一个**Nacos命名空间(Namespace)**的概念,这是位于Nacos服务存储和数据存储的最外层,用来做最外层隔离,处在不同namespace的服务互相无法访问。在其下还有叫Group的一个层级,它们之间的关系大致如图:

service/data之下便是集群那一些概念了
默认命名空间为public
默认group为default_group
你可以在nacos管理页面增加命名空间,获取命名空间id,然后在application.yml中配置:
1 | spring: |
Nacos与Eureka对比
这是nacos注册中心的大致工作图:

这是eureka:

由此,我们可以直观得看到,nacos比eureka多了临时实例和非临时实例的概念,nacos对于非临时实例,除了服务每隔一段时间发出心跳,注册中心也会每隔一段时间主动询问服务是否健康,如若服务状态发生变化,注册中心也会主动向服务消费者推送更新服务提供者的信息,健康监测方面比eureka更加完善
- 对于临时实例,心跳不正常的服务会被注册中心剔除,而非临时实例不会
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
服务注册nacos时可以选择临时或非临时实例:
1 | spring: |
Nacos配置管理
Naocs不光支持对服务的管理,它还支持配置管理
有时要对部署在大量服务器上的服务的配置进行修改来满足需要,你会发现一个一个服务进行配置修改费时费力,效率极其低下。nacos就提供了一种能够将配置进行统一配置的方法
微服务启动后,它会自动读取nacos上的配置,再和自身的配置进行合并。nacos配置管理还支持配置的热更新,当你在nacos上修改配置,对应的服务的配置会即刻生效,无需重启
新建配置


**Data ID:**服务名-运行环境(如dev).yaml
**Group:**基本默认就行
**描述:**随便填
**配置内容:**填写有热更新需求的配置
微服务配置拉取
配置获取的步骤如下图:

从这图我们可以看出来,nacos中的配置文件比本地配置文件先读取,但nacos的服务端地址信息存在application.yml中,这不禁让人产生疑问:如何获取nacos地址?
这时候,spring提供的bootstrap.yml就起了作用。它的优先级比application.yml高很多,我们可以把nacos的服务端地址或其他必要信息填写在bootstrap.yml中,这样就可以优先读取nacos的位置信息了
要使用nacos配置管理,要在客户端添加以下依赖:
1 | <!--nacos配置管理依赖--> |
然后再在服务的resource文件夹下添加bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml
1 | spring: |
你会发现,以上配置可以找到nacos服务,并且拼接起来就是配置的Data ID,这样就顺理成章地找到了配置
配置热更新
在nacos中配置修改后刷新页面有时似乎并不能更新,这时也许是你使用了**@Value注解进行配置装配。如果你想实现配置的热更新,你需要在你使用@Value注解的类上使用@RefreshScope**注解,这样热更新便会正常生效
或者我们创建一个配置类使用**@ConfigurationProperties注解实现配置自动加载,这种方式不用再加@RefreshScope**注解便可以实现配置的热更新
多环境配置共享
之前我们提到过,新建配置时Data ID:服务名-运行环境(如dev).yaml,其中运行环境可以不填,那么就是:服务名.yaml,这时候这个配置就会无视服务的运行环境,任何运行环境的服务都会应用这个配置
举个例子,现在有两个usernacos服务,一个运行环境为dev(开发环境),另一个为test(测试环境),我在nacos新建了两个配置,一个配置叫:usernacos-dev.yaml,另一个叫:usernacos.yaml,然后我在usernacos-dev.yaml中写:
1 | pattern: |
在usernacos.yaml中写:
1 | pattern: |
我们可以写一个获取配置的方法并让配置的值输出在页面上
那么最后读取的结果是怎样的呢?
结果证明,开发环境的usernacos服务的页面上这两个配置都出现了,而测试环境的usernacos服务的页面上只出现了”多环境”
由此可见,如果新建配置的时候不标明环境,这个配置便是多环境共享的
顺带一提,如果这两个配置文件出现了相同的配置,读取这两个配置的服务会以usernacos-dev.yaml为准,它的优先级更高
优先级:服务名-profile.yaml > 服务名称.yaml > 本地配置
Nacos集群
关于nacos集群,前面简单介绍过,nacos也是存在于集群实现高可用的,如果一个nacos挂掉了,会立刻有另外一个nacos接替进行工作
集群架构图:

Q:如何让多个Nacos共享数据?
A:可以使用MYSQL集群,让多个nacos都来访问这个集群
Q:用户请求时,如何将请求分发到不同的Nacos节点?
A:使用Nginx的方向代理和负载均衡
至于nacos集群如何搭建,可以参考这个文档:
总结
总而言之,Nacos是一款功能完善的微服务注册中心,了解它对掌握微服务相关技术绝对有着很大的帮助



说些什么吧!