此文章只是简单的实现了对应的nacos配置中心的核心功能,只是模拟了nacos配置的核心功能,包括一些配置的加载,动态更新。
直接上代码。
首先我们要写一个starter,需要引入对应的stater依赖。并且配置对应的spring.factories
pom依赖如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
spring.factories 如下:加载了两个类:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
edu.mbb.cloud.nacos.ConfigBootstrapConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
edu.mbb.cloud.nacos.ConfigAutoConfiguration
BootstrapConfiguration 是指加载bootstrap.yaml或者properties的时候加载的类。此时对应的配置文件已经加载进去对应的容器中,对应的我们已经取到了对应的bootstarp的配置信息,这也就是为啥我们的配置的nacos 信息要在对应的bootstrap.yaml中。
@Configuration
@ConditionalOnProperty(name = "spring.mbb.enable",matchIfMissing = true)
public class ConfigBootstrapConfiguration {
@Bean
@ConditionalOnMissingBean
public MbbConfigProPerties mbbConfigProPerties(){
return new MbbConfigProPerties();
}
@Bean
public MbbPropertySourceLocator mbbPropertySourceLocator(
MbbConfigProPerties mbbConfigProPerties) {
return new MbbPropertySourceLocator(mbbConfigProPerties);
}
主要是加载了下面的MbbPropertySourceLocator 这个bean 注入了nacos 的配置信息。
而MbbPropertySourceLocator 实现了PropertySourceLocator 接口,此接口是springcloud为了加载对应的配置文件信息到对应的容器中去。我们集成此接口也会把我们自己的对应的配置信息加载到对应的容器中去。
public PropertySource<?> locate(Environment environment) 重写此方法
CompositePropertySource 返回值为这个
所以我们只需要把对应的配置信息加载进到这个类中即可。
我们有了nacos的配置信息,此时就把对应的nacos配置信息用来连接nacos。
从nacos上找到了对应的信息后,加载进去到CompositePropertySource这个类中。
nacos 中会加载两个配置文件一个是你激活的文件一个是对应的项目名称文件。至于为啥激活两个,问了nacos社区的人。。。。。他们没回复,我也不知道为啥。。。
server:
port: 4466
spring:
profiles:
active: dev
application:
name: nacos-config-client
mbb:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置
group: TEST_GROUP
namespace: b8b51e18-7395-4124-8840-fe39fde231b1
假如我的配置信息长成这个样子。。。
他会加载两个配置文件>>>>一个是nacos-config-client.yaml 和 nacos-config-client-dev.yaml
还有一个加载的类,ConfigAutoConfiguration 加载了 MyContextRefresher
实现了两个接口 ApplicationListener<ApplicationReadyEvent>, ApplicationContextAware
ApplicationListener这个监听就是为了监听当spring容器加载完成的时候 才开始进行对应的事件监听操作。 下面的接口为了注入ApplicationContext 对象。
此方法主要为了给对应的文件添加监听。
configService.addListener(dataId, group, listener);
并在文件内容有变动的时候进行对应的发布对应的RefreshEvent事件,刷新对应的refreshscope对象
applicationContext.publishEvent(
new RefreshEvent(this, null, "Refresh Nacos config"));
NacosConfigService 是nacos 操作核心类。原生的nacos有对应的CRUD的监听操作。我这里只模拟了对应的add方法
具体还是看代码我把代码放上去,并且给出一个demo用来使用。使用的
这个模块