1

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

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

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

  1. 消费者组件想要调用服务,因此它构造了一个请求字符串(手写和脏)
  2. 请求字符串被压缩并放入 JMS 消息中(也很脏)
  3. 请求消息通过 JMS 和路由机制传输(那部分没问题)
  4. 服务首先需要解压解析请求字符串,识别正确的方法(脏​​)
  5. 该方法被调用,回复类似于#2 - #4。

所以这看起来很像 SOAP,而我认为 SOAP 对我的应用程序来说太重了,而且我根本没有使用 HTTP。鉴于我在想一个人可能能够将问题解构为不同的组件。

  1. A 部分:HTTP 被 JMS 取代(那个没问题)
  2. B 部分:XML 被更轻量级的东西取代(好吧,MessagePack在这里派上用场)
  3. C部分:解析请求/回复字符串以识别操作名称和参数值的机制(这是真正的问题)

我正在研究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
4

1 回答 1

3

我认为这个 Spring 包是你正在寻找的。请参阅JmsInvokerProxyFactoryBean和相关类。

从javadoc:

用于 JMS 调用程序代理的 FactoryBean。使用指定的服务接口公开代理服务以用作 bean 引用。

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

于 2012-08-27T16:19:54.983 回答