已知的RPC协议放在JMS之上

时间:2012-08-27 14:02:54

标签: java jms protocols rpc thrift

我正在开发一个分布式系统,它由通过JMS(ActiveMQ)松散(异步)耦合的不同组件(服务)组成。

因此我不想重新发明轮子,我正在寻找一个(良好)已知的协议/库,它有助于在这些组件之间进行远程过程调用,并帮助我处理方法接口。

所以让我们通过肮脏的解决方案分解我现在已经解决的问题:

  1. 消费者组件想要调用服务,因此它构造了一个请求字符串(手写和脏)
  2. 请求字符串被压缩并放入JMS消息(脏等)
  3. 请求消息通过JMS和路由机制传输(该部分没问题)
  4. 服务首先需要解压缩并解析请求字符串,以识别正确的方法(脏​​)
  5. 调用该方法,回复类似于#2 - #4。
  6. 所以它看起来非常像SOAP,而我认为SOAP对我的应用程序来说很重要,而且我根本不使用HTTP。鉴于我认为人们可能能够将问题解构为不同的组件。

    1. A部分:HTTP被JMS取代(一个没问题)
    2. B部分:XML被更轻量级的东西取代(好吧,MessagePack在这里派上用场)
    3. C部分:解析请求/回复字符串以识别操作名称和参数值的机制(这是一个真正的问题)
    4. 我正在调查MessagePackProtocolBuffersThrift等等,但我不喜欢他们的是他们介绍了自己处理实际的方式(TCP沟通。并绕过我已经很复杂的JMS基础设施(它也处理负载平衡和东西)。

      为了进一步详细说明上面的C部分,这就是我目前处理它的方式:正确知道如果消费者会调用​​服务,我会做类似以下的事情,让我们假设服务接受文本并回复关键字。我希望消费者创建一个JMS消息并将其(通过ActiveMQ)传输到服务。该消息将包含:

       Syntax: OPERATION_NAME [PARAMETERS]
       Method: GET_ALL_KEYWORDS [String text] returns [JSON String[] keywords]
      
       Example Request: GET_ALL_KEYWORDS "Hello world, this is my input text..."
       Example Reply: ["hello", "world", "text"]
      

      毋庸置疑,感觉就像是被黑客攻击在一起。我看到的问题是,如果我要通过添加或删除参数来更改方法接口,我将必须检查所有请求/回复字符串构造/解构以同步更改。这是非常错误的。我宁愿让库构建正确的请求/回复语法,通过查看java接口并在运行时抛出真正的异常,如果我搞乱了,比如“协议异常:强制参数未设置”等等......

      任何已知的项目/库?

      要求是

      1. 它体积小,重量轻,速度快。
      2. 它是在JAVA中实现的
      3. 它没有太多用途(例如一些完整的框架,例如Spring

1 个答案:

答案 0 :(得分:3)

我认为这个Spring包是您正在寻找的。请参阅JmsInvokerProxyFactoryBean及相关课程。

来自javadoc:

  

FactoryBean for JMS invoker proxies。公开代理服务   使用指定的服务接口作为bean引用。

     

序列化远程调用对象并反序列化远程   调用结果对象。像RMI一样使用Java序列化,但是   与JMS提供商一起作为通信基础设施。