Nacos.02.组件之统一配置中心
Posted 潮汐先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nacos.02.组件之统一配置中心相关的知识,希望对你有一定的参考价值。
Nacos组件之统一配置中心
前言
前面我们提到过Nacos是alibaba提供的既可以作为服务注册中心也可以作为统一配置中心的组件。上一节我们已经了解了其作为服务注册中心简单使用,下面我们来学习一下Nacos作为统一配置中心的简单使用。
介绍
之前我们介绍springcloud的统一配置中心组件config的时候,我们知道各服务节点的配置文件是放在远程Git仓库中的,Config Server拉取远程仓库里面的配置文件到本地之后通过负载均衡策略提供给Config Client。
Nacos则不然!相较于Spring Cloud Config,client端的配置文件不需要放在远程仓库中,而是放在Nacos Server中。我们可以在Nacos的管理界面查看client的配置文件,如下图①
核心概念
Nacos中有三个核心概念:命名空间、Data ID、Group,分别对应上面的②、③、④。对于不同公司或者不同人对于这三个概念的理解和使用略有差别,但归根结底都是用来区分项目或者服务的。
命名空间
Nacos中将命名空间单独作为一个菜单,提供了一个默认的保留空间public,默认最大的配置数是200。如下图所示:
默认的保留空间public是不可以编辑、删除的;
每一个命名空间对应一个唯一的ID,Nacos Client的预配置文件中配置命名空间时用到的就是这个ID;
这里我们将命名空间用作隔离每个项目配置文件的作用来使用,我们新建一个命名空间:STUDY,如下图
Group
我们站在项目中的每个服务的角度来看,Group的作用就是用来隔离每个项目中不同服务的配置文件,通常我们将一个服务归为一个Group。同样的Nacos提供了一个默认Group–DEFAULT_GROUP
。
如果我们不想使用默认的分组可以在新建项目配置文件的时候修改分组名称。
Data ID
Data ID是获取一个配置文件的唯一标识,通常我们以配置文件的文件名来命名。同一个命名空间的同一个分组下面的Data ID是不能重复的,这样通过namespace + Group + Data ID
的组合就可以唯一确定一个配置文件。
configclient-profile.properties
我们在配置列表页面右上角点击+
打开新建配置文件页面,如下图
按照下图内容所示添加configclient-dev.properties
,最后点击发布即可
发布成功后我们可以在配置列表中看到我们刚才创建的配置文件
如果有多个命名空间的话创建配置文件之前记得先选择命名空间
同样我们新建配置文件configclient-prod.properties
,如下图
返回配置文件列表可以看到configclient-dev.properties
与configclient-prod.properties
,这样我们后面Config Client所需要的两个配置文件就准备完毕了
在上述两个配置文件中加上
spring.cloud.nacos.discovery.namespace=50c32b33-b5e8-48ac-a731-7dbb556301f8
,作用是指定当前服务注册到STUDY命名空间。否组默认注册到PUBLIC。
Config Client开发
1.新建Module
2.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud_alibaba_parent</artifactId>
<groupId>com.christy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>02.springcloud_alibaba_config_client</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos config client-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
3.bootstrap.properties
# 告诉config server地址
spring.cloud.nacos.config.server-addr=192.168.8.120:8848
# 告诉从哪个命名空间获取配置
spring.cloud.nacos.config.namespace=50c32b33-b5e8-48ac-a731-7dbb556301f8
# 告诉从哪个组进行配置获取
spring.cloud.nacos.config.group=CONFIG_CLIENT
# 第一种获取配置文件方式 dataId = name + file-extension
# 从这个组中拉取那个配置文件
spring.cloud.nacos.config.name=configclient-prod
# 拉取这个配置那个后缀的配置文件
spring.cloud.nacos.config.file-extension=properties
# 第二种获取配置文件方式 dataId = prefix + env + file-extension
# spring.cloud.nacos.config.prefix=configclient
# spring.profiles.active=prod
# spring.cloud.nacos.config.file-extension=properties
4.ConfigClientApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author Christy
* @Date 2021/7/22 10:31
**/
@SpringBootApplication
public class ConfigClientApplication
public static void main(String[] args)
SpringApplication.run(ConfigClientApplication.class, args);
5.TestController.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author Christy
* @Date 2021/7/22 10:33
**/
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@Value("$customer.username")
private String username;
@RequestMapping("/hello")
public String sayHello()
log.info("Hello," + username);
return "Hello," + username;
@RefreshScope不要忘记加了,Nacos另外一个比较强大的功能就是通过这个注解可以自动实现刷新配置文件,而不需要像SpringCloud Config那样通过Bus+webHook的方式来实现自动刷新配置文件
6.测试
我们启动服务,在浏览器输入http://localhost:8811/test/hello
。由于我们访问的prod的配置文件,所以页面显示Hello,Christy
。如下图:
我们修改configclient-prod.properties
配置文件中的username,再次访问结果如下:
当我们修改username的时候,控制台会显示出修改的键,再次访问浏览器结果也会显示出刷新后的值
历史版本
Nacos也可以像git远程仓库一样记录配置文件每次修改的记录,我们可以在配置管理-历史版本
中输入Data ID和Group进行查询
我们可以查看每个版本的具体配置,也可以选择后面的回滚按钮回滚到指定版本,比如我们回滚到上个版本
点击回滚配置
后我们在浏览器中再次访问http://localhost:8811/test/hello
,输出结果也回到了上个版本,而且回滚的时候控制台也打印出了刷新的键
本系列专题源码已经上传至gitee:https://gitee.com/tide001/springcloud_parent,欢迎下载交流
-------------------------以下内容2021-11-04日新增,跟以上内容不属于一个项目-------------------------
共享配置
在微服务架构中,我们会有很多服务。而每个微服务的配置文件中都需要配置像数据库连接
、服务注册
之类的信息。如cloud-integral-prod.yml
中的配置文件所示:
server:
port: $port:9031
datasource:
spring:
application:
name: cloud-integral #服务名称,必须,保证唯一
druid:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=utf8&useSSL=false
max-active: 10 # 连接池配置
cloud:
nacos:
discovery:
server-addr: www.nacos.com:80 #指定nacos-server的地址
username: nacos
password: nacos
namespace: christy-prod #服务发布到指定的namespace,默认是public
group: christy-prod-group #服务发布到指定的group,默认值是DEFAULT_GROUP
我们可以将这些重复的配置抽取出来放到单独的一个配置文件中,作为每个微服务的共享配置。我们新建一个配置文件common-prod.yml
,内容如下:
spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=utf8&useSSL=false
max-active: 10 # 连接池配置
cloud:
nacos:
discovery:
server-addr: www.nacos.com:80 #指定nacos-server的地址
username: nacos
password: nacos
namespace: christy-prod #服务发布到指定的namespace,默认是public
group: christy-prod-group #服务发布到指定的group,默认值是DEFAULT_GROUP
修改cloud-integral-prod.yml
的配置文件如下(只留下自己所需要的配置信息):
spring:
application:
name: cloud-integral #服务名称,必须,保证唯一
server:
port: $port:9031
这样我们在nacos的配置列表的命名空间christy-prod
中会看到下面两个配置文件。如下图所示:
最后我们回到项目cloud-integral
中,修改配置文件如下:
# 从配置中心加载配置文件
# 文件名是通过公式来拼接的$prefix-$spring.profiles.active.$file-extension
spring:
cloud:
nacos:
config:
server-addr: www.nacos.com:80
namespace: christy-prod
group: DEFAULT_GROUP
username: nacos
password: nacos
prefix: cloud-integral
file-extension: yml
# shared-configs: # 加载共享配置文件
# - common-prod.yml
# 该方法已经废弃,请使用shared-configs[x]
# refreshable-dataids: common-prod.yml
shared-configs[0]:
data-id: common-prod.yml # 配置文件名-Data Id
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
profiles:
active: prod
这样我们不仅能够同时加载到以上两个配置文件,而且能实时同步更新修改的内容。


以上是关于Nacos.02.组件之统一配置中心的主要内容,如果未能解决你的问题,请参考以下文章