基于注解驱动机制的任务执行方法、装置、设备及介质与流程
本发明涉及通信,尤其涉及一种基于注解驱动机制的任务执行方法、装置、设备及介质。
背景技术:
1、在当前主流的微服务架构中,服务间通信普遍采用rpc(remote procedure call,远程过程调用)同步调用方式。同步调用的特点是调用方发起请求后需要阻塞等待服务方返回结果。在供应链金融等复杂业务系统中,单次业务操作往往涉及多个服务的串行调用(如交易确权、合同生成、通知推送、银行对接等),整体链路耗时长,调用方线程长期被占用,在高并发场景下容易导致线程池耗尽、级联超时,甚至服务雪崩。
2、针对上述问题,现有的异步化方案主要包括:
3、(1)spring @async注解方案:spring框架提供了@async注解实现方法的异步执行。但该方案存在一个已知的框架层面限制,即当在同一个类中的private方法调用public异步方法时,由于spring aop(aspect oriented programming,面向切面编程)的代理机制(基于cglib(code generation library,代码生成库)的子类代理),@async注解不会生效,实际仍是同步执行。此外,@async本质上是本地线程池异步,不具备消息持久化、失败重试、跨进程消费的能力。
4、(2)手动改造为消息驱动方案:开发者手动将同步方法的调用方改为消息发送逻辑,并编写对应的消费者处理类。该方案需要对每个需要异步化的方法进行逐一改造,修改调用方代码、编写消息体dto(data transfer object,数据传输对象)、编写消费者类、在配置文件中声明队列及绑定关系,工作量大且侵入性强。
5、(3)响应式编程方案:采用reactor(project reactor,响应式编程核心库)/webflux(spring web on reactive stack,spring响应式web框架)等响应式框架改造为非阻塞调用。但该方案需要对整体技术栈进行替换,与现有的阻塞式dubbo(apache dubborpc framework,apache阿帕奇分布式远程调用框架)生态不兼容,改造成本极高。
6、另外,在spring+dubbo体系中,dubbo服务的业务契约定义在接口层(如xxxprovider接口),实现类(如xxxproviderimpl)标注@dubboservice注解。spring框架在创建bean时,默认使用cglib技术生成实现类的子类代理对象,其代理增强作用在实现类的方法调用路径上。当开发者在接口方法上声明自定义注解时,cglib代理的方法拦截器无法直接感知接口级别的注解信息,导致基于接口注解的切面逻辑失效。这一技术限制使得开发者难以通过标准的aop方式实现“在接口方法上加注解即可改变方法执行行为”的效果。
7、综合上述分析,现有技术主要存在以下缺陷:
8、1. spring @async的代理限制:由于cglib代理的工作机制,同类中的内部调用、接口层注解等场景下@async注解不生效,且不具备消息持久化和跨进程消费能力;
9、2. 手动改造侵入性强:将同步调用改为消息驱动需要逐方法修改业务代码,涉及调用方改造、消息体定义、消费者编写、队列配置声明等多处改动,维护成本高,违反开闭原则;
10、3. 消息基础设施静态声明僵化:传统的队列、绑定和消费者监听容器均在配置类中以@bean方式静态声明,队列数量和属性在编译期固定,无法根据注解扫描结果动态调整;
11、4. 参数跨进程传输类型丢失:java方法参数序列化为json后,运行时类型信息丢失(如接口类型退化为具体类、long退化为integer),消费端反序列化时因类型不匹配导致反射调用失败;
12、5. 分布式上下文传播断裂:同步rpc中由框架自动传递的链路追踪id(traceid)和多租户域名等上下文信息,在转为消息驱动后会在进程边界处断裂,缺乏可配置的传播机制。
技术实现思路
1、鉴于以上内容,有必要提供一种基于注解驱动机制的任务执行方法、装置、设备及介质,旨在基于注解驱动机制优化任务执行过程。
2、一种基于注解驱动机制的任务执行方法,所述基于注解驱动机制的任务执行方法包括:
3、在spring容器的bean工厂后处理阶段,读取远程过程调用rpc扫描包路径配置得到扫描结果,通过类路径扫描器从所述扫描结果中筛选出标注有rpc服务注解的实现类,解析所述实现类所对应rpc接口方法上的异步任务注解,并根据所述异步任务注解生成全局共享元信息;
4、在所述spring容器的bean后处理阶段,遍历实例化完成的rpc服务的原始bean,并根据所述原始bean及所述全局共享元信息执行bean二次代理包装,在原有rpc框架生成的代理外层增设独立拦截代理层以形成双层代理结构,得到二次代理bean;
5、在所述spring容器的初始化后阶段,根据所述全局共享元信息中的所述异步任务注解进行动态注册,得到消息队列基础设施;
6、在服务运行阶段,通过所述二次代理bean内的方法拦截器拦截rpc调用请求,并在查询所述全局共享元信息判定命中所述异步任务注解时,将所述rpc调用请求的方法参数序列化为携带类型标签的消息体,并通过所述消息队列基础设施发送所述消息体;
7、在消费阶段,当通过所述消息队列基础设施中的消息监听器接收到所述消息体时,基于所述消息体携带的类型标签还原得到所述方法参数,对所述双层代理结构逐层穿透,获取保留完整切面增强的目标业务对象,并以所述目标业务对象为执行主体,通过反射调用机制执行所述消息体所携带的rpc业务任务。
8、一种基于注解驱动机制的任务执行装置,其特征在于,所述基于注解驱动机制的任务执行装置包括:
9、生成单元,用于在spring容器的bean工厂后处理阶段,读取远程过程调用rpc扫描包路径配置得到扫描结果,通过类路径扫描器从所述扫描结果中筛选出标注有rpc服务注解的实现类,解析所述实现类所对应rpc接口方法上的异步任务注解,并根据所述异步任务注解生成全局共享元信息;
10、执行单元,用于在所述spring容器的bean后处理阶段,遍历实例化完成的rpc服务的原始bean,并根据所述原始bean及所述全局共享元信息执行bean二次代理包装,在原有rpc框架生成的代理外层增设独立拦截代理层以形成双层代理结构,得到二次代理bean;
11、注册单元,用于在所述spring容器的初始化后阶段,根据所述全局共享元信息中的所述异步任务注解进行动态注册,得到消息队列基础设施;
12、拦截单元,用于在服务运行阶段,通过所述二次代理bean内的方法拦截器拦截rpc调用请求,并在查询所述全局共享元信息判定命中所述异步任务注解时,将所述rpc调用请求的方法参数序列化为携带类型标签的消息体,并通过所述消息队列基础设施发送所述消息体;
13、所述执行单元,还用于在消费阶段,当通过所述消息队列基础设施中的消息监听器接收到所述消息体时,基于所述消息体携带的类型标签还原得到所述方法参数,对所述双层代理结构逐层穿透,获取保留完整切面增强的目标业务对象,并以所述目标业务对象为执行主体,通过反射调用机制执行所述消息体所携带的rpc业务任务。
14、一种计算机设备,所述计算机设备包括:
15、存储器,存储至少一个指令;及处理器,执行所述存储器中存储的指令以实现所述基于注解驱动机制的任务执行方法。
16、一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一个指令,所述至少一个指令被计算机设备中的处理器执行以实现所述基于注解驱动机制的任务执行方法。
17、由以上技术方案可以看出,本发明能够在spring容器的bean工厂后处理阶段生成全局共享元信息,在代理生成前读取rpc接口上的注解,克服rpc框架生成代理后无法解析接口注解的缺陷,且运行阶段无需重复扫描、解析注解,降低了服务开销;在bean后处理阶段生成二次代理bean,不修改底层rpc框架原生代理逻辑,无需侵入rpc框架源码,兼容性强;在初始化后阶段能够动态注册得到消息队列基础设施,消除了人工配置错配风险;在服务运行阶段通过代理拦截将同步rpc调用无感转为异步消息投递,并序列化为携带类型标签的消息体,为消费端精准还原参数类型提供依据,解决了通用序列化场景下参数类型丢失、反序列化失败及上下文传播断裂问题;在消费阶段,依靠类型标签可靠还原调用参数,能够保障跨进程消息反序列化准确性,逐层穿透双层代理结构获取原始业务对象,并通过反射调用机制执行消息体所携带的rpc业务任务,提升了框架复用性。
版权声明:本站专利文献数据主要来源于国家知识产权局等公开渠道,由 技术新讯 进行整理汇编。页面设计及数据汇编的著作权归本站所有。全部内容仅供个人学习、科研评估与技术交流参考,严禁用于任何商业用途(包括但不限于直接生产制造、技术转让、倒卖数据等)。
免责条款:专利技术具有时效性,本站不对资料的绝对准确性、完整性和可实施性提供任何明示或暗示的担保。因参考本站内容造成的直接或间接损失,本站不承担相关法律责任。若您认为本站内容有侵权问题,请及时提供权属证明与我们联系,本站将在核实后依法处理。反馈意见:yyfuon@163.com