您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 开发技术 > 正文

技术增强: 如何更优雅地开发中间件?

发表于:2021-01-20 作者:丹卿 来源:彤哥读源码

今天天气不错,我们来分享一个能让你技术获得增强的主题: 开发中间件。

很多同学听到这个主题,可能会说我们是小公司,没有机会开发中间件。

那你就错了,我们这里说的中间件,并不一定是那些如dubbo之类很牛逼的开源组件,而是,你们公司内部自己使用的公共组件。

首先,我们要刻意培养这方面的能力,其次,我们要掌握一定的套路来快速地开发一款健壮的公共组件。

下面,我们就从这两个方面分享一下我的心得。

我举个例子,有的公司可能就只有一个大的单体应用,有的公司可能有很多小项目,有的公司可能是很牛逼的微服务,这些项目无疑来说都是完全不同的,但是,他们肯定也有一些共同点,比如,他们都需要打印日志,所以,你是不是可以把日志这么一个非常简单的东西拿出来做成一个日志框架呢?

日志这个东西看似比较简单,你们公司可能用的还是spring自己启动时候的日志,但是,它其实也有很多可能性,或者说可变性,比如,日志切分,滚动日志,异步打印日志,打印到远程,聚合日志,日志脱敏显示(手机号不显示全),日志可追踪,等等,你看看,我就随便说说,就能说出这么多日志相关的内容,所以,它是很适合做成公共组件的嘛。

这样,公司一旦有新的规范需要修改日志的时候,就只需要修改这个公共组件就可以了,所有项目升级个jar包就完事了,节省了大量的工时,同时,别人依赖你,你的影响力也就提升上去了,你就是你们公司日志这块的专家了,别人遇到问题都得来请教你,是不是很爽。

即使你是单体应用,也应该培养这样的能力,保不准你哪天就走了,这个日志组件是不是可以带到下一家公司,是不是可以让你更快速地搭建新项目,是不是可以让你在新的公司建立影响力。

上面只是说到了日志这么一个例子,其实,还有很多可以提取的东西,最简单的,你们公司用到什么开源组件,你就提出来,单独打成一个jar包,让别人来引用你,而不是去引用那个开源组件。

为什么这样搞呢?因为这样搞的好处是多多滴,比如,哪天有这么一些需求,kafka需要带上用户上下文,kafka消费者可追踪,elasticsearch存储的关键数据需要加密,MySQL存储的关键数据需要加密,给前端显示的手机号需要脱敏,日志追踪我们要换成skywalking,redis我们要搞集群,你想象一下,这些修改是不是需要所有项目都跟着修改,即使你只修改一行代码,加一个拦截器,动所有项目,也会被人打死,但是,你只是让别人升个版本号,这个别人还是很容易接受的。

说了这么多,那么,要如何快速地开发一个公共组件呢?

其实,很简单,我们还是以日志为例。

现在,1.0.0版本你只需要新建一个Maven工程,在resource下面丢一个logback-spring.xml,里面定义你的日志格式,一般还要做滚动日志,按天切分,每10M一个文件,等等,模板很多,网上一搜一大把,我就不细说了。

这样,一个日志组件就开发完了,你把它打包到Maven私仓别人就可以下载到了。

是不是很简单?!

OK,现在大家都用到了你的日志组件,但是,有的项目发现同步打印日志有点影响性能,给你提了个需求,能不能把日志改成异步的。

很简单,你只需要加一个异步的Append就完事了,重新打包成1.0.1版本,告诉他升级一下版本就完事了。

好了,现在有个使用使用微服务的项目给你提了个需求,我们服务太多了,能不能把日志打印到一个地方,我们方便统一查看?而且,我们想通过一个标识能把一次请求所有的日志都查出来。

这很复杂吗?其实,也不难,简单点,你申请一个elasticsearch,增加一个打印到ES的Append就可以把所有日志打印到同一个地方了,查看特别方便,再也不用登录没台机器去查看日志了。

那么,第二个需求呢?引入sleuth就可以让你的日志具有可追踪的效果,在你的Append中引用sleuth的traceid就可以了,这样,微服务聚合可追踪的日志问题就完美解决了。

甚至,你还可以做的更过分一点,偷偷的接入调用链追踪框架,比如,zipkin,完美展示调用链的过程,帮助快速排查问题,协助改造接口调用性能,等等。

相信有了这么一套框架,你在你们公司的地位就很稳了,日志这块你就是专家。

当然,很多大公司这么一套东西都是现成的了,可能没有你发挥的余地了,但是,不影响你培养这种思维。

比如,你可以去封装kafka,elasticsearch,mybatis,redis,等等,只要你有这种思维,到处都是机会。

当然,我上面说的很完美,在实际的操作中,可能会遇到各种各样的问题,有问题才有价值,最常见的就是版本兼容,jar包冲突等问题,所以,你还需要掌握一些常用的技术,比如,springboot的自动装配,Maven的option,尽量使用稳定的技术,不引入过多的依赖,等等,多写多用多体会。

好了,今天的分享就到这里,上班去了。

本文转载自微信公众号「彤哥读源码」,可以通过以下二维码关注。转载本文请联系彤哥读源码公众号。