Nacos
Nacos
环境要求:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- Maven 3.2.x+;下载 & 配置。
这篇基于
Ubuntu Server 20.04
openjdk 1.8.0_275
Nacos 1.4.1
部署Nacos
下载 & 解压
github地址,下载最新稳定版
# 指定你的安装路径
cd ~/Developement/Alibaba
# 下载
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
# 解压
tar -zxvf nacos-server-1.4.1.tar.gz
# 进入目录
cd nacos/bin
# 启动服务
bash ./startup.sh -m standalone
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
-
访问
我的Ubuntu是Server版本,没有浏览器,所以在物理机通过ip访问,ip是Linux的ip,假设为 192.168.100.100,则铜鼓浏览器访问
http://192.168.100.100:8848/nacos
用户名:nacos
密码:nacos
配置Nacos
单机模式支持mysql
- 1.安装数据库,版本要求:5.6.5+
- 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
- 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
将nacos数据存储到mysql中
# 先在mysql中创建数据库 nacos_config
# 打开路径找到官方提供的mysql脚本
cd $NACOS_HOME/conf
# 将nacos-mysql.sql导入数据库
# 修改配置文件
vi $NACOS_HOME/conf/application.properties
# 将以下部分取消备注,或直接添加到配置文件中
spring.datasource.platform=msyql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&auto Reconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=dev
db.password.0=dev
# 上面的内容在配置文件中被注释掉了,可以直接修改,其中注意要修改数据库名字,它默认是nacos,也可以创建数据库的时候命名nacos,其次修改数据库用户名和密码
- shutdown nacos,重启可以连接到mysql数据库
配置中心
配置中心的相关信息,必须要配置到
bootstrap.yaml/properties
配置文件中
概念说明
-
命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
-
配置分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。
-
配置集 ID
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
基于dataId获取配置
-
依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
启动类
@SpringBootApplication public class NacosService1Application { public static void main(String[] args) { SpringApplication.run(NacosService1Application.class, args); } }
-
创建命名空间和配置
-
bootstrap.yaml
spring: application: name: nacos-config cloud: nacos: config: server-addr: 192.168.43.130:8848 # 配置中心地址 file-extension: yaml # 配置文件格式 # dataId的名称是application.name + file-extension = nacos-config.yaml namespace: 373887af-7114-4348-927f-8b15e2a4e223 # 指定dev开发环境命名空间的ID group: DEFAULT_GROUP # 不指定就是默认组 refresh-enabled: true # 启用自动刷新,默认开启,即修改了配置中心的参数,能自动获取到最新的值
-
测试类
@RestController @RequestMapping("/config") public class NacosConfigController { @Resource private ConfigurableApplicationContext context; @GetMapping("/get") public String getConfig() { String name = context.getEnvironment().getProperty("user.name"); String age = context.getEnvironment().getProperty("user.age"); String out = "user: {name: " + name + ", age: " + age + "} <br/>"; return out; } }
-
输出结果
调用
http://localhost:56010/config/get
user: {name: nacos-config, age: 18}
profile粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为
${spring.application.name}.${file-extension:properties}
为前缀的基础配置,还加载了dataid为${spring.application.name}-${profile}.${file-extension:properties}
的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的${spring.profiles.active}
这个配置项来配置。
-
bootstrap.yaml
spring: application: name: nacos-config profiles: # ${spring.profiles.active} 当通过配置文件来指定时必须放在 bootstrap.properties 文件中 active: develop
-
配置中心
-
测试代码
@RestController @RequestMapping("/config") public class NacosConfigController { @Resource private ConfigurableApplicationContext context; @GetMapping("/get") public String getConfig() { String name = context.getEnvironment().getProperty("user.name"); String age = context.getEnvironment().getProperty("user.age"); // 获取当前部署的环境 String env = context.getEnvironment().getProperty("current.env"); String out = "in " + env + " user: {name: " + name + ", age: " + age + "} <br/>"; return out; } }
-
输出结果
in develop-dev user: {name: nacos-config, age: 18}
自定义拓展DataId
- 通过
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式来支持多个 Data Id 的配置。- 通过
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。- 通过
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。- 多个 Data Id 同时配置时,他的优先级关系是
spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。
- 配置文件
-
bootstrap.yaml
spring: application: name: nacos-config profiles: # ${spring.profiles.active} 当通过配置文件来指定时必须放在 bootstrap.properties 文件中 active: develop # 指定develop环境 dataId会以${spring.application.name}-${profile}.${file-extension:properties}形式组成 cloud: nacos: config: server-addr: 192.168.43.130:8848 # 配置中心地址 file-extension: yaml # 配置文件格式 # dataId的名称是application.name + file-extension = service1.yaml namespace: 373887af-7114-4348-927f-8b15e2a4e223 # 开发环境 # group: DEFAULT_GROUP # 默认组 # refresh-enabled: true # 启用自动刷新,默认开启 # 拓展DataId配置 ## 1 默认组 DEFAULT_GROUP 内,不支持配置的动态刷新 extension-configs[0]: data-id: ext-config-common01.yaml ## 2 不在默认组内,不支持动态刷新 extension-configs[1]: data-id: ext-config-common02.yaml group: GLOBALE_GROUP ## 3 不在默认组内,支持动态刷新 extension-configs[2]: data-id: ext-config-common03.yaml group: REFRESH_GROUP refresh: true
-
测试类
@RestController @RequestMapping("/config") public class NacosConfigController { @Resource private ConfigurableApplicationContext context; @GetMapping("/get") public String getConfig() { String name = context.getEnvironment().getProperty("user.name"); String age = context.getEnvironment().getProperty("user.age"); // 获取当前部署的环境 String env = context.getEnvironment().getProperty("current.env"); // 获取拓展的dataId String common01 = context.getEnvironment().getProperty("common01.value"); String common02 = context.getEnvironment().getProperty("common02.value"); String common03 = context.getEnvironment().getProperty("common03.value"); String out = "in " + env + " user: {name: " + name + ", age: " + age + "} <br/>" + "common01: " + common01 + "<br/>common02: " + common02 + "<br/>common03: " + common03; return out; } }
-
输出结果
in develop-dev user: {name: nacos-config, age: 18} common01: common01 common02: common02 common03: common03