乐趣区

关于java:Spring如何实现可插拔配置

大家好,我是 3y,一年 CRUD 教训用十年的 markdown 程序员👨🏻‍💻长年被誉为职业八股文选手

我又又又又被吐槽了,随之而来,我的音讯推送平台开源我的项目 Austin 又又又又更新啦,迭代本人的我的项目多是一件美事啊

源码 Gitee链接:gitee.com/austin

01、可插拔

我的我的项目逐步成型了之后,有挺多小伙伴吐槽过我的我的项目 太重 了,依赖的中间件有点多。

在最开始的那一版须要 强依赖 MySQL/Redis/Kafka/Apollo(我的项目启动就须要部署这些中间件), 弱依赖prometheus/graylog/flink/xxl-job(想要有残缺的我的项目体验,就须要把这些给部署起来)。

  • MySQL 是没有人吐槽的,数据库这种货色,能够说是后端必须的了。
  • Redis 临时还没人吐槽,毕竟用的还是太多了,也没有什么弱小的竞品。
  • Apollo 常常被吐槽能不能换成 Nacos。
  • Kafka 时而有人吐槽,想要反对 RabbitMQ、RocketMQ。

我以前存在个观点:在公司里中间件是不会轻易替换的,当初我的代码曾经实现了一种姿态,感觉没多大必要反对多种中间件实现,你想换就本人入手改改嘛,又不难

「“Apollo 太重啦,Apollo 不好用!快点反对 Nacos!”」「“反对 RocketMQ 好不好啊”」「“能不能反对 RabbitMQ?”」

对我来说并不是啥大理由,我还是感觉 Apollo 挺好用,足够成熟稳固,同理 Kafka 亦是如此。不过当我被吐槽多了,总会狐疑本人是不是做得不够好,也会跟身边的大佬探讨探讨,有没有必要反对一些性能。

思来想去,我变了,我又懂了

为了让音讯推送平台 Austin 易上手,我首先把 Apollo 做成弱依赖,能够通过配置抉择 读本地文件 还是读配置核心(Apollo)。其实当咱们应用 Apollo 时,即使 Apollo 挂了,Apollo 自身就有很强的容灾能力(自带本地文件)

其次,我把 Kafka 做成弱依赖,能够通过配置抉择 用 Guava 的 eventbus还是走分布式音讯队列(Kafka),后续可能还会反对 RocketMQ/RabbitMQ,感兴趣的也能够在我的代码根底上实现一把,蹭个 pull request 也很香的。

一方面是 升高应用门槛 而做的,另一方面是能够对具体实现进行 可插拔 ,这是 开源我的项目 所须要的。我认为如果是公司级生产环境线上的我的项目,对这块更多思考的是 异构容灾(而非可插拔)。

于是乎,当初音讯推送平台 Austin 默认的强依赖只剩下了 MySQLRedis,其余中间件的都是弱依赖,要做到可插拔我是 借助配置 去实例化不同的中间件。

当我的配置 austin-mq-pipeline=eventbus 时,我就不去实例化 Kafka 相干的生产者和消费者,转而去初始化 eventBus 的生产者和消费者,那天然 接口下的实现类 就是为 eventbus

02、反对 Nacos 分布式配置核心

我的项目曾经将 Nacos 曾经接入了!从我做我的项目开始,就始终有小伙伴留言是不是要反对 Nacos 作为分布式配置核心,为什么偏偏就抉择 Apollo。我始终错觉认为我遇到了邪教组织了,当初 Nacos 都风行到这个境地了?

接入完 Nacos,又发现了低版本的客户端会导致 SpringBean 的懒加载生效,从而导致我的 Kafka 消费者失败了,折腾了好一阵子!

03、(彩蛋)KAFKA 反对 TAG 过滤

我的股东们是能间接用我的近程服务的:Kafka 的 Topic 是共享的,Group 消费者也是共享的,在不批改的前提下,间接应用会带来一个问题。

当同时有两个或以上的股东在本地启动了 Austin,那就会争抢生产这个 Topic(相当于一个消费者组里起了多个消费者),导致在测试下发的时候可能收不到本人调试的音讯(被别的股东抢去了)。

要解决这个问题我第一工夫的想法很简略:不同的股东应用不同的 group(相当于每个股东都会有独立的消费者组),那不就完事了嘛?正好我的 groupId 生成是依赖渠道的 code,改掉 code 就完事咯。

但这还是有问题的:每个股东有独立的消费者组,意味着每个股东能生产整个 topic 的所有音讯,这又意味着股东会承受到其余股东的测试音讯(明明只想要本人测试的音讯,却来了一条其他人发的)。

要解决这个问题,除了给每个股东一个独立的 topic,那就是 依据 tag 过滤 啦。

在 Kafka 实现这种成果,挺简略的:在发送的时候,把 tag 写进 Kafka 的头部,在生产前把非本身 tag 的音讯过滤掉就完事了

04、总结

从开始写这个我的项目到当初还始终在迭代,这个过程受到了不少的吐槽。这种吐槽大多数是正向的,毕竟有人吐槽那才阐明我这个我的项目是真的有人在用的,有人在看的。

最近有个想法:把这个零碎做成是线上的,能够由各大开发者在推送音讯的时候调用我的接口,做成这样肯定会很有意思,面临的挑战和需要也会更多。那我就始终能够迭代,在这过程中肯定我还能学到很多以前所不晓得的货色。

这次我用 @ConditionAlOnProperties 这个注解来实现可插拔的配置,但其实如果是提供二方库的模式的话,应用 SPI 的姿态 会更加优雅。

如果想学 Java 我的项目的,我还是强烈推荐我的开源我的项目音讯推送平台 Austin,能够用作 毕业设计 ,能够用作 校招 ,又能够看看 生产环境是怎么推送音讯 的。

仓库地址(求各位兄弟们三连哟!)

  • 我的项目 Gitee 仓库链接:http://gitee.com/zhongfucheng/austin
  • 我的项目 GitHub 仓库链接:http://github.com/ZhongFuCheng3y/austin
退出移动版