当前位置: 首页 > 后端技术 > Java

Spring是如何实现可插拔配置的?

时间:2023-04-01 23:32:00 Java

大家好,我是3y,markdown程序员,一年CRUD经验,十年经验推送平台开源项目Austin又更新了。迭代自己的项目是一件美妙的事情。源码Gitee链接:gitee.com/austin01,可插拔在我的项目逐渐成型后,很多朋友抱怨我的项目太重,依赖了很多中间件。第一版需要强依赖MySQL/Redis/Kafka/Apollo(项目启动时需要部署这些中间件),弱依赖prometheus/graylog/flink/xxl-job(才能有一个完整的项目经验,你需要部署这些)。没有人抱怨MySQL。数据库之类的东西可以说是后端必备的。暂时没有人抱怨Redis。毕竟还是用的太多了,又没有强大的竞争对手。Apollo经常被吐槽能否被Nacos替代。时不时有人吐槽Kafka,想要支持RabbitMQ和RocketMQ。我曾经有一个观念:公司里的中间件是不会轻易更换的。现在我的代码已经实现了一个姿势,感觉没有太大的必要去支持多个中间件的实现。如果你想改变它,你可以自己改变它。这并不难。”“阿波罗太重了,阿波罗不好用!快点支持Nacos吧!""""支持RocketMQ好不好?"""可以支持RabbitMQ吗?""对我来说不是很大的原因,我还是觉得Apollo很好用,足够成熟稳定,对Kafka。但是当我被吐槽多的时候,总在想是不是自己做的不够好,会和身边的大佬商量,有没有必要支持一些功能。想了想,改了,明白了再次,为了让新闻推送平台Austin好用,我先把Apollo做成一个弱依赖,你可以通过配置选择读取本地文件或者读取配置中心(Apollo),其实我们在使用Apollo的时候,甚至如果Apollo挂了,Apollo本身有很强的容灾能力(有本地文件),其次,我把Kafka做成弱依赖,你可以选择使用Guava的eventbus,也可以通过配置去分布式,消息队列(Kafka)可能支持RocketMQ/RabbitMQ以后有兴趣的话,也可以在我的代码基础上实现。做个pullrequest也很香。这样做一方面是为了降低使用门槛,另一方面是具体的实现可以做到插件化,这是开源项目所要求的。我觉得如果是公司级生产环境的线上项目,应该更多的考虑异构容灾(而不是可插性)。这样一来,新闻推送平台Austin默认的强依赖只有MySQL和Redis,其他中间件都是弱依赖。为了实现可插拔性,我使用配置来实例化不同的中间件。当我配置austin-mq-pipeline=eventbus时,我不会实例化Kafka相关的生产者和消费者,而是初始化eventBus的生产者和消费者。自然接口下的实现类是eventbus02,Nacos分布式配置中心项目已经接入Nacos!从我做项目开始,就不断有小伙伴评论是否要支持Nacos作为分布式配置中心,为什么选择Apollo。一直有种遇到邪教组织的错觉,现在Nacos这么火?接入Nacos后发现客户端低版本会导致SpringBean懒加载失败,导致我的Kafka消费者失败,折腾了好久!03.(彩蛋)KAFKA支持TAG过滤。我的股东可以直接使用我的远程服务:Kafka的Topic是共享的,Group消费者也是共享的。不修改,直接使用会带来问题。当两个或两个以上的股东同时在本地启动Austin时,他们会竞争消费这个topic(相当于一个消费组中的多个消费者),在测试投递时可能接收不到自调试的消息(被其他人抢走)股东)。解决这个问题,我的第一个想法很简单:不同的股东使用不同的组(相当于每个股东有一个独立的消费组),这样就完了吗?正好我的groupId生成是依赖通道的代码,所以改一下代码就大功告成了。但这仍然存在问题:每个股东都有一个独立的消费组,也就是说每个股东都可以消费整个topic的所有消息,也就是说股东会收到其他股东的测试消息(明明只是想测试自己的消息,但是来了别人的消息)。要解决这个问题,除了给每个股东一个独立的话题,那就是根据标签进行过滤。在Kafka中实现这个效果很简单:在发送的时候,将tag写入Kafka的头部,在消费前过滤掉没有被自己标记的消息,就大功告成了。04.总结从开始写这个项目到现在,一直在迭代,这个过程收到了很多吐槽。这些抱怨大多是积极的。毕竟,如果有人抱怨,那就意味着我的项目真的在被人使用和观看。最近有一个想法:把这个系统做上线,让各大开发者在推送消息的时候可以调用我的接口。做成这样会很有意思,也会有更多的挑战和诉求。然后我可以一直迭代,在这个过程中,我肯定会学到很多以前不知道的东西。这次我使用了@ConditionAlOnProperties注解来实现可插拔配置,但实际上如果是二方库的形式,使用SPI的姿势会更加优雅。如果想学习Java项目,我还是强烈推荐我的开源项目新闻推送平台Austin,可以作为毕业设计,校招,生产环境如何推送新闻。仓库地址(兄弟们,三个链接!)项目Gitee仓库链接:http://gitee.com/zhongfucheng/austin项目GitHub仓库链接:http://github.com/ZhongFuCheng3y/austin