Nacos 概念
背景
为什么要用 测试环境 开发环境 生成环境,数据库连接信息都是放在配置文件中的,跟着项目代码一起通过 Git 管理,的确是有蛮大的数据泄露的风险。只要有了 git pull
的权限,就直接能操作线上数据库,为了避免脏数据或者误操作,生成环境都不建议直接操作数据库。我们可以通过以下几个方面降低数据的风险:
- 将数据库连接信息等敏感配置从项目中剥离;
- 数据库增加 IP 白名单连接限制;
- 最小权限原则:每个账号只配置所必需的权限,避免删表删库等高危操作;
- 定期修改数据库账号、密码;
上述问题的第一点 将数据库连接信息等敏感配置从项目中剥离
,那么数据放到哪里呢。使用 Nacos 配置管理模块,将敏感配置信息都存放到 Nacos 中。通过命名空间区分不同环境(开发、测试、预发、生产),通过 “版本控制” 保证变更可追溯,通过 “快速回滚” 保证错误变更时影响最小。
服务发现和健康检查
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生 SDK、OpenAPI、或一个 独立的 Agent TODO 注册 Service 后,服务消费者可以使用 DNS TODO 或 HTTP&API 查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP) 和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测 2 种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的 UI 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
命名空间
用于对配置文件细粒度的隔离,不用命名空间下,可以存在相同的 Group
或者 Data ID
的配置。
常用场景是不同环境下配置的隔离(官方建议)。
领域模型
Nacos 数据是由三元组确定唯一 {Namespace}{Group}{ServiceId}
服务领域模型
原理
内嵌轻量级基于 Derby
分布式关系型存储
如果配置文件数量较少,在集群模式下需要高可用数据库集群作为支撑的成本太大,期望有一个轻量的分布式关系型存储来解决。
设计目标,是期望nacos存在两种数据存储模式,一种是现在的方式,数据存储在外置数据源(关系型数据库);第二种方式是内嵌存储数据源(Apache Derby)。用户能够使用命令行参数配置的方式,随意使用这两种数据存储模式
快速上手
启动配置管理
Maven
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=appName
启动顺序
# 由低到高 高的覆盖低的
classpath:/,classpath:/config/,file:./,file:./config/
# 配置文件类型
yaml,properties
Application
// 通过 Spring Cloud 注解 @RefreshScope 实现配置自动更新
@RefreshScope
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
提示: 你可以使用 spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新
启动服务发现
Maven
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
bootstrap.properties
# 端口号可以让 spring 自己分配,以实现服务的水平扩展
server.port=8070
spring.application.name=appName
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
Application
// 通过 Spring 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.cl