Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】
- 一、Nacos-config配置中心
- 1、官方文档
- 二、快速配置
- 1、Nacos-config基本操作
- 2、Nacos配置中心使用
- 3、Nacos客户端 每10ms去 注册中心 进行判断 根据MD5
- 4、基于dataid 为yaml的文件扩展名方式
- 5、支持自定义Group的配置
- 6、支持自定义扩展的Data id配置
- 7、@RefreshScope【设置动态感知对应配置变化】
一、Nacos-config配置中心
1、官方文档
Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用Spring Cloud Alibaba Nacos Confg,您可以在Nacos Server集中管理你
Spring Cloud应用的外部属性配置。
1.维护性 2.时效性 3.安全性
springcloud config对比
三大优势
- springcloud config大部分应用场景结合git使用,动态变更还需要依赖Spring Cloud Bus消息总线来通过所有的客户端变化
- springcloud config 大部分场景结果GIT使用,动态变更还需要SpringCloud Bus消息总线来通过所有客户端变化
- nacos config 使用长轮询更新配置,一但配置变动后,通知Provider 的过程非常迅速,从速度上秒杀springcloud原来的config几条街
二、快速配置
访问:http://192.168.180.128:8847/nacos/index.html#/login
1、Nacos-config基本操作
新增配置
点击发布
编辑配置
查看修改的历史信息
查看详情
详情和回滚等操作
监听查询
创建新的命名空间
将配置文件克隆到其他命名空间当中
用户管理&角色管理
添加用户
添加角色
权限管理
我们设置登出系统
2、Nacos配置中心使用
Nacos服务端初始化
1、启动Nacos Server,启动方式可见Nacos官网
2、启动好Nacos之后,在Nacos添加如下配置
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式:Properties
配置内容:
user.name = 徐庶2
user.age = 11
Note 注意dataid是以properties(默认的文件扩展名方式)为扩展名
客户端使用方式
如果要在您的项目当中使用Nacos来实现应用的外部化配置,使用group ID为com.alibaba.cloud 和 artfact ID为spring-cloud-starter-alibaba-nacos-config的starter
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
现在就可以创建一个标准的SpringBoot应用
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class,args);
}
}
server:
port: 8050
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Nacos config 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.out.println("user name :"+userName +"; age: "+userAge);
}
}
在运行此Example之前,必须使用bootstarp.properties配置文件来配置Nacos Server地址,例如
spring:
application:
name: nacos-config
cloud:
nacos:
server-addr: 192.168.180.128:8847
3、Nacos客户端 每10ms去 注册中心 进行判断 根据MD5
4、基于dataid 为yaml的文件扩展名方式
spring-cloud-starter-alibaba-nacos-config对于yaml格式也是完美支持的。这个时候只需要完成以下两步:
1、在应用的 bootstrap.properties配置文件中显示的声明dataid文件扩展名。如下所示
bootstrap.properties
spring.cloud.nacos.config.file-extension=yaml
user:
name: 徐庶-yaml
age: 11
我们发现拿不到配置信息了
需要修改对应的配置信息,设置对应读取文件扩展名
# Nacos 客户端 默认是Properties 的文件扩展名 file-extension进行设置
config:
file-extension: yaml
# Nacos 客户端 默认是Properties 的文件扩展名 file-extension进行设置
config:
file-extension: yaml
#refresh-enabled: false nacos客户端将无法感知配置的变化
重新运行项目
设置多个环境的application.yml的配置文件
application-dev.yml
上述输出的配置信息当中用户名是刚刚的配置信息,但是年龄是读取的依旧是旧的配置信息
设置namespace为dev
namespace: dev
我们可以看到读取不到任何配置信息,因为我们没有设置dev环境下的配置信息
克隆成功
5、支持自定义Group的配置
在没有明确指定${spring.cloud.nacos.config.group}
配置的情况下,默认使用的是DEFAULT_GROUP
。如果需要自定义自己的Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
group: itbluebox
读取不到对应的信息
克隆并设置Group
又可以继续读取到对应的配置信息
6、支持自定义扩展的Data id配置
Spring Cloud Alibaba Nacos Config从 0.2.1版本后,可支持自定义Data ld的配置。关于这部分详细的设计可参考这里。一个完整的配置案例如下所示:
String userConfig = applicationContext.getEnvironment().getProperty("user.config");
System.out.println("user name :"+userName +"; age: "+userAge + "; userConfig:"+userConfig);
group: itbluebox
shared-configs:
- data-id: com.itblueboxmall.common.properties
refresh: true
#group:默认是Default-group
- data-id: com.itblueboxmall.common2.properties
refresh: true
#group:默认是Default-group
extension-configs[0]:
data-id: com.itblueboxmall.common03.properties
refresh: true
7、@RefreshScope【设置动态感知对应配置变化】
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${user.name}")
public String username;
@RequestMapping("/show")
public String show(){
return this.username;
}
}
http://localhost:8050/config/show
控制台输出的内容变了
再次访问对应的接口没有变化
http://localhost:8050/config/show
设置动态感知对应配置变化
@RefreshScope
重新启动运行项目
修改配置信息
控制台输出内容变了
访问:http://localhost:8050/config/show