目录
前言
在微服务架构中,服务的注册与发现、配置管理是至关重要的部分。Nacos(Naming and Configuration Service)作为Spring Cloud Alibaba生态中的核心组件,提供了强大的服务发现、配置管理和服务管理功能。本文将详细介绍Nacos的功能、使用方法以及在实际项目中的应用。
一、什么是Nacos?
Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它致力于帮助用户构建易于管理和维护的分布式系统。Nacos的主要功能包括:
服务发现和注册:通过Nacos,服务可以方便地注册自己并发现其他服务,从而实现负载均衡和故障转移。
配置管理:Nacos允许你集中管理配置文件,并在配置变化时实时推送到各个服务。
服务健康监控:Nacos提供了服务健康检查和告警功能,可以监控服务的运行状态。
二、Nacos的主要功能
服务发现与注册
Nacos提供了动态的服务发现与注册功能。服务启动时,会将自身信息(如服务名称、IP地址、端口号等)注册到Nacos服务器中。其他服务可以通过Nacos服务器查询并调用这些已注册的服务。
配置管理
Nacos的配置管理功能允许你集中管理应用的配置文件,并支持动态刷新。你可以通过Nacos控制台方便地添加、修改和删除配置项,服务可以实时获取最新的配置。
服务健康监控
Nacos提供了服务健康检查和监控功能。服务注册到Nacos后,Nacos会定期检查服务的健康状态,并在服务不可用时进行告警。
集群模式
Nacos支持集群模式,可以通过多个Nacos实例组成一个集群,提升系统的可用性和容错能力。
三、安装Nacos
下载Nacos
官方地址:Nacos 快速开始
稳定版下载地址:Release 2.2.3 (May 25th, 2023) · alibaba/nacos · GitHub
下载完后,解压
初始化Nacos
打开conf目录下的application.properties文件
初始化Nacos脚本
初始化后,运行Nacos
进入到bin目录下执行startup.cmd执行文件
默认运行方式是集群模式,本地我就用单机模式运行,二选一启动就行
单机模式
执行cmd命令
startup.cmd -m standalone
集群模式
集群模式启动,在nacos/conf目录下,将文件 cluster.conf.example 复制一份,重命名未cluster.conf,并将所有内容注释,然后再双击startup.cmd / startup.sh文件运行即可。
访问Nacos
启动成功,访问Nacos地址,http://192.168.1.85:8848/nacos/index.html
Nacos的默认账号密码:nacos/nacos
四、服务注册
新建子工程
引入Nacos依赖
<!-- Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置application.yml
server:
port: 9090
spring:
application:
name: demo-user
cloud:
nacos:
discovery:
server-addr: 192.168.1.85:8848
创建启动类
加上 @EnableDiscoveryClient 注解,它是一个Spring Boot注解,用于启用服务发现客户端。它指示Spring Boot应用程序将自身注册到服务发现代理(如Nacos、Eureka、Consul、Zookeeper等)中,并从代理中获取其他服务的地址进行通信。通过启用该注解,我们可以实现微服务之间的互相调用和负载均衡。
运行项目
注册成功,查看Nacos服务
五、命名空间
什么是命名空间?
命名空间(Namespace)是Nacos中一种逻辑上的分区,用于将不同环境、不同项目或不同团队的配置和服务进行隔离和管理。每个命名空间之间是完全独立的,互不影响。
命名空间的主要用途
环境隔离
在实际项目中,通常会有多个环境(如开发、测试、生产等),不同环境的配置和服务需要进行隔离,以避免相互干扰。通过使用命名空间,可以为每个环境创建独立的配置和服务空间,实现环境隔离。
例如,我们可以创建以下命名空间:
dev
:用于开发环境
test
:用于测试环境
prod
:用于生产环境
项目隔离
在一个企业中,可能会有多个项目共用一个Nacos集群。为了避免不同项目之间的配置和服务互相干扰,可以为每个项目创建独立的命名空间。
例如,我们可以创建以下命名空间:
projectA
:项目A的命名空间
projectB
:项目B的命名空间
团队隔离
在大型团队中,不同的团队可能负责不同的模块或服务。为了方便管理和维护,可以为每个团队创建独立的命名空间。
例如,我们可以创建以下命名空间:
teamA
:团队A的命名空间
teamB
:团队B的命名空间
版本控制
在微服务架构中,服务和配置的版本控制也是一个重要的问题。通过使用命名空间,可以为不同的版本创建独立的命名空间,方便进行版本管理和切换。
例如,我们可以创建以下命名空间:
v1.0
:版本1.0的命名空间
v2.0
:版本2.0的命名空间
如何使用Nacos的命名空间?
创建命名空间
- 进入Nacos控制台,点击左侧菜单中的“命名空间”。
- 点击“创建命名空间”按钮,填写命名空间名称和描述,点击“确定”按钮完成创建。
服务注册到命名空间
在Spring Boot项目中,可以通过在配置文件中指定命名空间ID,将服务注册到指定的命名空间:
重新运行项目,服务就已经注册到demo命名空间下了
六、配置中心
什么是 Nacos 配置中心?
Nacos 配置中心是一个分布式的配置管理平台,支持集中化管理应用配置。它允许开发者在一个中心化的地方管理所有微服务的配置,并且能够动态地更新配置,避免了频繁重启服务的麻烦。
配置中心的主要功能
集中化配置管理
Nacos 配置中心提供了一个统一的界面,可以集中管理所有应用的配置。开发者可以在 Nacos 控制台上查看、添加、修改和删除配置项。
配置动态更新
Nacos 支持配置的动态更新,当配置发生变化时,能够实时推送到各个服务实例,确保配置的及时生效。
配置版本控制
Nacos 允许对配置进行版本控制,支持配置的回滚和版本管理,确保配置的可追溯性和可靠性。
配置分组管理
Nacos 支持将配置分组管理,通过 Group 来区分不同的配置集合,方便管理和查找。
配置加密
Nacos 提供配置加密功能,可以对敏感配置进行加密存储,确保配置的安全性。
Nacos配置的多环境管理
在实际开发中,通常一个系统会准备开发环境、测试环境、预发环境、正式环境
那么如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
Data ID方案
Data ID它的命名规则为:${prefix}-${spring.profile.active}.${file-extension},
通过其中的spring.profile.active
属性即可进行多环境下配置文件的读取
1、创建配置文件Data ID为:demo-user-dev.yml
, 其配置如下:
2、创建配置文件Data ID为:demo-user-test.yml
, 其配置如下:
多环境测试
启动项目,并指定spring.profiles.active
,通过不同的环境进行启动
通过上面的配置,将项目分为dev、test两个环境启动后,进行测试
访问 localhost:9090/hello/sayHi 返回:这里是dev
访问 localhost:9090/hello/sayHi 返回:这里是test
可以看到,分别以dev、test启动后相应的读取到不同的配置,dev环境读取到启动端口为9980,test读取到启动端口9981
Group方案
上面介绍了通过指定spring.profile.active
和配置文件的DataID
来使不同环境下读取不同的配置
这里也可以不用DataID
,直接通过Group
实现环境区分
注:这种方式不太推荐,切换不灵活,需要切换环境时要改Gruop配置
1、创建配置文件Data ID为:demo-user.yml
, Group为:DEV_GROUP,其配置如下:
2、创建配置文件Data ID为:demo-user.yml
, Group为:TEST_GROUP,其配置如下:
这里的两个配置文件他们的DataID相同但是Group不同
修改项目中的配置文件
在config下增加一条group的配置,指定配置文件所在的group,可配置为DEV_GROUP或DEV_GROUP
server:
port: 9090
spring:
application:
name: demo-user
cloud:
nacos:
discovery:
server-addr: 192.168.1.85:8848
namespace: demo
config:
server-addr: 192.168.1.85:8848
prefix: ${spring.application.name}
file-extension: yml
namespace: dev
group: DEV_GROUP
启动测试
将group配置为DEV_GROUP
启动进行测试
访问 localhost:9090/hello/sayHi 返回:这里是dev
将group配置为TEST_GROUP
启动进行测试
访问 localhost:9090/hello/sayHi 返回:这里是test
通过指定group的方式启动,DEV_GROUP读取到:这里是dev,TEST_GROUP读取到:这里是test
说明
只通过Group来进行多环境的区分的方式我不推荐使用,因为涉及到了多环境自然就会改变spring.profile.active
,而profile一旦生效,配置文件就会依据DataID的规则进行查找。所以Group的方式仅作参考。
Group的合理用法应该是配合命名空间进行服务列表和配置列表的隔离和管理
命名空间方案
Namespace命名空间进行环境隔离也是官方推荐的一种方式。Namespace的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。
创建命名空间
创建命名空间demo
和dev
,如下图
修改项目中的配置文件
server:
port: 9090
spring:
application:
name: demo-user
cloud:
nacos:
discovery:
server-addr: 192.168.1.85:8848
namespace: demo
config:
server-addr: 192.168.1.85:8848
prefix: ${spring.application.name}
file-extension: yml
namespace: dev
启动测试
将namespace配置为DEV
的ID:dev,启动进行测试
访问 localhost:9090/hello/sayHi 返回:Hello Nacos Demo!
将namespace配置为TEST
的ID:demo,启动进行测试
访问 localhost:9090/hello/sayHi 返回:Hello Nacos Config!
通过指定namespace的方式启动,均可读取到对应的启动端口和相关配置。
说明
Namespace是官方推荐的环境隔离方案,确实有他的独到之处,使用namespace这种方案,同时可以与DataID+profile的方式结合
同时释放Group的限制,大大提高多环境配置管理的灵活性。
配置中心总结
通过上面三种方案的介绍,想必大家对于多环境下的配置读取方式应该有所选择
DataID: 适用于项目不多,服务量少的情况。
Group:实现方式简单,但是容易与DataID方案发生冲突,仅适合于本地调试
Namespace:实现方式简单,配置管理简单灵活,同时可以结合DataID共同使用,推荐这种方案
总结
Nacos作为Spring Cloud Alibaba的重要组件,为微服务架构提供了强大的服务发现、配置管理和服务管理功能。