Nacos 开发随笔
常用配置
配置内存大小
配置参数
JVM 参数 | 说明 |
---|---|
JVM_XMS=512m | -Xms - JVM 启动时分配的堆内存大小 |
JVM_XMX=512m | -Xmx - JVM 运行过程中分配的最大堆内存大小 |
JVM_XMN=256m | -Xmn - JVM 堆内存中新生代的大小 |
配置方式
- 第一种方式,启动 Docker 容器时指定 JVM 参数
1 | docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest |
- 第二种方式,在 Nacos 的
Env
配置文件中添加 JVM 参数
1 | PREFER_HOST_MODE=hostname |
更改登录密码
- 引入依赖
1 | <dependency> |
- 通过
BCryptPasswordEncoder
类生成新的密码,注意盐值是随机的,所以生成的密码每次都可能不一样,请不要担心
1 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
- 更改 Nacos 的
users
表,指定新的密码
- 若是添加新的 Nacos 用户,可以参考以下 SQL 语句
1 | INSERT INTO users (username, password, enabled) VALUES ('admin', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); |
Nacos 配置中心
三种常见配置方案
在以下三种配置方案中,推荐使用 Namespace 配置方案,因为该方案更灵活,同时可以应付日后不断变化的需求。
配置管理概念
对于 Nacos 的配置管理,是通过 Namespace、Group、Data ID 来定位到一个配置集。
配置项:配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以
key=value
的形式存在。例如经常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。配置集(Data ID):在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的 ID,即 Data ID。
配置分组(Group):配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用
DEFAULT_GROUP
。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个 Group 为:STUDENT_GROUP。命名空间(Namespace):命名空间可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个 Nacos 管理各自的配置,可通过 Namespace 隔离。当在 Nacos 上创建一个配置时,如果未填写命名空间的名称,则命名空间的名称默认为
public
。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
配置最佳实践
Nacos 抽象定义了 Namespace、Group、Data ID 的概念,具体这几个概念代表什么,取决于把它们看成什么,这里推荐一种用法,如下图:
- Namespace :代表不同环境,如开发、测试、生产环境
- Group:代表某项目,如 XX 医疗项目、XX 电商项目、XX 校园项目
- DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
Namespace 与 Group 的其他最佳实践
除了上面介绍的一种最佳实践方法外,还可以为每个微服务创建自己的 namespace
进行隔离,然后利用 group
来区分 Dev、Beta、Prod 等环境。
DataID 配置方案
通过 Nacos 的 DataID 来实现环境区分,即通过指定 spring.application.name
和 spring.profiles.active
来使不同环境下读取不同的配置信息。
- 在 Nacos 中新建配置(DataID),并使用默认命名空间(
PUBLIC
)和默认分组(DEFAULT_GROUP
)
- 可以为不同的环境(比如开发、测试、生产)新建配置(DataID)
- 在
application.yml
配置文件中,通过spring.profiles.active
属性就可以进行多环境下配置文件的读取
1 | server: |
- 在
bootstrap.yml
配置文件中,添加 Nacos 的配置信息,特别是需要指定spring.application.name
属性
1 | spring: |
- 完成上面的配置后,Nacos 客户端就会使用
nacos-config-client-dev.yml
这个 DataID 去 Nacos 配置中心获取对应的配置信息
Nacos 中的 DataID 格完整式
- 在 Nacos 中,DataID 的完整格式是:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来指定file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来指定spring.profiles.active
即为当前环境对应的profile
。特别注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId
的拼接格式会变成${prefix}.${file-extension}
Group 配置方案
在上面 DataID 配置方案的基础上,通过 Nacos 的分组(Group)来实现环境区分。
- 在 Nacos 中新建配置(DataID),同时指定分组(比如
PROD_GROUP
),并使用默认命名空间(PUBLIC
)
- 可以为不同的环境(比如开发、测试、生产)新建配置(DataID),并指定不同的分组
- 在
application.yml
配置文件中,通过spring.profiles.active
属性指定需要激活哪个环境的配置
1 | server: |
- 在
bootstrap.yml
配置文件中,添加 Nacos 的配置信息,特别是需要指定spring.application.name
和spring.cloud.nacos.config.group
属性
1 | spring: |
- 完成上面的配置后,Nacos 客户端就会使用
PROD_GROUP
分组和nacos-config-client-prod.yml
这个 DataID 去 Nacos 配置中心获取对应的配置信息
Namespace 配置方案
在上面 Group 配置方案的基础上,通过 Nacos 的命名空间(Namespace)来实现环境区分。
- 在 Nacos 中创建命名空间(Namespace),用于区分不同的环境
- 在指定的命名空间(比如
Prod_Namespace
)下,新建配置(DataID),同时指定分组(比如PROD_GROUP
)
- 配置完成后的结果如下
- 在
application.yml
配置文件中,通过spring.profiles.active
属性指定需要激活哪个环境的配置
1 | server: |
- 在
bootstrap.yml
配置文件中,添加 Nacos 的配置信息,特别是需要指定spring.application.name
、spring.cloud.nacos.config.group
和spring.cloud.nacos.config.namespace
属性
1 | spring: |
- 完成上面的配置后,Nacos 客户端就会使用
Prod_Namespace
命名空间、PROD_GROUP
分组和nacos-config-client-prod.yml
这个 DataID 去 Nacos 配置中心获取对应的配置信息
Maven 引入不生效
错误日志信息
Spring Cloud 项目引入 Nacos Config 的 Maven 依赖后,使用 @Value
注解无法读取 Nacos 配置中心的内容,抛出的异常信息如下
1 | Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'common.name' in value "${common.name}" |
第一种错误原因
Spring Cloud 无法读取项目中的 bootstrap.yml
配置文件,此时需要额外引入 spring-cloud-starter-bootstrap
依赖来解决
1 | <dependency> |
第二种错误原因
项目中 bootstrap.yml
配置文件的内容有误,导致 Nacos Config Spring Cloud 无法通过正确的 dataId
去 Nacos 配置中心获取对应的配置信息,正确的配置示例如下所示:
1 | server: |
上述
bootstrap.yml
配置文件对应的 Nacos Config 配置内容如下图所示
上述
bootstrap.yml
配置文件的详细说明如下
在 bootstrap.yaml
配置文件中,需要配置 spring.application.name
,因为它是构成 Nacos Config 配置管理 dataId
字段的一部分。值得一提的是,在 Nacos Config Spring Cloud 中,dataId
的完整格式如下:
1 | ${prefix}-${spring.profiles.active}.${file-extension} |
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置,目前只支持properties
和yaml
类型spring.profiles.active
即为当前环境对应的profile
。特别注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId
的拼接格式会变成${prefix}.${file-extension}