重要模块
传参,序列化,反序列化机制
参数格式
AgentRequest:
参数名
参数说明
类名
远程类的类名,包括包路径,String
方法名
远程方法的名字,String
方法参数
远程方法的所有参数,List
会话控制ID
每次远程方法调用会话的唯一标识,UUID
AgentResponse
参数名
参数说明
会话控制ID
每次远程方法调用会话的唯一标识,UUID
执行结果
远程方法的返回值,Object
异常
远程方法调用时出现的异常,Throwable
方法参数在添加时,顺序要和远程方法一致,并且方法参数和执行结果在client和server端的classpath上都存在,并且需要保持一致。这样序列化和反序列化才能正常进行,如果采用定制系统,可由业务开发人员自己实现。
序列化,反序列化机制:
可以定制,默认采用XStream
负载均衡
JMS方式可以让同一个agent group的所有agent server都监听在同一个queue上,这是一个简单的负载均衡结构。 是由JMS提供商实现的。
其他的方式采用简单的client side实现,结构如图
对client端每个agentGroup维护一个循环链表存放所有active的agent,用另外一个链表维护所有inactive的agents ,如果在调用的过程中发现某个agent不可达,发生connection error,比如出现SocketException,就判定这个agent不可达,并从active agent链表中移到inactive agent的链表中。在后台还会schedule一个线程周期性地检测inactive链表中的agent是否已经可达,agent server可以提供一个isHealthy方法。如果可达的话,就从inactive链表中移到active链表中。
同步, 异步远程调用
如果业务逻辑对远程调用的执行结果依赖性很强,或者业务逻辑上的调用需要同步,可以使用同步远程调用。异步远程调用可以提高系统的吞吐率。
HTTP
同步:HTTP是一种同步通信协议,client端可以用HTTPComponent,现在HTTPClient也属于它的一个子项目。
异步:由于非阻塞IO的出现,出现了很多framework对socket异步通信的支持。Apache HTTP Component就是其中一个,今年发布了GA release版本。用它可以方便地实现HTTP的异步通信。大体原理如下图所示:
JMS:
同步:可以用jms的TemporaryQueue作为同步调用的信道。JmsExecutor创建一个TemporaryQueue:tempQueue,然后再发送agentRequest到业务逻辑指定的Queue:busiessQueue中,接着JmsExecutor监听在这个TemporaryQueue上,agent server监听在这个busiessQueue上,收到消息后执行agent server端业务逻辑,并将agentResponse发送到tempQueue中,JmsExecutor得到执行结果,然后删除tempQueue。
异步:JMS本身就是一种异步通信方式
RMI:
同步:RMI是一种同步调用方式
异步:需要自己实现Reactor/Connector模式 实现方式类似HTTP的异步结构图。
业务逻辑调用者
业务逻辑调用可以用java反射实现。
Agent上下文
用ThreadLocal实现
异常处理
如果在远程业务逻辑调用的过程中异常,并抛出到Agent server中,传回到客户端,由客户端处理。
源代码:
过两天整理好了补上。
相关资源:敏捷开发V1.0.pptx