Apollo、RocketMQ加载顺序问题

 

 

在SpringCloudAlibaba框架中,因Nacos配置中心管理权限过于简单,决定用Apollo代替Nacos配置中心,但在启动时,Nacos、Redis等配置读取正常,RocketMQ由于启动过早,无法从Apollo读取自己的服务地址配置。

报错如下:

Error processing condition on RocketMQAutoConfiguration.

针对此问题,进行以下3个方向的尝试,最开始觉得如果其他组件能正常读取Apollo配置,那应该是RocketMQ的问题,想办法降低它的加载顺序。最终发现不太现实,在RocketMQ社区也未找到相关问题。

尝试1.让rocketmq-spring-boot中的RocketMQAutoConfiguration延迟加载-失败

最起码要晚于ApolloAutoConfiguration。

如下方案失败:

/*** 试图让RocketMQAutoConfiguration在ApolloAutoConfiguration之后加载*/
@Configuration
@AutoConfigureBefore(RocketMQAutoConfiguration.class)
public class OrderConfiguration {@Bean@ConditionalOnMissingBean(ApolloAutoConfiguration.class)public ApolloAutoConfiguration apolloAutoConfiguration() {return new ApolloAutoConfiguration();}
}

尝试2:开启全局懒加载,并排除Apollo-失败

尝试3:修改EnableApolloConfig order属性-失败

在启动类修改EnableApolloConfig order属性,还是报同样的错误。

@EnableApolloConfig(order = Integer.MIN VALUE)

解决方案:设置apollo更早阶段注入

直到忙活几个小时后,发现Apollo官方已经提供了容Apollo更早注入的方法,解决方法:

@SpringBootApplication
// 允许使用Feign客户端发送请求
@EnableFeignClients
// 指定要扫描的Mapper类的包的路径
@MapperScan("com.**.dao")
@EnableRedis
@EnableApolloConfig
// 扫描加载Filter
@ServletComponentScan
public class Application {public static void main(String[] args) {// 启用apollo配置开关 在应用启动阶段是否向Spring容器注入被托管的properties文件配置信息。System.setProperty("apollo.bootstrap.enabled","true");// 将Apollo配置加载提到初始化日志系统之前。System.setProperty("apollo.bootstrap.eagerLoad.enabled","true");SpringApplication.run(Application.class, args);}
}

还有另一种方式:

Apollo官方文档

Apollo

Spring Boot除了支持上述两种集成方式以外,还支持通过application.properties/bootstrap.properties来配置,该方式能使配置在更早的阶段注入,比如使用@ConditionalOnProperty的场景或者是有一些spring-boot-starter在启动阶段就需要读取配置做一些事情(如dubbo-spring-boot-project),所以对于Spring Boot环境建议通过以下方式来接入Apollo(需要0.10.0及以上版本)。
从1.2.0版本开始,如果希望把日志相关的配置(如logging.level.root=info或logback-spring.xml中的参数)也放在Apollo管理,那么可以额外配置apollo.bootstrap.eagerLoad.enabled=true来使Apollo的加载顺序放到日志系统加载之前,不过这会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!所以在Apollo代码中使用Slf4j的日志输出便没有任何内容),更多信息可以参考PR 1614。参考配置示例如下:
# will inject 'application' namespace in bootstrap phase
apollo.bootstrap.enabled = true
# put apollo initialization before logging system initialization
apollo.bootstrap.eagerLoad.enabled=true

        因为搜索方向不对浪费了几个小时,一开始一直在搜索如何让RocketMQ加载晚于Apollo,重点在调整两者加载顺序上,后来又在研究RocketMQAutoConfiguration的加载原理,尝试各种方法让RMQ延迟加载,最后随便搜了一下Apollo加载顺序,答案其实很多,在解决问题时还是要多扩散一下思路。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13644.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.7~7.8学习总结

StringBuider:线程不安全,效率高 StringBuffer:线程安全,效率低; 用法举例: class TWC {public static void main(String []args){StringBuilder sbnew StringBuilder("小麻子爱吃粑粑");Syst…

redis的主从复制,哨兵和cluster集群

一、redis的高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-(宕机时间)/(宕机时间运行时间)有…

常见排序算法—面试编程题2023

常见排序算法—面试编程题2023 最近在看一些面试题,发现很多面试过程中都会要求手写排序编程题,经过一番查找整理,可以快速学习和使用相关排序算法题,通俗易懂,手撕代码吊打面试官。 一、冒泡排序 冒泡排序 是一种简…

C语言实现三子棋

三子棋 1. 三子棋玩法2. 程序设计思路2.1 准备工作2.2 主函数设计2.3 创建菜单界面2.4 设计棋盘2.4.1 初始化棋盘2.4.2 打印棋盘 2.5 下棋2.5.1 玩家下棋2.5.2 电脑下棋 2.6 判断输赢2.8 头文件函数声明 结束语 1. 三子棋玩法 三子棋的玩法很简单,两个人依次在9宫格…

【ElasticSearch】ES案例:旅游酒店搜索

文章目录 一、项目分析二、需求1:酒店搜索功能三、需求2:添加过滤功能四、需求3:我附近的酒店五、需求4:置顶花广告费的酒店 一、项目分析 启动hotel-demo项目,访问localhost:servicePort,即可访问static下…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了,原本想直接学学Ethercat,但是简单看了看对象字典啥的概念一头雾水的,决定先从CANopen开始,Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记,我似乎是看懂了些&am…

ITIL 4服务连续性管理实践

一、目的和描述 关键信息 服务连续性管理实践的目的是确保灾难发生时,服务的可用性和性能能够保持在足够的水平。本实践提供了一个框架机制,利用产生有效响应的能力来构建组织的弹性,以保障关键利益相关者的利益,还有组织的声誉…

数据库视图与索引经典题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 视图与索引视图:定义视图创建视图删除视图查询视图视图的作用 索引索引的概念索引的类型设计索引 视图与索引 视图: 视图是从一个或几个基…

chatgpt生成pygame opengl实现旋转用图片填充的3d三角形

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import *def draw_triangle():vertices ((0, 2, 0), # 顶点1(-2, -2, 0), # 顶点2(2, -2, 0) # 顶点3)tex_coords ((1, 2), # 顶点1的纹理坐标(1, 1), # 顶点2的纹理坐标(2, …

HTML期末作业-精仿故宫模板(HTML+CSS+JavaScript)

期末作业完成!我仿了故宫官网,老师给了90分。现在分享给大家! 首页包含功能: 轮播图:在首页顶部设置一个可自动轮播的图片展示区域,展示多张宣传图片或产品图片,提升页面的视觉效果和吸引力。…

Ajax简介和实例

目录 什么是 AJAX ? AJAX实例 ajax-get无参 ajax-get有参 对象和查询字符串的互转 ajax-post ajax-post 表单 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 什么是 AJAX ? 菜鸟教程是这样介绍的&#xff1a…

使用TypeScript实现贪吃蛇小游戏(网页版)

本项目使用webpackts所编写 下边是项目的文件目录 /src下边的index.html页面是入口文件 index.ts是引入所有的ts文件 /modules文件夹是用来存放所有类的 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…