如何避免重复造轮子,打造一个属于自己的组件库?
导语
作为java开发人员,“面向切面”这个词并不新奇,“插件”也存在于目前绝大多数平台和工具产品中,那在58房产中我们是如何将其合并且实际运用到生产中的呢?
本文详细介绍了58房产中面向切面插件器设计与实现,我们一起来深入了解一下。
名词解释
SCF:58集团自研的一套RPC远程服务通信框架(Service Communication Framework),支持跨平台,具有高并发,高性能,高可靠性,并提供异步、多协议、事件驱动的中间层服务框架,与阿里的dubbo属于相同一类。
WF:WF是Web Framework的缩写,它是58集团自研的一款基于JAVA语言的MVC开发框架,主要应用于基于JAVA的Web项目。
插件器与插件仓库切入点
什么是面向切面的插件器
所谓的“面向切面的插件器”实际上就是使用面向切面的思想开发一套插件器,并提供一系列现成完整的插件仓库给使用者,并支持根据业务需要开发自定义插件并无侵入性地嵌入到插件器中。
专业一点,插件器是一个仅依赖于cglib和slf4j的轻量级aop框架,支持同步和异步模式。插件器附带scf和wf的对接api,可以直接在scf和wf中使用。
发展历程
1. 背景及设计初衷
之前一直负责租房、二手房、商业地产、小区、经纪人等四端(pc、m、app、小程序)的web层与底层的基础微服务层等较多分散业务,日常工作避免不了业务需求频繁迭代。
如此多的业务系统分布在了不同的子部门及更细化的开发小组中,其中大家都有一些共性的技术型需求,如接口监控、报警、容灾(灾备)、服务降级、过载保护等等,虽然架构部给我们提供了强大的服务管理平台,但更细致更自定义化的处理还是必不可少,基本每个系统都要有类似的强需求。
一次我们做新项目时想要复用这些功能,发现所有这些都会对现有系统或多或少会有部分侵入性,还要稍加改造,大部分情况都存在“水土不服”的情况,为我们的项目帮助没有预想的那么大,因此我就想,有没有可能做到一次开发到处使用呢,从那以后就开始了“插件器”的初步设想与实验开发。
2. 原始方式为何不满足业务需求
原始过滤器实现的两种切入功能
首先就是要分析痛点,看看原有方式为何给我们造成了困惑,或为什么没有达到我们预想的那种效果呢,多方了解沟通,总结下来有以下几点:
原理与设计
1. 设计理念与痛点解决
2. 功能对比
框架类型 | 优势 | 劣势 |
spring-aop | 功能强大 | 1.太重,依赖很多jar 2.配置比较繁琐 |
aspectj | 1.功能强大 2.依赖少 | 1.编译期植入 2.额外DSL学习成本 |
插件器 | 1.依赖少,仅依赖cglib和slf4j 2.使用简单 3.整合scf和wf | 功能没有spring-aop和aspectj强大 |
与市面AOP组件优劣对比
3. 实现原理
插件器整体上可以分为如下几个模块(附模块图):
插件器模块划分
插件器调用时序
在各个框架下的处理流程
4. 效果展示
一个在方法前后打印日志的demo插件
在某方法上增加插件注解
运行效果
5. 优势分析
性能及影响
使用jmh工具,对插件器进行基准性能测试,测试模式为吞吐量。基本总结如下:
1. 空方法性能测试
测试目标:测试aop代理类对比原生类,对性能的影响
测试结果:对于毫秒级的方法调用,插件器不会影响主业务的吞吐量
测试数据:
空方法运行性能测试结果
测试结果说明:
2. 同步异步性能测试
测试目标:测试插件器在同步和异步模式下,对性能的影响
测试结果:对于毫秒级的方法调用,插件器在异步模式下会提高吞吐量,在同步模式下和原生方法有一样的吞吐量。before + after 部分执行时间占总执行时间比例越大,异步模式对吞吐量的提升越大。
测试数据:
同步异步性能测试结果
测试结果说明:
落地与实践
1. 适用场景
2. 现有插件仓库示例(按类别划分)
3. 自定义插件扩展与开发
插件仓库里的插件不够用怎么办?功能不完全符合自己要求怎么办?需要处理特定业务逻辑怎么办?
当然没问题!自定义插件扩展完全能够搞定,只需按照文档规范,分分钟即可开发属于自己的专属插件,且可单独放到自己的业务工程中,其他什么都不用做,工程重启后可自动加载运行,可谓方便之极。如过滤个敏感词、填充个额外信息、增加个权限校验、补充个自己喜欢的监控报警等等,都可以自己来实现。
下面是我们快速演示如何实现一个自己的插件:
插件注解类
异步插件注解实现类
同步插件注解实现类
只需要一个注解外加一个注解实现,就可以随时生成自己想要的自定义插件,且无需任何配置,部署、重启、运行,接下来就能得到自己想要的结果了。
总结展望与规划
由于集团内部绝大部分使用的都是内部Framework,因此目前插件器还未支持到spring和dubbo等外部 框架中,但核心机制不变,只需要利用spring、dubbo原生的aop把插件器切入进去,那就顺利地把插件器合并到想要的Framework中了。这也是接下来我们要继续做下去的版本。
另外,插件器的核心实际上是插件仓库,这个仓库需要对内“开源”,即所有人都可以发布上传,让其他人了解和使用自己的插件,随着贡献者的增加,我们在做一个业务项目时,可以在这个仓库里自己随意选择需要的模块进行组装,我们要把更多的精力放到主营业务中去。
相关简介
最后,给大家简单介绍下我们部门目前的职责与工作内容:
a) 参与58同城房产基础服务的技术架构设计,研发及维护工作;
b) 负责核心代码的编写工作并能够按时高质量交付;
c) 主导产品或项目中的关键技术问题攻关;
d) 技术分享并帮助其他成员提高解决技术问题的能力。
live
沙龙活动直播
2020年58技术沙龙活动在线直播第一弹——《大数据平台建设实践与探讨》已准备就绪,欢迎你强势围观!
详情🔎请戳👆图片查看,2月22日本周六19:00,我们不见不散。
END
阅读推荐
3. 58车商通RN落地与实践58全站用户行为数据仓库建设及实践