`
ldd600
  • 浏览: 101817 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11078
社区版块
存档分类
最新评论

通用RPC简易框架(2): 重要模块

阅读更多

重要模块

传参,序列化,反序列化机制

参数格式

AgentRequest

参数名

参数说明

类名

远程类的类名,包括包路径,String

方法名

远程方法的名字,String

方法参数

远程方法的所有参数,List

会话控制ID

每次远程方法调用会话的唯一标识,UUID

 

AgentResponse

参数名

参数说明

会话控制ID

每次远程方法调用会话的唯一标识,UUID

执行结果

远程方法的返回值,Object

异常

远程方法调用时出现的异常,Throwable

方法参数在添加时,顺序要和远程方法一致,并且方法参数和执行结果在clientserver端的classpath上都存在,并且需要保持一致。这样序列化和反序列化才能正常进行,如果采用定制系统,可由业务开发人员自己实现。

 

序列化,反序列化机制:

可以定制,默认采用XStream

 

负载均衡

JMS方式可以让同一个agent group的所有agent server都监听在同一个queue上,这是一个简单的负载均衡结构。 是由JMS提供商实现的。

 

其他的方式采用简单的client side实现,结构如图

 

client端每个agentGroup维护一个循环链表存放所有activeagent,用另外一个链表维护所有inactiveagents ,如果在调用的过程中发现某个agent不可达,发生connection error,比如出现SocketException,就判定这个agent不可达,并从active agent链表中移到inactive agent的链表中。在后台还会schedule一个线程周期性地检测inactive链表中的agent是否已经可达,agent server可以提供一个isHealthy方法。如果可达的话,就从inactive链表中移到active链表中。

 

 

 

同步, 异步远程调用

如果业务逻辑对远程调用的执行结果依赖性很强,或者业务逻辑上的调用需要同步,可以使用同步远程调用。异步远程调用可以提高系统的吞吐率。

 

HTTP

同步:HTTP是一种同步通信协议,client端可以用HTTPComponent,现在HTTPClient也属于它的一个子项目。

异步:由于非阻塞IO的出现,出现了很多frameworksocket异步通信的支持。Apache HTTP Component就是其中一个,今年发布了GA release版本。用它可以方便地实现HTTP的异步通信。大体原理如下图所示:

 

 

 

JMS:

同步:可以用jmsTemporaryQueue作为同步调用的信道。JmsExecutor创建一个TemporaryQueuetempQueue,然后再发送agentRequest到业务逻辑指定的QueuebusiessQueue中,接着JmsExecutor监听在这个TemporaryQueue上,agent server监听在这个busiessQueue上,收到消息后执行agent server端业务逻辑,并将agentResponse发送到tempQueue中,JmsExecutor得到执行结果,然后删除tempQueue

异步:JMS本身就是一种异步通信方式

 

RMI

同步:RMI是一种同步调用方式

异步:需要自己实现Reactor/Connector模式 实现方式类似HTTP的异步结构图。

 

业务逻辑调用者

业务逻辑调用可以用java反射实现。

 

Agent上下文

ThreadLocal实现

 

异常处理

如果在远程业务逻辑调用的过程中异常,并抛出到Agent server中,传回到客户端,由客户端处理。

 

源代码:

过两天整理好了补上。

 

分享到:
评论
1 楼 bluemusic 2010-05-07  
等大哥源码

相关推荐

Global site tag (gtag.js) - Google Analytics