① springboot 2.4.13 无法从nacos获取配置,但是可以注册到nacos
springboot 2.4.13,集成了nacos,启动后,nacos注册中心有服务,但是,发现,配置没有生效。于是,开启了一段源码查找的过程。
首先,是pom引入的nacos配置
然后,application.yml添加nacos配置
启动后,发现注册中心有服务,但是,服务的配置不是从nacos配置中心获取的,而是本地的。
查找一下nacos源码,找到nacos配置自动注入那块儿:
然后发现,是这个NacosPropertySourceLocator实现的配置导入的
查询源码,可以发现,相关的配置,是通过这个方法,加载的,这个方法是总入口。
于是,尝试加断点,查看配置信息,看看为什么没有导入配置。然而,程序根本就没有进入这个方法里面!!!
根据接口实现,可以发现NacosPropertySourceLocator 是PropertySourceLocator的实现类,这个方法的调用执行,不是nacos自己去做的,而是通过spring去做的。
spring cloud 通过BootstrapApplicationListener,以监听器的方式,通过监听springboot启动过程中的事件,通过onApplicationEvent方法处理事件,导入spring cloud相关配置。
通过加断点,可以发现,这里的方法bootstrapEnabled()返回值是false,直接就不执行后续的加载了。
因此,需要保证bootstrapEnabled返回值是true。
查看PropertyUtils源码,可以发现,需要配置项 spring.cloud.bootstrap.enabled=true 并且存在 org.springframework.cloud.bootstrap.marker.Marker 类的时候,spring cloud 才会去加载spring cloud的配置。
因此,pom中需要添加marker所在的组件依赖:
此时,需要在 bootstrap.yml 中添加spring cloud配置:
(至于为什么是bootstrap.yml而不是application.yml,这又是另一个问题了)
有了上面的配置,程序启动后,就能正常的从nacos配置中心获取配置了。
② Spring Cloud Gateway鏁村悎Nacos瀹炵幇链嶅姟璺鐢卞强闆嗙兢璐熻浇鍧囱
鎴戜滑閮界煡阆 Spring Cloud Gateway 鏄涓涓锘轰簬 Spring Boot 銆 Spring WebFlux 銆 Project Reactor 鏋勫缓镄勯珮镐ц兘缃戝叧锛屾棬鍦ㄦ彁渚涚亩鍗曘侀珮鏁堢殑API璺鐢便
Spring Cloud Gateway锘轰簬 Netty 杩愯岋纴锲犳ゅ湪浼犵粺Servlet瀹瑰櫒涓鎴栬呮墦鎴恮ar鍖呮槸涓嶈兘姝e父杩愯岀殑銆
杩欓噷鎴戜滑娉ㄥ唽涓蹇冮夊瀷镄勬槸 Nacos 锛屽傛灉杩樻病链夊畨瑁匩acos锛岃峰弬钥冿细 Nacos蹇阃熷畨瑁呴儴缃 銆
濡傛灉URI浠==lb==寮澶达纴姣斿傚备笂閰岖疆涓镄 lb://user-service 锛 Spring Cloud Gateway 浼氱敤 瑙f瀽链嶅姟钖崭负 user-service 镄勫疄渚嫔瑰簲镄勫疄闄卙ost鍜岀鍙o纴骞跺仛闆嗙兢璐熻浇鍧囱銆
杩欓”锷熻兘阃氲繃鍏ㄥ眬杩囨护鍣 瀹炵幇锛屽畼缃戞弿杩板备笅锛
[锲剧墖涓娄紶澶辫触...(image-b13395-1655546589820)]
RouteRecordGlobalFilter 杩欎釜鍏ㄥ眬杩囨护鍣ㄦ垜浠涓昏佺敤𨱒ヨ板綍璺鐢卞悗镄勫疄闄呬唬鐞嗗湴鍧锛屼互鍙婅皟鐢ㄨ楁椂銆
鎴戜滑鐪嬩笅 RouteToRequestUrlFilter 镄勬弿杩颁细鍙戠幇瀹为檯璺鐢卞湴鍧浼氶氲繃 ServerWebExchange 涓钖崭负 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 镄勫睘镐т缭瀛樸
[锲剧墖涓娄紶澶辫触...(image-a33940-1655546589820)]
鍏充簬 RouteToRequestUrlFilter 镄勯儴鍒嗘簮镰佸备笅锛
鍒嗗埆钖锷╝pi-gateway銆佹寚瀹氭傝佹枃浠跺惎锷ㄤ袱涓猽ser-service链嶅姟瀹炰緥銆佸拰涓や釜message-service链嶅姟瀹炰緥锛屾煡鐪婲acos鎺у埗鍙般
[锲剧墖涓娄紶澶辫触...(image-34bdc6-1655546589820)]
鍙浠ョ湅鍒帮纴api-gateway钖锷ㄤ简涓涓链嶅姟瀹炰緥锛寀ser-service鍜宫essage-service閮藉惎锷ㄤ简涓や釜链嶅姟瀹炰緥銆
杩炵画璁块梾 http://localhost:9000/user/info 锛屽彲浠ョ湅鍒皍ser-service闆嗙兢链嶅姟瀹炰緥琚杞璇㈣皟鐢ㄣ
鍒嗗埆璁块梾 http://localhost:9000/user/info 銆 http://localhost:9000/message/info 锛屾垜浠鍙浠ョ湅鍒板熀浜庤矾寰勫尮閰岖殑链嶅姟璺鐢卞垎鍙戞槸鎴愬姛镄勚
③ 微服务架构 | *3.5 Nacos 服务注册与发现的源码分析
参考资料 :
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端;
Nacos 客户端将自己注册进 Nacos 服务器。《1. 服务如何注册进 Nacos 注册中心》主要从 Nacos 客户端角度解释如何发送信息给 Nacos 服务器;《2. Nacos 服务器注册服务》主要从 Nacos 服务器角度解释注册原理;
《3. 客户端查询所有服务实例》将从服务消费者和提供者的角度,解释服务消费者如何获取提供者的所有实例。服务消费者和提供者都是 Nacos 的客户端;
《4. 客户端监听 Nacos 服务器以动态获取服务实例》从消费者客户端角度出发监听 Nacos 服务器,以动态获知提供者的变化;
④ nacos原理
nacos目前是集成到spring cloud alibaba里去的,也就是在spring cloud的标准之下实现了一些东西,spring cloud自己是有一个接口,叫做ServiceRegistry,也就是服务注册中心的概念,nacos中有一个它的实现类NacosServiceRegistry,实现了register、deregister、close、setStatus、getStatus之类的方法。
自动装配是一个spring boot的一个概念,自动装配的意思,其实就是说系统启动的时候,自动装配机制会运行,实现一些系统的初始化,自动运行,也就是系统启动时自动去调用NacosServiceRegistry的register方法去进行服务注册。而且除了注册之外,还会通过schele线程池去提交一个定时调度任务,源码如下:
this.exeutorService.schele(new BeatReactor.BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS),这就是一个心跳机制,定时发送心跳给nacos server。
然后会访问nacos server的open api,其实就是http接口,他有一个接口:http://31.208.59.24:8848/nacos/v1/ns/instance?serviceName=xx&ip=xx&port=xx,这么一个东西,也没什么特别的,这里就是访问注册接口罢了
nacos server那里是基于一个ConcurrentHashMap作为注册表来放服务信息的,直接会构造一个Service放到map里,然后对Service去addInstance添加一个实例,本质里面就是在维护信息,同时还会建立定时检查实例心跳的机制。最后还会基于一致性协议,比如说raft协议,去把注册同步给其他节点。
服务发现的本质其实也是nacos server上的一个http接口,就是:http://31.208.59.24:8848/nacos/v1/ns/instance/list?serviceName=xx,就这么一个接口,然后就会启动定时任务,每隔10s拉取一次最新的实例列表,然后服务端还会监听他服务的状态,有异常就会基于UDP协议反向通知客户端这次服务异常变动。
⑤ 微服务架构 | *2.5 Nacos 长轮询定时机制的源码分析
参考资料 :
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端;
由于篇幅有限,这里将源码分析分为上下两篇,其中上篇讲获取配置与事件订阅机制,下篇讲长轮询定时机制;在 《微服务架构 | 2.2 Alibaba Nacos 的统一配置管理》 中提到一张 Nacos 动态监听的长轮询机制原理图,本篇将围绕这张图剖析长轮询定时机制的原理;
上篇 《微服务架构 | *2.4 Nacos 配置中心的源码分析(获取配置与事件订阅机制)》 中的 1.1 提到,ConfigService 是 Nacos 客户端提供的用于访问实现配置中心基本操作的类,我们将从 ConfigService 的实例化开始长轮询定时机制的源码之旅;
⑥ springcloud nacos1.4.1 本地运行源码报错,缺少entity包下的类
下载的应该不会缺少依赖,
可以重新加载一下maven项目。
查看maven配置是否正确。
查看依赖是否下载。
手动下载依赖,并加载