问:配置中心拿来干嘛的?
答:微服务架构中,每个微服务都需要一个配置文件。①会有n个微服务②每个微服务都有开发,生产,测试三个运行环境③每个微服务会布置到m台机器上。总共n*3*m个配置文件。其实这些配置文件的内容呢,很多是重复的。触发关键词:重复,所以把相同的内容提取出来,放配置中心里,统一管理。
配置文件数量太多,而且文件里面的内容有很多重复的
1.统一管理不同环境、不同集群的配置
2.配置修改实时生效(热发布)
3.版本发布管理
4.灰度发布
5.权限管理、发布审核、操作审计
6.提供开放平台API
Namespace(区分不同运行环境,生产和测试一般会隔离:Dev/Test/Prod)
下有Group(某一类分成组,比如中间件配置,数据库配置)
下有DataId(某个项目具体的配置文件)
第一步 引入依赖
第二步 加注解 这里不需要
第三步 加配置
配置Nacos的访问端口 在bootstrap.properties 中配置
增加RefreshScope注解,实现自动刷新功能
没有指定加载什么配置时,默认加载下面两个配置 properties
优先级的问题:后面会把前面数据的覆盖掉
增加上yaml扩展名
spring.cloud.nacos.donfig.file-extension=yaml
问:加上yaml扩展名后,会增加加载哪些扩展文件捏?
访问的信息是nacos中的nacos-config.yaml
查看日志,发现先加载nacos-config ,再加载配置的扩展名 nacos-config.yaml,yaml里的信息把nacos-config里的信息进行覆盖。
不会再加载properties文件。
下一个小知识点 指定环境为生产环境
规则为 应用名称+扩展名+文件后缀名 优先级比之前的文件都要高
spring.profiles.active=prod
下一个知识点 指定不同的命名空间
spring.cloud.nacos.config.namespace=5c2bd40b
分开不同环境 prod
下一个知识点 配置组 一般使用默认组 不另设分组 除非配置特别多
spring.cloud.nacos.config.group=DEFAULT_GROUP
自定义data ID配置 共享配置 (sharedConfigs)
例如 所有项目共享一个redis
下一个知识点 扩展配置(extensionConfigs)
扩展配置优先级大于共享配置
所有配置文件的优先级如下所示,前面的先加载,后面的再加载,然后把前面的覆盖了
若发现自己的配置没有生效,可以检查一下自己的配置是否被别人所覆盖
动态监听-Push
方式1 push :例如,需求是:一个客户端需要发消息给另一个客户端
一个客户端把消息发给服务器后,服务器直接立即把消息发送给对应的客户端。为了达到立即发送的目标,需要维持长连接。同时使用心跳机制确认客户端是否存活。
动态监听pull
方式2 pull :拉 服务端不主动推送消息 ,客户端每隔一段时间间隔去请求一次服务端,实时性无法保证
延迟30秒是为了减少空轮询
入口 加载的自动装配类如下 重点是NacosConfigAutoConfiguration类
NacosConfigAutoConfiguration类有个方法 nacosConfigProperties
返回一个NacosConfigProperties对象
NacosConfigProperties类里定义一个属性PREFIX,对应在配置文件里的配置
对应前缀
NacosConfigProperties类里定义了相关的属性 serverAddr username password encode等参数
下一个关键的类
NacosConfigAutoConfiguration类的58行 叫NacosConfigManager
NacosConfigManager类的构造方法里(39行) 调用了一个方法 叫createConfigService 给它传一个参数 nacosConfigProperties,把相应的配置信息传进来了
createConfigService方法 在NacosConfigManager类的49行
调用了NacosFactory.createConfigService方法,创建一个服务
NacosFactory类43行 的createConfigService方法 调用 ConfigFactory.createConfigService()方法,传入参数 properties
ConfigFactory类的39行 是 createConfigService()方法 用class.forName反射调用
com.alibaba.nacos.client.config.NacosConfigService类
再调用getConstructor构造方法
构造方法里边创建了两个重要的类agent,用于发送http请求 和worker
worker new了一个ClientWorker
在ClientWorker中进行初始化
初始化以下参数:①初始化超时时间30秒
还是在ClientWorker类,第556行 定义超时时间
CONFIG_LONG_POLL_TIMEOUT定义在Constants里边,单位毫秒,30000毫秒
在ClientWorker中进行初始化
初始化以下参数:② 两个线程池 创建两个线程
进行本地配置检查,延迟10ms执行,调用方法checkConfiguration
方法checkConfigInfo()在ClientWorker.java类的366行
listenerSize是监听到的所有的配置的数量
所有的配置拉过来,按3000分成一个长链接LongPollingRunable()
LongPollingRunnable类在ClientWorker.java的577行,实现了Runnable接口,是一个线程
checkLocalConfig//
检查内存中的缓存信息与文件中的缓存信息是否一致,并进行相应处理