在我们使用springcloud config实现配置中心的时候,具体流程如下:
第一步:在github上添加配置文件
第二步:创建config server配置中心,从github上面读取配置文件,下载配置信息
第三步:具体微服务从config server获取配置信息
感觉十分繁琐,并且我们如果要实现配置信息的时候更新,还需要使用总线bus实现配置的自动更新,也就是Spring Cloud Config+Spring Cloud Bus,Spring Cloud Bus是基于MQ的,支持Rabbitmq/Kafka,是Spring Cloud的消息总线方案
但是如果我们用nacos实现配置中心,github不需要了,并且实现配置信息的自动刷新bus也不需要了,因为这些nacos内部已经帮我们实现了配置信息的存储和配置信息的自动刷新,实现步骤如下:
第一步:在nacos管理后台添加配置信息
第二步:改造具体服务,使其成为nacos config client,能够从nacos server中获取具体的配置信息
Nacos配置管理添加配置
在nacos管理后台添加配置信息
进入nacos 管理页面配置管理,添加配置信息:
这样我们就新建好了一个配置信息,下面我们来搭建具体的nacos config client
Nacos config客户端搭建
- 导入nacos config相关依赖
com.dy.springcloud
user-service-8090
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
- 在服务中指定Nacos server中的配置文件(dataId)
具体配置如下:
server:
port: 8081
spring:
application:
name: user-api
#nacos相关配置
cloud:
nacos:
#nacos注册中心相关配置
discovery:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
register-enabled: true #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
#nacos服务中心相关配置
config:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
group: user-api #指定group 一般指定我们具体的项目服务
file-extension: yaml #默认properties
我们怎么来锁定我们的配置文件呢?
一般是通过namespace+group+dataId来锁定配置文件,namespace如果不指定就是默认的public,group不指定默认就是DEFAULT_GROUP
之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
1)prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。
2)spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active
为空时,对应的连接符 -
也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
3)file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。
- 新建配置类
/**
* @Description:
* @author: dy
* @Date: 2022/5/27
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "user")
//配置自动刷新
@RefreshScope
public class User {
private String name;
private Integer age;
}
- 接口访问
/**
* @Description:
* @author: dy
* @Date: 2022/5/25
*/
@RequestMapping(UserApi.MAPPING)
public interface UserApi {
String MAPPING = "/api/user";
@RequestMapping(value = "/get_user", method = RequestMethod.GET)
String getUser();
}
@Slf4j
@RestController
public class UserController implements UserApi {
@Autowired
private UserClient userClient;
@Autowired
private User user;
@Override
public String getUser() {
return "===姓名>>>"+user.getName()+"===年龄>>>"+user.getAge();
}
}
启动服务访问结果如下:
我们去nacos配置中心修改内容后,刷新浏览器,结果也会跟着改变
上面是一个配置文件的情况,但我们项目开发过程中,一般我们一个项目可能是多个配置文件,比如引用了mysql、redis、es、mong。。。等等,下面我们来看看nacos怎么引用多个配置文件
Nacos多配置文件使用
- 首先我们在nacos新建一个配置文件test-config.yaml:
- 在代码里面新增配置:
spring:
application:
name: user-api
#nacos相关配置
cloud:
nacos:
#nacos注册中心相关配置
discovery:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
register-enabled: true #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
#nacos服务中心相关配置
config:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
group: user-api #指定group 一般指定我们具体的项目服务
file-extension: yaml #默认properties
#扩展的配置集合
ext-config[0]:
data-id: test-config.yaml
group: user-api #指定group,方便灵活配置
refresh: true #开启扩展dataId动态刷新
可以从上面的配置信息里面我们新增了ext-config[0],如果是新增多个就依次为ext-config[0],ext-config[1],ext-config[2]。。。。,而且每个新增配置类下面都要设置group,方便我们灵活配置,比如我们的配置类来自不同的group,并且还开增加refresh参数开启动态刷新功能,就不用在代码里面增加注解了
- 在代码里面新增对应的实体类:
@Data
@Configuration
@ConfigurationProperties(prefix = "test")
public class TestConfig {
private String phoneNumber;
private String address;
}
- 测试api如下:
@Slf4j
@RestController
public class UserController implements UserApi {
@Autowired
private UserClient userClient;
@Autowired
private User user;
@Autowired
private TestConfig testConfig;
@Override
public String getUserInfo() {
return userClient.getUserId();
}
@Override
public String getUser() {
return "===姓名>>>"+user.getName()+"===年龄>>>"+user.getAge()+"===电话==>>"+testConfig.getPhoneNumber()+"==地址==>>"+
testConfig.getAddress();
}
}
启动服务访问结果如下:
注:在这里我们要注意一个优先级问题,因为在一个项目中,如果我们使用多个配置文件,可能其中某个配置出现在了不同的配置文件中,那我们就要注意一个优先级问题,优先级如下:config第一级的优先级最高,ext-config[0]中数组下标越大,优先级越高
共享配置集
还有一种方式使用共享配置集实现拉取多文件配置,配置文件如下:
spring:
application:
name: user-api
#nacos相关配置
cloud:
nacos:
#nacos注册中心相关配置
discovery:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
register-enabled: true #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
#nacos服务中心相关配置
config:
server-addr: 127.0.0.1:8848 #nacos服务地址
namespace: dev #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
group: user-api #指定group 一般指定我们具体的项目服务
file-extension: yaml #默认properties
#共享配置集
shared-dataids: test-config.yaml # 多个配置集逗号隔开
refreshable-dataids: test-config.yaml # 哪些配置集支持动态刷新
通过共享配置集的方式也可以实现公共配置的功能,唯一的区别就是共享配置集无法设置组信息,只获取默认DEFAULT_GROUP下面的配置文件,我们可以将一些公共的配置放到DEFAULT_GROUP,实现配置集共享