概述
传统的静态配置方式要想修改某个配置只能修改之后重新发布应用。如果要实现动态性,也可以选择使用数据库存储配置,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。同时配置的权限管控、灰度发布、版本管理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分。
配置中心是对传统配置管理服务的一种抽象。接下来我们来了解下的nacos2.x版本结合springcloud 2020.0.1版本的使用。
1531319755930-0040e67e-ca05-47b9-9cd0-07ffd7452eae.png依赖的框架以及版本
工具 | 版本 |
---|---|
spring-boot | 2.4.2 |
spring-cloud | 2020.0.1 |
Spring Cloud Alibaba | 2021.1 |
nacos | 2.0.3 |
nacos-client | 2.0.3 |
实现步骤
1,nacos-server服务器添加配置,增加配置useLocalCache=false
image-20210820104416463.png2,添加依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>
<dependencies>
......
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3,新增配置bootstrap.yaml并启动服务,注意这里不能放到application.yaml文件中去。
spring:
application:
name: gateway
.....
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: xx
config:
server-addr: 127.0.0.1:8848
file-extension: properties
group: DEFAULT_GROUP
namespace: xx
4,请求访问.
image-20210820104756707.png5,动态刷新配置,这里是结合@RefreshScope和@Value注解,借用spring cloud context 的ConfigDataContextRefresher去刷新配置。
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
-
修改nacos-server上的配置
image-20210820105342684.png -
应用会打印如下日志:
2021-08-20 10:51:40.041 INFO 24440 --- [ternal.notifier] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [useLocalCache]
-
重新请求获取配置
image-20210820105334971.png
关键源码
nacos-config-源码分析.jpg除了上述官网给出的核心接口或类外,我们还要注意他的初始化类NacosConfigBootstrapConfiguration、NacosConfigAutoConfiguration等。
异常报错
1,动态刷新配置只有spring.cloud.bootstrap.enabled,RefreshEventListener : Refresh keys changed: [spring.cloud.bootstrap.enabled],动态刷新失败。
解决方法:将项目的配置定义到bootstrap.yaml。
spring:
application:
name: gateway
2,集成springcloud后发现无法获取nacos上的配置,这主要是springcloud当前版本将一些默认启动的配置全部关闭了,导致nacos的NacosConfigBootstrapConfiguration没有初始化。根据spring cloud版本变化需要添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
网友评论