用了 3 年 Apollo,最后我选择了 Nacos,原因不多说了
共 7929字,需浏览 16分钟
· 2021-03-24
cnblogs.com/cjsblog/p/14007311.html
本文探讨Nacos作为配置中心,如何实现不同环境(开发、测试、灰度、正式)的配置管理问题
就像Maven用groupId、artifactId、version三者来定位jar包在仓库中的位置一样,Nacos也提供了 Namespace (命名空间) 、Data ID (配置集ID)、 Group (组) 来确定一个配置文件(或者叫配置集)
由此,实现多环境配置的方案也有三种:
1、用命名空间(namespace)来区分不同的环境,一个命名空间对应一个环境;
2、用配置组(group)来区分不同的环境,命名空间用默认的public即可,一个组对应一种环境;
3、用配置集ID(Data ID)名称来区分不同的环境,命名空间和组用默认的即可,通过文件命名来区分;
接下来,逐个来看
http://{host}:{port}/nacos
http://{host}:{port}/nacos/index.html
默认用户名密码都是nacos
![](https://filescdn.proginn.com/3ef7dc6482b07547e015e9c0c8a0259d/5c126a9a92873cb9b2b8da80bd2200c1.webp)
为了方便演示,这里建了一个名为example的Spring Boot项目
![](https://filescdn.proginn.com/73dc1f55489a4b0d5ff0603d49246220/a4f4d2ed662a19da14090953ea0d0c67.webp)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>example</name>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
bootstrap.yml
spring:
application:
name: example
cloud:
nacos:
config:
server-addr: 192.168.100.10:8848
file-extension: yaml
HelloController.java
package com.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ChengJianSheng
*/
@RestController
@RequestMapping("/hello")
@RefreshScope
public class HelloController {
@Value("${greet.hello}")
private String greet;
@GetMapping("/sayHi")
public String sayHi() {
return greet;
}
}
1. 利用 Data ID 命名 来区分环境
利用Data ID命名来区分环境,命名空间和组默认即可
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成
${prefix}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
![](https://filescdn.proginn.com/7f60a231efa70778ce2dd764bb5f6491/41f2aed28565f207f8d1ee0b8e7e27a0.webp)
![](https://filescdn.proginn.com/96d4dd86628972e23b65fb8b94daf2c2/80768dc52d1778dd4928ec210df44ba8.webp)
![](https://filescdn.proginn.com/1600e7de2c80078b24b05c79857a0eaf/4dcf810ec594491956b9af29a2b12b95.webp)
![](https://filescdn.proginn.com/ab5c73c83d097128edfbe5bb605ef55f/60a1448d87f8fab6c48e3bbe4675d251.webp)
![](https://filescdn.proginn.com/8e69ea1ab5bdd0ce02727bea674b783e/e0e17c98d384e05b8509c3d9f1aac679.webp)
用命令行启动也是一样的
![](https://filescdn.proginn.com/732b058419ca362442f7c5e887b6c5aa/d3156ab9dc5ffbffb859b9669283a2b5.webp)
例如:
java -Dspring.profiles.active=test -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/2d5a0159632d98d2ec514adb8ea4d6c1/c52d0c3616d47b369674257d9c9a2711.webp)
2. 利用 Group 来区分环境
项目不变,我们把spring.application.name改成example2
命名空间用默认的public
![](https://filescdn.proginn.com/ba4c6c3fe1c3cea93e31ff66d6277a48/f33b2d454df74913b631ca12ed505b9b.webp)
![](https://filescdn.proginn.com/a0fabee787ab454b505a46dedb485070/168496aa2a4d324335cc92ea59c324f3.webp)
![](https://filescdn.proginn.com/6924c4e6b451c1023bccd0fb83c5853c/43d3eda87d458e78f986bcd6f4bcbaf1.webp)
java -Dspring.cloud.nacos.config.group=DEV_GROUP -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/fe82b5606586536406375ed6c68da8f0/1a76875346b4d73c974ae8e1ac785ebe.webp)
java -Dspring.cloud.nacos.config.group=TEST_GROUP -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/5d26ce79dca2559747abbb89ac83f7a4/7ec0a9b21b5e8cce87ea8eb51beda5d3.webp)
java -Dspring.profiles.active=test -Dspring.cloud.nacos.config.group=TEST_GROUP -jar example-0.0.1-SNAPSHOT.jar
如果是这样的话,这个时候,Data ID 命名就应该是 example2-test.yaml
3. 利用 Namespace 区分环境
![](https://filescdn.proginn.com/3cdfb055076fdce9c62f8526d8b7ecc5/f6455b4ed5b156a794b5b330bc7c8700.webp)
创建命名空间的时候,如果不指定ID,则自动生成的id就是这样的uuid字符串,我们还是自己指定一个有意义的ID吧
![](https://filescdn.proginn.com/617078da091a2a567ee7154b4c0ecc51/3520059433aa99dde8084069c2d277a6.webp)
![](https://filescdn.proginn.com/ec1405de3d21bcffd0d645c03d379a1d/29ef4ee1abc01615a280fdbb4c43153a.webp)
![](https://filescdn.proginn.com/dc2aa1a536f3cc6655973591f46e051e/5f5a1222a3946df4db7fb4b147f39adb.webp)
![](https://filescdn.proginn.com/3a5fc8f5feaab8ab9234fa67d0713ad5/dc4a1e01bfa152e167e38edf000b69b8.webp)
![](https://filescdn.proginn.com/2d7926a82c36c58416cfb61a73a683fa/28a6ce6239c53bf38cb26191959cb0d1.webp)
![](https://filescdn.proginn.com/f069ce0d9d54dc4870e7023d81a3062b/9b0c032c28c628ebab9d939738ddc916.webp)
![](https://filescdn.proginn.com/f626ae0a73618e365e5931d1e086eb34/fc780fbeaafbd657426657b552c6fef2.webp)
java -Dspring.cloud.nacos.config.namespace=ns_dev -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/92926e068c43f9fb8229acced83dacdf/79ac1432e86acf34fd29df6453393b8d.webp)
java -Dspring.profiles.active=dev -Dspring.cloud.nacos.config.namespace=ns_dev -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/aa714d788c909c57f1905de5d8720c98/135789c302a7b27e082e62b7811873f1.webp)
java -Dspring.cloud.nacos.config.namespace=ns_test -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/07b8bec78bc99079b5b9d9b41a53deb8/2719a7e502e63ec819f58d7e7b925b75.webp)
java -Dspring.profiles.active=test \ -Dspring.cloud.nacos.config.namespace=ns\_test \ -Dspring.cloud.nacos.config.group=TEST\_GROUP \ -jar example-0.0.1-SNAPSHOT.jar
![](https://filescdn.proginn.com/713bc15ed8b89b3770f8a590fb892fd5/00012101f5f640b7c6d44ab8f31b59fc.webp)
4. 小结
第一种,用 Data ID 区分环境,虽然简单,但是每个项目要创建4个配置文件,随着项目的增多,都在一个命名空间下回显得很混乱,查找起来也不是很方便,而且不利于做权限控制
第二种,用Group区分,问题也是一样的
综上,最好的是用Namespace区分环境,清晰明了,而且有利于做权限控制
https://nacos.io/zh-cn/docs/concepts.html