Prototype框架:同时支持dubbo/spring cloud各类SOA/RPC框架方案
业务目标:
1、分离具体业务代码和技术实现代码,当技术实现发生变更时不需要修改具体业务代码(或者很少需要修改)。
2、使用注解来代替工具类和方法的使用,简化学习和开发过程。
3、自动生成业务接口的API文档,并为API的测试提供一些支持。
技术目标:
1、一个业务实现,无需额外代码仅需少量配置,同时!!!支持各类远程调用技术,包括HTTP REST/dubbo/httpinvoker/hession,并为其它任何SOA/RPC等提供扩展支持。
2、解决各类接口在序列化对象时存在的多余数据,以减少API在开发过程中频繁更新及对dubbo等远程调用提供更好的版本管理(不需要人工配置版本路由)。
3、解决如spring中如事务处理不恰当(如在控制器中使用多次写事务或写用户操作日志时未使用异步事务)等一系列问题,以减少代码review的工作量。
4、为高并发(异步、并行、缓存、线程池)、高可用(隔离、限流、降级)、分布式系统提供一些基本的支持。
5、框架的每个已有部件尽可能的是可替换的,并对框架的扩展提供友好的技术支持。
6、具体业务的开发,除了使用本框架的一些注解和少量功能外,尽可能与框架无关,也就意味着包括此框架本身也是可替换的(除了框架的扩展代码)。
设计思想:
1、基于原型(prototype)开发,而非spring推荐的单一实例(singleton)
2、接口最小化原则,避免序列化对象时多余的字段
3、如果能不让程序员偷懒,就不让他们偷懒,也就是尽量减少后续的技术债务。
设计思路:
在类被使用之前,通过javassist字节码技术对类的方法一定的修改,实现方法注解对应的处理逻辑(事务、异步、责任链、并行等).
通过方法参数注入bean而不是spring中的成员变量注解,以解决调用另外的方法时的注入问题.
根据每个接口的输入输出(注解定义的),创建不同的输入类和输出类,以解决序列化对象带来的多余字段问题、接口多版本问题、API文档问题。
主要功能:
1、工具注解:
a、事务管理:以Spring事务管理中基础提供处理管理支持
b、异步:不再需要丑陋的内部类
c、并行:在多个线程中处理不同的业务(比如微服务下的调用其它服务),并且与异步注解配合,可在异步下并行调用多段业务代码。
d、异常处理:使用一个或多个方法处理方法抛出的不同类型的异常
e、决策:根据方法返回值决定调用另外的某个方法(可反射调用子类的方法)
f、方法断路:使用Hystrix实现
g、消息发送与订阅:通过Rxjava实现消息发送与处理逻辑的分离,让业务开发人员无需了解具体实现技术(可能是基于事件、数据库或MQ等不同形式),比如异常日志、用户操作日志、短信邮件发送、APP通知、事件等均可通过此功能来实现解耦。
h、SQL:简化SQL的查询、批处理、调用存储过程等
i、IO处理:提供对byte[]、char[]、String、File、InputStream、Output、Reader、Writer、URL等不同形式数据的转换,只需要一个注解就能完成.
j、模板:提供类似发短信、邮件时的内容模板
k、提供Spring注解Value、Cache等缓存注解的支持
2、业务管理
a、业务实现类可按用户自定义的规则(如依次调用validate、business、after、async等方法以责任链形式分别用于处理不同的业务逻辑
b、不同的业务类方法,允许不同的事务(只读、可写、无事务),允许独立事务,允许多业务方法统一事务(除异步方法外),支持读写分离
c、支持异步处理业务
d、支持限流与业务降级
e、业务接口输出(用于分析不同版本间的接口变化,为APP不同版本兼容及兼容测试做支持.
3、HTTP REST
a、提供对Spring MVC的支持,业务接口自动注册为控制器的方法
b、GET方式(或未指定具体方式)只提供读事务(除异步方法外)
c、多接口版本自动路由支持(不同版本使用同一URL地址)
d、集成Swagger文档展示,方便测试
e、Servlet3异步请求支持
f、feign客户端代码在线生成
g、js表单验证数据代码在线生成
4、dubbo/HttpInvoker/Hession
a、提供打包生成客户端代码(不同版本的)
b、其它业务管理提供的特性
c、测试程序运行时生成客户端代码,以供持续集成工具打包
5、分布式事务支持
a、分布式事务处理服务中心(事务处理中间件)
b、在dubbo/http rest下支持跨虚拟机的分布式事务
6、开发、运维与自动化测试
a、集成不同技术的支持(类似Spring Boot starter)
b、API信息保存服务(在微服务/SOA环境下收集多个应用的API信息),以供API版本变更时测试.
c、统一的异常处理方式
d、性能统计数据输出
e、收集访问请求及出错请求(包括请求与结果)(待定)
f、分析请求,生成自动化测试脚本(待定)
性能:
采用javassist直接生成字节码,对大多数调用(空方法体),连续10W次责任链调用(调用两个空方法)响应时间小于300毫秒(原生java直接调用小于10毫秒)。以10毫秒的业务响应时间计算,则构架对业务响应时间的影响小于0.003%。以一个非常复杂的应用100次javassist的方法调用计算(通常小于10次),则构架对业务响应时间的影响小于0.3%.
应用场景:
1、新开发应用:以此框架开发的产品是面向未来技术的,扩展此框架或替换此框架代价很低。
2、ESB/适有SOA技术开发的项目向Spring Cloud/dubbo等迁移.
目前开发阶段,预计8月中发布预览版本(部分功能)