目录
一、前言
nacos作为Spring Cloud Alibaba微服务体系中一个非常重要的组件,在微服务治理中担当着不可替代的角色,比如作为分布式配置中心,服务注册中心,相比其他的配置中心和注册中心来说,nacos具有更出色的性能以及云原生优势,本篇将从多个维度全面深入的学习nacos这个组件。
二、nacos介绍
nacos官网:nacos官网 ,中文参考手册地址:中文手册
2.1 什么是 Nacos
- Nacos 致力于帮助您发现、配置和管理微服务。帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理;
- Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施;
2.2 nacos 核心能力
2.2.1 服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
1、Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;
2、Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式;
3、Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量
2.2.2 动态配置服务
- 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
- 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的控制台,可以管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
2.2.3 动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表
2.2.4 服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
2.2.5 nacos生态地图
2.3 与其他配置中心对比
在微服务治理生态中,作为配置中心来说其实是有很多选择的,比如大家熟知的zk,apollo,consul等,如下是springcloud生态中可以作为技术选型的配置中心对比,从各项指标对比来看,nacos可以说是非常完美的存在,其优势是不言而喻的。
三、nacos快速部署
在之前的一篇,springcloud-alibaba整合nacos 中分享了如何快速部署单机nacos,还是比较简单的,为了方便后面的演示说明,这里再简单做一下说明;
3.1 获取安装包
安装包下载地址:下载地址
选择完版本后,可以选择linux或者windows环境的安装包下载即可
我这里选择了zip压缩包
3.2 修改脚本启动模式
nacos启动脚本里面提供了集群模式和单机模式启动两种方式,由于本机搭建使用,选用单机模式即可,修改启动脚本中如下的关键参数;
3.3 启动nacos 服务
修改并保存脚本之后,双击启动服务
3.4 访问控制台
启动成功之后,按上图中地址访问nacos的客户端控制台,默认登录用户名和密码:nacos/nacos
登录成功后,看到如下的控制台界面;
四、连接mysql
配置文件的信息在实际的生产环境中是需要持久化保存的,nacos服务默认启动之后,配置信息是保存在本地内存中,一旦重新启动就丢失了,因此安全起见,我们将其配置信息持久化到数据库,配置的话也很简单,按照下面的操作步骤
4.1 前置准备
创建一个mysql数据库
4.2 操作步骤
4.2.1 导入安装包下nacos的建表sql
导入完成后,可以看到nacos的一些表
4.2 修改配置文件
修改conf下的application.properties,主要修改mysql的连接信息
4.3 重启nacos服务
重启之后,后面再操作nacos的数据将会存储到nacos的数据表中。
五、nacos配置管理
接下来详细说明一下配置管理中相关重要的菜单项的使用说明,如下图所示
5.1 配置管理菜单
配置管理是用于集中管理微服务中的各类配置信息的,比如为了减少开发,测试,生产等不同的环境下因为配置文件带来的麻烦,可以在这里进行分门别类的做管理。
5.1.1 配置列表
配置列表维护环境中所有的配置文件,使用很简单,直接创建即可
对上面的配置参数做简单的补充说明:
-
Data ID命名时,建议使用具有业务通识含义的全局唯一的名称,比如以 dev,test等区分不同的环境;
-
Group,具有相同业务归属的建议使用相同的分组,避免都使用DEFAULT_GROUP;
-
配置内容中建议不要包含敏感信息;
最佳实践
5.1.2 历史版本
通过该项,可以查看指定配置的历史变更信息,便于信息的追溯
六、nacos权限管理
使用权限管理可以更好的对配置文件的读写权限进行控制,nacos的权限体系比较简单,主要涉及到用户,角色和权限三个模块;
使用权限管理需要在application.properties配置文件中开启下面的配置项
### If turn on auth system:
nacos.core.auth.enabled=true
6.1 用户
即具体登录nacos控制台的账户,你可以在这里管理nacos的账户,如添加新的账户,删除账户等,比如使用的默认账户nacos;
6.2 角色
即操作资源的身份,某个账户要能使用某个功能,必须具备这个角色才有操作权限,你可以在这个创建一个新的角色,并为某个账户绑定这个角色;
6.3 权限
具体的权限项,比如为某个具体的角色,具体的资源授权,权限可以是读或写,或者读写,那么被角色关联的账户就具备了操作这个资源的权限;
七、nacos命名空间
命名空间这个概念相信大家并不陌生,也不是nacos的独创,命名空间是为了更好的区分微服务之间的使用边界的一种用于实现逻辑隔离的概念,有点像docker容器的概念,即你只能在自己的容器内使用,使用过apollo的同学对此应该有较深的体会,apollo在使用的时候,不同的应用之间一定要通过nacos去管理;
7.1 创建命名空间
为你的微服务创建一个新的命名空间,名称最好见名知意
创建完成后,回到配置列表,可以看到在默认的public右侧就多了order和user这两个命名空间
7.2 创建配置文件
后续如果我们需要在user微服务下创建配置文件,就可以切换到user这个命名空间下创建,就能更好的区分和维护不同命名空间的配置文件了;
八、Spring Cloud 使用 Nacos
接下来将从多个维度详细介绍下在springcloud中如何使用Nacos
8.1 前置准备
导入依赖,在工程中导入如下依赖,第一个是使用nacos的配置使用,第二个是将nacos作为配置中心时使用;
<!--nacos-config 配置中心-自带动态刷新-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery 注册中心-服务发现与注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
8.2 读取nacos配置
上面在某个命名空间下创建完成配置文件后,就可以在程序中进行读取了,具体使用步骤如下:
8.2.1 配置文件
使用nacos时,关于nacos的连接配置需要在一个bootstrap.yaml 中进行设置
springboot加载配置文件优先级:bootstrap.yaml > application.yaml
bootstrap.yaml 配置如下:
server:
port: 8087
spring:
application:
#这里的名称和nacos中的配置文件名称保持一致
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
#指定要加载的配置文件的格式后缀名
file-extension: yaml
application.yaml配置如下:
spring:
profiles:
active: dev
关于这里两个配置文件的内容为什么要这么做,官方文档给了如下说明:
简单来说可以这么理解:
1、spring.application.name 的值为nacos配置文件的名称;
2、nacos配置文件的名称需要拼接application.yaml中的环境变量名,比如上文的:dev;
3、通过这种写法,可以在本地的配置文件中,根据环境的不同,快速切换不同的环境;
8.2.2 nacos添加一个配置文件
在默认的public命名空间下添加如下配置文件
配置内容如下:
config:
info:
name: nacos center
8.2.3 添加测试接口
为了测试效果,使用一个接口读取nacos的配置
@RestController
@RefreshScope
public class ConfigController {
@Value("${config.info.name}")
private String configName;
@GetMapping("/get/config")
public String getConfigName(){
return configName;
}
}
8.2.4 模拟测试
启动工程后,调用接口测试,发现可以正常读取到上面的配置信息
8.3 namespace与group使用
通过上文中对于namespace的讲述了解了namespace在nacos中的使用,从微服务配置管理的设计思想来说,通过namespace + group的划分,可以更加精准的管控应用归属的配置信息,真正做到比较安全的隔离,下面来具体说说不同场景下namespace + group的组合使用。
8.3.1 同一个namespace不同dataid
在上文,我们使用的是默认的namespace即public,nacos-config-client-dev.yaml 配置文件名称即应用层级的唯一名称,这里叫做 Data Id;
再创建一个新的配置文件,名为:nacos-config-client-test.yaml,配置内容如下
config:
info:
name: config center,test
创建完成后可以看到列表中新增了一个配置文件
修改如下配置文件
启动工程后,再次测试接口,此时读取到的就是test的配置文件中的信息
8.3.2 不同namespace的配置读取
再在user这个namespace下面也创建一个nacos-config-client-dev.yaml的配置文件
config:
info:
name: config center,ns user
工程中bootstrap.yaml加上namespace的配置,注意namespace的值是那一长串字符串;
启动工程后再次读取配置,可以看到本次读取的就是新的配置文件里的信息
8.3.3 不同group的配置读取
上文在public命名空间下没有配置分组的情况下,默认使用的都是DEFAULT_GROUP这个分组,如果希望读取自己分组下的配置怎么做呢?可以自定义一个新的分组。
这样在user这个命令空间下就多了一个分组user_test_group,并且在这个分组下,有一个nacos-config-client-test.yaml的配置文件;
修改bootstrap.yaml配置文件,添加group信息
启动工程后再次读取配置,可以看到本次读取的就是新的配置文件里的信息
8.4 nacos动态刷新配置
还记得在最早使用springcloud 的config配置中心的时候,如果某个配置文件发生了变更,程序中无法实时加载到这个最新的配置信息,而是需要配合其他的组件才能使用,而在nacos中就不必这么麻烦了;
nacos提供了@RefreshScope注解,在需要动态获取配置的类上面加上该注解就可以准实时的获取nacos中发生变更的配置信息;
在上面的接口类中,加上这个注解
@RestController
@RefreshScope
public class ConfigController {
@Value("${config.info.name}")
private String configName;
@GetMapping("/get/config")
public String getConfigName(){
return configName;
}
}
再最后一个测试用例中,我们去user这个命名空间下,修改一下nacos-config-client-test.yaml中的配置信息;
修改完毕后保存发布,在不重启工程的情况下,再次调用接口,可以看到最新的配置信息已经读取到;
有心的同学可能会发现,当修改了配置文件信息后,控制台中输出了如下的内容,我们猜测可能是这个@RefreshScope注解的背后存在某种机制,能够动态的感知或者说监听到nacos中的配置文件内容的变化;
九、写在最后
本文通过大量的篇幅详细介绍了nacos的各种场景的使用,对于使用springcloud alibaba这一套微服务治理框架的同学来说,nacos可以说必须要熟练掌握,同时,可以通过阅读源码深入了解其背后的架构设计思路,对于自身也是不错的借鉴。