Nacos Config
是什么?
Nacos 提供用于存储配置和其余元数据的 key/value 存储,为分布式系统中的内部化配置提供服务器端和客户端反对。应用 Spring Cloud Alibaba Nacos Config,您能够在 Nacos Server 集中管理你 Spring Cloud 利用的内部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的代替计划,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着统一的形象,在非凡的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您能够治理这些环境之间的配置,并确保应用程序具备迁徙时须要运行的所有内容。
在理解Nacos Config
之前,如有须要能够先看下上一篇文章: Spring Cloud Alibaba:Nacos 装置及应用。
本篇将具体介绍Nacos Config
配置核心的一些技术实际。
疾速接入
1. Nacos 服务端增加配置
先装置好 Nacos Server,而后启动。装置形式能够参考 Spring Cloud Alibaba:Nacos 装置及应用。
在 配置管理 – 配置列表 中增加一个配置。如下图所示:
编辑好之后点击公布即可。
- Data ID : 个别为利用名称,对应 Spring Boot 我的项目中的
spring.application.name
参数 - Group : 组,个别用来辨别我的项目,此处间接用默认的公共组,后续会具体阐明
- 配置格局: 个别默认为 Properties 格局,你能够依据本人的爱好去切换。
2. 客户端应用
以 Spring Boot 我的项目为例。先增加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在 resource
文件夹中创立配置文件 bootstrap.yml
来配置 Nacos Server 相干的参数,如下所示:
spring:
application: name: nacos-config-base main: allow-bean-definition-overriding: true cloud: nacos: # 权限认证,nacos.core.auth.enabled=true 时须要增加
username: nacos password: James2020+ config: # nacos config 的开关
# enabled: false
prefix: nacos-config-base file-extension: yaml group: DEFAULT_GROUP```
创立启动类 `NacosConfigBaseApplication`,代码如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class NacosConfigBaseApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigBaseApplication.class, args);
while (true) {
// 当动静配置刷新时,会更新到 Enviroment 中,因而这里每隔一秒中从 Enviroment 中获取配置
String userName = applicationContext.getEnvironment().getProperty(“base.name”);
String userAge = applicationContext.getEnvironment().getProperty(“base.age”);
System.err.println(“name :” + userName + “; age: ” + userAge);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }}
下面的代码是每隔一秒,获取一次 `base.name` 与 `base.age` 参数并打印。`applicationContext.getEnvironment().getProperty("base.age");` 这是获取参数的一种形式。还能够用过注解来获取。将启动类的代码正文掉,创立一个 `TestController ` 类,增加如下代码:
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.RestController;
@RefreshScope
@RestController
public class TestController {
@Value(“${base.name}”)
String name;
@Value(“${base.age}”)
String age;
@GetMapping(“/name”)
public String getName() {
return name; }
@GetMapping(“/age”)
public String getAge() {
return age; }
}
咱们能够把 Nacos Config 中配置的参数,当成本地参数一样,应用 `@Value("${}")` 注解来获取。同时加上 `@RefreshScope` 注解以保障能够实时更新。## 多环境隔离
日常开发中,咱们经常会有开发环境,测试环境,预公布环境,生产环境等等。为了更好的区别这些环境,且避免配置凌乱。官网及我集体都十分举荐应用 namespace 进行环境隔离。> 注:Nacos Config 反对 profile 粒度的环境辨别,但集体不倡议这么应用。应用 namespace 做环境隔离更彻底更平安,也更易于治理。### namespace 概念
这里援用官网的概念阐明:> 用于进行租户粒度的配置隔离。不同的命名空间下,能够存在雷同的 Group 或 Data ID 的配置。Namespace 的罕用场景之一是不同环境的配置的辨别隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。### namaspace 创立
关上 Nacos 控制台,在 ** 命名空间 ** 中能够对其进行治理,如下图所示。![nacos-namespace-web.jpg](https://i.loli.net/2020/09/29/hfGVX5Sn9FaueK2.jpg)
要留神的是,在我的项目中如果要指定命名空间,是通过 ` 命名空间 ID` 的,而不是通过名称。配置好了命名空间后,再关上配置列表,则能够在上方看到目前所有的命名空间。不同的命名空间能够容许存在雷同 Data ID 的配置。![nacos-namespace-show.jpg](https://i.loli.net/2020/09/29/i4WzafxEIw2egNj.jpg)
namespace 在代码中的配置如下:
spring:
cloud: nacos: config: # 这里应用的是命名空间 ID namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
### 自定义 Group
个别咱们会应用 namespace 辨别环境,应用 Group 来辨别我的项目,应用 Data ID 辨别配置。以此来治理多我的项目,多环境下的配置文件。Group 个别没有指定的话,默认为 DEFAULT_GROUP。如果须要自定义的话,在 Nacos 控制台,创立配置文件的时候自定义即可。在代码中写法如下:
spring:
cloud: nacos: config: group: SPRING_CLOUD_EXAMPLE_GROUP`
我的项目配置实际
在我的项目理论配置中,集体倡议如下依照如下形式进行配置。
首先,配置文件要依照如下形式建设:
- application.yml : 存储一些不须要放在 Nacos Config 的配置
- bootstrap.yml : 根底配置,配置 Nacos Config 的根底配置
- bootstrap-dev.yml : 环境参数,开发环境
- bootstrap-test.yml : 环境参数,测试环境
- bootstrap-prod.yml : 环境参数,线上环境
配置内容别离如下:
bootstrap-dev.yml
nacos:
server-addr: 127.0.0.1:8848 username: username password: password # 开发环境的 namespace ID namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3```
**bootstrap-test.yml**
nacos:
server-addr: 192.168.9.10:8848 username: username password: password # 测试环境的 namespace ID namespace: a463038a-525b-4ad0-988e-ec71ff043c22`
bootstrap-prod.yml
nacos:
server-addr: 100.100.10.1:8848 username: username password: password # 生产环境的 namespace ID namespace: 0d84f533-74ca-4ca5-9dd8-01e8866cd0c4```
**bootstrap.yml**
spring:
profiles: active: dev application: name: nacos-config-advanced main: allow-bean-definition-overriding: true cloud: nacos: # 权限认证,nacos.core.auth.enabled=true 时须要增加
username: ${nacos.username} password: ${nacos.password} config: server-addr: ${nacos.server-addr} namespace: ${nacos.namespace} prefix: nacos-config-base file-extension: yaml group: SPRING_CLOUD_EXAMPLE_GROUP`
共享配置 & 多配置文件
日常开发中,多个模块可能会有很多共用的配置,比方数据库连贯信息,Redis 连贯信息,RabbitMQ 连贯信息,监控配置等等。
那么此时,咱们就心愿能够加载多个配置,多个我的项目共享同一个配置之类等性能。Nacos Config 也的确反对。
咱们能够应用 spring.cloud.nacos.config.shared-configs
和 spring.cloud.nacos.config.extension-configs
两个参数节点来配置。
配置实例如下:
spring:
application: name: nacos-config-multi main: allow-bean-definition-overriding: true cloud: nacos: username: ${nacos.username} password: ${nacos.password} config: server-addr: ${nacos.server-addr} namespace: ${nacos.namespace} # 用于共享的配置文件
shared-configs: - data-id: common-mysql.yaml group: SPRING_CLOUD_EXAMPLE_GROUP - data-id: common-redis.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP - data-id: common-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
# 惯例配置文件
# 优先级大于 shared-configs,在 shared-configs 之后加载
extension-configs: - data-id: nacos-config-advanced.yaml group: SPRING_CLOUD_EXAMPLE_GROUP refresh: true
- data-id: nacos-config-base.yaml group: SPRING_CLOUD_EXAMPLE_GROUP refresh: true```
参数解析:* data-id : Data Id
* group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。* refresh: 管制该 Data Id 在配置变更时,是否反对利用中可动静刷新,感知到最新的配置值。默认是不反对的。> 这里的 Data ID 须要留神,前面是加 `.yaml` 后缀的,且不须要指定 `file-extension`。这个有一个小坑,那就是在 Nacos 控制台增加配置文件时,Data ID 的命名就要是 `common-mysql.yaml` 这种带后缀的。且后缀名要和配置类型想匹配,否则将会读取不到配置。具体配置如下图所示,可与之前章节的配置比照下,之前章节的 Data ID 是没有带后缀的。![nacos-config-multi-web.jpg](https://i.loli.net/2020/09/29/FIZ9EW12OaelJyv.jpg)
对于多配置文件的优先级问题:1. 后加载的优先级高;2. extension-configs 优先级大于 shared-configs,因为在 shared-configs 之后加载
3. shared-configs 与 extension-configs 的配置列表中,在上面的配置优先级高。## 我的项目源代码
[GitHub - spring-cloud-example](https://github.com/JemGeek/spring-cloud-example)
更多技术文章欢送关注我的博客主页:[http://JemGeek.com](http://JemGeek.com)