Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】
一、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











