Nepxion-Thunder(QQ 群 471164539)发布在https://github.com/Nepxion/
调用链根据单端和多端分成两种方式
单端链式调用
基于Jdeferred框架,实现单端的链式调用,支持异步链式Callback调用。它的调用过程是
- A,B,C是同一个服务器的不同进程,也可以是不同服务器的进程
- A先发请求(同步或者异步)到B
- B收到A的请求后,进行处理,返回给A
- A收到B的响应后,进行处理,再发送给C
- C收到A的请求后,进行处理,返回给A,结束
- 链式可以无限长,可以有D,E,F.....
它的优点是:
- 业务端不需要实现Callback
- 业务端原本需要通过Callback串联起来的若干个异步调用,直接由链式调用代理
- 业务端任何异常抛出,都将终止下一次的调用,并被捕获
- 链式调用的代码,无论是放在主线程/子线程执行,都不会阻塞当前线程的其它代码执行
- 链式调用支持多个链式调用的并发,哪怕某个链式环节所调用的接口,方法,参数等都是一样的,它也不会走岔,即从哪个链式出来请求,会准确返回到哪个链式去
- 链式调用通过泛型化,明确无误的告诉业务端开发人员,入参和出参类型,如果没设置对,直接从代码编译上出错,即Eclipse等编辑器自动会报错
- 链式调用不需要业务端手工埋点,以内置的全局唯一的MessageId作为回调方法准确寻址的依据
下面是链式调用示例代码,我们可以看出,链式调用过程是service1.do(int value),回调后,调用service2.do(String value),回调后,调用service3.do(Long value),最后链式调用结束打印,如果有环节发生异常,就会打印异常,终止链式调用
final int param = 0;
PromiseExecutor promiseExecutor = new PromiseExecutor();
promiseExecutor.then(new PromisePipe<Void, String> {
@Override
public void onResult(Void origin) {
service1.do(param);
}
}).then(new PromisePipe<String, Long>() {
@Override
public void onResult(String result) {
service2.do(result);
}
}).then(new PromisePipe<Long, Boolean>() {
@Override
public void onResult(Long result) {
service3.do(result);
}
}).done(new PromiseDone<Boolean>() {
@Override
public void onDone(Boolean result) {
LOG.info("链式调用完成,最终值={}", result);
}
}).fail(new PromiseFail() {
@Override
public void onFail(Exception exception) {
LOG.error("链式调用异常", exception);
}
});
promiseExecutor.execute();
1. PromiseExecutor
基于Jdeferred框架的DeferredObject,Thunder框架封装成PromiseExecutor,它是链式调用的发起者,它的用法是:
- 发起调用 - promiseExecutor.execute()
-
链式调用过程 - promiseExecutor.then(...).then(...)....done(...).fail(...)
then方法可以无数个
done和fail的方法必须是一个,也可以没有,但强烈建议加上
如果需要处理最终的结果,必须加done
如果需要处理链式调用中的异常,必须加fail
2. PromisePipe
基于Jdeferred框架的DonePipe,Thunder框架封装成PromisePipe,它是链式调用的流程控制和参数传递的通道,通过泛型化入参(T)和出参(R)来实例化,如果PromisePipe在调用过程中有异常抛出,将终止下一个链式调用,直接把异常交给PromiseFail,并被捕捉到。如果整个链式调用如期完成,那么将最终数据交给PromiseDone进行处理
-
入参(T) - 上一个链式调用的回调值类型,第一个链式调用的入参为Void。例如上例中service2.do(result)所在的PromisePipi,它的入参类型是String
-
出参(R) - 下一个链式调用的参数值类型。例如上例中service2.do(result)所在的PromisePipi,它的出参类型是Long
-
管道处理 - 必须实现onResult(T result)方法,在这里经过一些业务处理,再去调用下一个业务接口。例如上例中service2.do(result)所在的PromisePipi,它的入参类型是String,所以管道处理方法肯定也是
onResult(String result)
3. PromiseDone
基于Jdeferred框架的DoneCallback,Thunder框架封装成PromiseDone,它是链式调用接收最终数据的通道,通过泛型化入参(T)来实例化
- 入参(T) - 上一个链式调用的回调值类型
- 管道处理 - 必须实现onDone(T result)方法
4. PromiseFail
基于Jdeferred的FailCallback,Thunder框架封装成PromiseFail,它可以捕捉链式调用任何中间环节的异常
-
管道处理 - 必须实现onFail(Exception exception)方法
5. Promise回调定义
只需要在定义callback的时候,写成callback="promise"
<thunder:reference id="myInterface" interface="com.nepxion.thunder.service.MyInterface">
<thunder:method method="myMethod" async="true" callback="promise"/>
</thunder:reference>
6. Promise回调异常的捕捉
通过PromiseFail的方式,捕捉业务异常
通过EventBus的方式,捕捉超时异常(场景一般是调用端发出请求后,服务端接收到后死机,那么Promise长期回不来,就根据调用端定义的超时时间,通过异步时间通知捕捉到异常)
具体示例见Thunder/ trunk / nepxion-thunder / src / test / java / com / nepxion / thunder / trace
AEnd4执行的是两次Callback调用,采用Promise框架实现
多端跨进程调用链
框架支持跨进程调用链。它的调用过程是:
- A,B,C是同一个服务器的不同进程,也可以是不同服务器的进程
- A先发请求(同步或者异步)到B
- B收到A的请求后,再发送请求(同步或者异步)到C
- C收到B的请求后,进行处理,发送响应到B
- B收到C的响应后,进行处理,发送响应到A
- A收到B的响应后,进行处理,结束
链式可以无限长,可以有D,E,F.....

它和单端链式调用的区别是:
- 多端跨进程调用链更偏向服务治理的范畴,通过外部拓扑图,表格等界面显示方式,让业务端更容易的看到全局调用过程
- 单端链式调用则偏向框架友好性的范畴,让业务端使用更方面
它和单端链式调用的关系是:
- 多端跨进程调用链和单端链式调用可以同时使用
- 单端链式调用的路由分析,也可以通过多端跨进程调用链的方式来实现
它的优点是:
- 业务端可以轻易的串联起位于不同服务器上的调用
- 业务端根据全局TraceId寻找出调用链路径,异常分析
它的缺点是:
- 业务端需要自己手工埋点,通过API的方式,例如xxxService.do(String traceId, .....)。对于业务端来说,这个traceId是全局唯一的(如果不设置,默认取第一个参数),例如电商系统可以采用订单号,支付系统可以采用交易号
跨进程调用链的实现思路是每一个进程必须服务端和调用端为一体,即A向B发送请求的时候,A是调用端,B是服务端,B向C发送请求的时候,B是调用端,C是服务端。同理,C向B发送响应(其实也是请求,只不过以请求的方式包装了响应结果)的时候,C是调用端,B是服务端。
这就要求,在一个业务应用的Spring配置里,必须同时配置服务端和调用端,例如如下:
bInterface必须注入aInterface和cInterface的引用,通过业务层面去控制调用(这个很简单)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:thunder="http://www.nepxion.com/schema/thunder"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.nepxion.com/schema/thunder http://www.nepxion.com/schema/thunder/thunder-1.0.xsd">
<thunder:application id="application" application="Audit" group="MY_GROUP" cluster="BCluster" port="2000"/>
<thunder:protocol id="protocol" type="netty"/>
<thunder:registry id="registry" type="zookeeper" config="remote"/>
<thunder:strategy id="strategy" loadbalance="roundRobin"/>
<thunder:monitor id="monitor" type="logService,redisService"/>
<thunder:service id="bInterface1" interface="com.nepxion.thunder.trace.service.BInterface1" ref="bInterface1Impl"/>
<bean name="bInterface1Impl" class="com.nepxion.thunder.trace.service.BInterface1Impl">
<property name="aInterface" ref="aInterface"/>
<property name="cInterface" ref="cInterface"/>
</bean>
<thunder:service id="bInterface2" interface="com.nepxion.thunder.trace.service.BInterface2" ref="bInterface2Impl"/>
<bean name="bInterface2Impl" class="com.nepxion.thunder.trace.service.BInterface2Impl">
<property name="aInterface" ref="aInterface"/>
</bean>
<thunder:reference id="aInterface" interface="com.nepxion.thunder.trace.service.AInterface">
<thunder:method method="asyncToA" async="true"/>
</thunder:reference>
<thunder:reference id="cInterface" interface="com.nepxion.thunder.trace.service.CInterface">
<thunder:method method="asyncToC" async="true"/>
<thunder:method method="syncToC" async="false"/>
</thunder:reference>
<bean id="eventInterceptor" class="com.nepxion.thunder.trace.service.ServiceEventInterceptor"/>
</beans>
具体示例见
Thunder/ trunk / nepxion-thunder / src / test / java / com / nepxion / thunder / trace该示例
主要是为了模拟调用链,运行CEnd1和CEnd2会启动C集群服务器,运行BEnd1和BEnd2会启动B集群服务器。 集群下的若干服务器将会自行负载均衡调用。其中AEnd1执行的全异步调用路径,AEnd2和AEnd1属于一个集群服务器,可以代替AEnd1接收消 息;AEnd3执行的是全同步调用路径;AEnd5执行的是先异步后同步的调用路径

- 大小: 149.1 KB
分享到:
相关推荐
Nepxion Thunder是一款基于Netty + Hessian + Kafka + ActiveMQ + Tibco + Zookeeper(Curator Framework) + Redis + FST + Spring + Spring Web MVC + Spring Boot + Docker分布式RPC调用框架。架构思想主要是来自...
通过支持Nepxion Thunder、Dubbo和Motan等RPC调用集成,该框架能够灵活地适应不同的分布式通信需求,而通过规则配置实现的调用聚合则赋予了该框架强大的业务适应性。这对于需要高效、可靠、易于扩展的分布式系统的...
IBM-海尔人力资源转型会议(报告全文).pdf
《刘禹锡《秋词》》PPT课件教案模板.pptx
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
毕业论文-场地预定V2.17.0+收银V1.10.0+会员V1.80.0+小程序-整站商业源码.zip
内容概要:本文详细介绍了模块化多电平换流器(MMC)在Matlab-Simulink平台上的仿真研究。重点讨论了采用N=22的MMC结构,通过最近电平逼近调制(NLM)技术和功率外环、电流内环的双闭环控制策略进行仿真分析。具体来说,电流内环采用了PI+前馈解耦控制方法,并引入电容电压排序优化子模块的选择。仿真结果显示,该系统能够获得对称的三相电压和电流波形,电容电压波形良好,系统在功率提升后依然保持稳定运行。 适合人群:从事电力系统、电力电子技术研究的专业人士,尤其是关注高压直流输电(HVDC)领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解MMC仿真建模、控制策略优化及其实现效果的研究项目。目标是验证MMC结构和控制策略的有效性,为实际电力系统应用提供理论支持和技术依据。 其他说明:本文不仅展示了具体的仿真步骤和参数设置,还深入分析了各部分的工作原理和优化措施,有助于读者全面掌握MMC技术的应用和发展方向。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文档是2021年全国大学生电子设计竞赛试题之一,主题为三端口DC-DC变换器。竞赛规定了严格的参赛规则,包括时间安排、队伍人数、身份验证以及比赛期间的行为准则。题目要求设计并制作一个三端口DC-DC变换器,该变换器具有两种工作模式:模式I用于模拟光伏电池向负载供电并为电池组充电,模式II用于模拟光伏电池和电池组同时为负载供电。基本要求包括在不同输入电压和负载条件下确保输出电压稳定在30V,并达到特定的电压调整率、负载调整率和效率。发挥部分则增加了自动模式切换、最大功率点跟踪等功能的要求。评分标准涵盖了设计方案、电路与程序设计、理论分析、测试方案及结果等多个方面,总分为120分。; 适合人群:参加全国大学生电子设计竞赛的本科组学生,尤其是对电力电子、DC-DC变换器设计感兴趣的电子工程专业学生。; 使用场景及目标:①帮助参赛学生理解三端口DC-DC变换器的工作原理及其设计要点;②指导学生完成从方案论证到最终测试的全过程;③确保学生能够在规定时间内高效完成设计并满足各项性能指标。; 其他说明:参赛队伍需严格遵守竞赛规则,确保设计方案的安全性和可靠性。此外,评分标准详细列出了各部分的具体要求和分值,有助于学生有针对性地准备和优化设计方案。
313398228_按序号_新文科建设下经济类专业人才需求市场调研问卷_2487_2487.xlsx
Hyperstudy中文教程 2.pdf
IT运维管理评估方法.pdf
MBD技术实施研究.pdf
内容概要:本文介绍了基于西门子200Smart PLC和威纶通触摸屏的MoveVelocity电子凸轮系统Ver1.3。该系统实现了变速、梯形加减速及正反向运动控制等功能。文中详细描述了系统的组成、PLS指令编写方法及其应用特点。通过非调用库的方式编写PLS指令,确保了系统的灵活性和适应性。此外,新版本增加了运动中变速功能,进一步提升了系统的精确控制能力和复杂工业自动化需求的满足度。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程有一定基础的人群。 使用场景及目标:适用于需要精确控制设备运动速度、位置和时间的工业环境。主要目标是帮助用户掌握MoveVelocity电子凸轮系统的实现原理和操作方法,从而更好地应用于实际项目中。 其他说明:该系统不仅提供了详细的PLS指令编写指南,还强调了系统开发和维护的便捷性。未来将致力于优化系统性能,提升稳定性和可靠性。
Kinetic新动能助力制造业智造未来.pdf
FlowPortal 以流程驱动的应用(2014扬州CIO沙龙).pdf
# 基于springboot的“考研资讯平台”的设计与实现(源码+数据库+文档+PPT) - 开发语言:Java - 数据库:MySQL - 技术:springboot - 工具:IDEA/Ecilpse、Navicat、Maven
毕业论文- CCIA投票小程序V1.1.9开源版 前端+后端-整站商业源码.zip
开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足不同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。不同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有不同的操作权限。 权限控制:系统根据用户类型分配不同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看不同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况