轻量级 Java Web 服务
Posted
技术标签:
【中文标题】轻量级 Java Web 服务【英文标题】:Light Weight Java Web Services 【发布时间】:2014-06-07 15:15:46 【问题描述】:我有 Java EE 应用程序 (ear) 在不同的 JBoss 实例和不同的硬件上运行。我想打电话给
-
一个应用程序到另一个服务器 JBOSS 中的另一个应用程序。
相同的 JBOSS,在两耳之间。
同一服务器,在两个 JBO 之间。
通信数据类型可以是任何类型。例如; JSON 或对象。我想知道我可以使用哪些轻量级的开源 Java Web 框架来相互调用? Here 其中一些。但我没有他们的经验。常用的有 SOAP 和 RESTful 服务,它们的实现框架很多。
请根据您的经验建议我知道哪些可用框架适合我的要求?让我有解释任何比较的来源。我担心的是,通信方法应该是轻量级的,应该支持传输任何类型的数据,不应该有太多的配置或标准。该框架应该支持简单(所有通信都在我的应用程序中完成。因此不需要结构良好、标准化的权重配置)和安全的传输。它应该是Java。我使用 Java 7。
【问题讨论】:
使用 EJB 怎么样? 【参考方案1】:这是一个典型的集成问题。对于集成、调解、代理等不同的服务,甚至传输数据,请使用Apache Camel。有关什么是 Camel 的简短回答,请参阅 What exactly is Apache Camel?
在 Camel 中,您使用 Java DSL 或 XML Spring DSL 定义路由。 here 描述了代理 Web 服务。使用 XML Spring DSL,路由将如下所示:
<route>
<from uri="jetty:http://0.0.0.0:8080/myapp?matchOnUriPrefix=true"/>
<to uri="jetty:http://realserverhostname:8090/myapp?bridgeEndpoint=true&throwExceptionOnFailure=false"/>
</route>
使用 Java DSL,这将变成:
from("jetty:http://0.0.0.0:8080/myapp?matchOnUriPrefix=true"
.to("jetty:http://realserverhostname:8090/myapp?bridgeEndpoint=true&throwExceptionOnFailure=false")
Camel 支持许多不同的协议,例如 JSM、SOAP WS、RESTful WS、纯 HTTP、TCP。查看https://camel.apache.org/components.html 了解所有可能性。
下一个示例向您展示使用 Restlet component 定义 RESTful 服务器是多么容易:
from("restlet:http://localhost:8400/orders/id?restletMethod=post")
.process(new Processor()
@Override
public void process(final Exchange exchange) throws Exception
final String res = "received [" + exchange.getIn().getBody(String.class) + "] with order id = " + exchange.getIn().getHeader("id");
exchange.getIn().setBody(res);
);
对应的客户端如下:
from("direct:start")
.setBody(constant("Hello, world!!"))
.to("http://localhost:8400/orders/22?restletMethod=post")
.log("order: direct start body result = $bodyAs(String)")
也就是说,Camel 支持大量企业集成模式,例如拆分器、聚合器等,可用于满足您的需求。请查看http://camel.apache.org/enterprise-integration-patterns.html 了解更多信息。
您可以只使用“普通”Java 类来转换数据并将它们挂接到路由中。除此之外,还有许多用于将一种数据类型转换为另一种数据类型的集成类型转换器。这些转换器可以轻松扩展。见https://camel.apache.org/type-converter.html。
您可以使用 Camel 作为基础集成框架并添加例如JMS/ActiveMQ 用于通信。但是,也可以使用 ActiveMQ 作为基础并添加 Camel 来转换数据,请参阅https://activemq.apache.org/broker-camel-component.html:“代理骆驼组件使这变得更加容易——它在消息通过代理本身时拦截消息,允许它们被在它们被持久化到消息存储或交付给最终消费者之前进行修改和操作。”但是,我更喜欢使用 Camel 作为基础并添加 JMS/ActiveMQ 用于异步通信(例如,如果需要消息持久性或必须在不同主机之间进行通信)。
Camel 支持大量不同的协议和格式。但是,如果您不需要它们,则不必使用它们。如果需要,只需将依赖项添加到您的 pom.xml
即可。 Apache Camel 是一个小型库 (11.2 MB),具有最小的依赖项,可轻松嵌入任何 Java 应用程序。 Camel 在 Servlet 引擎或 OSGI 容器(如 Karaf/ServiceMix/JBoss Fuse ESB)中独立运行。如果您的需求不断增长,您可以从小处着手,应用程序也可以增长。
要开始使用 Camel,请阅读 Claus Ibsen 的优秀书籍:http://www.manning.com/ibsen/。
【讨论】:
彼得,谢谢您的回复。使用骆驼是一个好点。但我觉得这对我的应用程序来说可能很重。 @Débora Camel 支持大量不同的协议和格式。但是,如果您不需要它,则不必使用它。如果需要,只需将依赖项添加到您的pom.xml
即可。 Apache Camel 是一个小型库,具有最小的依赖项,可轻松嵌入任何 Java 应用程序。 Camel 在 Servlet 引擎或 OSGI 容器(如 Karaf/ServiceMix/JBoss Fuse ESB)中独立运行。如果您的需求不断增长,您可以从小处着手,应用程序也可以增长。
@Débora Apache camel 实际上是 11.2MB 下载。它一点也不重,事实上它非常轻。
再次感谢您的进一步解释。我看了看骆驼。在他们的设计中,Camel 使用 JMS 进行消息传递。那么如果我使用 JMS (ActiveMQ) 进行通信呢?因为我不需要管理其他由 Camel 完成的 API 和 EIP。这里我主要关心的是应用程序之间的通信。因此,如果我使用 JMS(Camel 用于消息传递)而不是整个 Camel,你会怎么想?
@Débora 也可以使用 ActiveMQ 作为基础并添加 Camel 来传输数据,请参阅activemq.apache.org/broker-camel-component.html。我相应地增强了我的答案。【参考方案2】:
根据我对您的情况的理解,我认为 ESB 将是解决您问题的好方法。
http://en.wikipedia.org/wiki/Enterprise_service_bus
来自 WSO2 的 ESB 是一个非常轻量级的开源 ESB,并且拥有一个很好的活跃社区。 http://wso2.com/products/enterprise-service-bus/
【讨论】:
谢谢瓦奈。这是一个很好的观点。但它感觉它是一种用于促进通信的部署架构。 “描述松耦合软件组件的实现”。我的应用程序的所有集成的权重可能很高。【参考方案3】:您可以使用 jax-ws 从您的 JBoss 提供 Web 服务并使用 javax.xml.soap 调用它们。我不知道是否可以发送对象数据,也许您必须从 xml 序列化到 xml 端将其编码为 base64 字符串。
另一种方式可能是 jms。
【讨论】:
感谢您的关注。据我到目前为止所阅读的,如果我使用 jax-ws,我必须遵循标准等等。到目前为止,我已经发现并考虑使用 REST 或 JMS。【参考方案4】:如果此处列出的所有其他解决方案都不能满足您的需求,您可以通过 HTTP 发送 JSON 或 XML 数据与应用程序交互。
Spark 是一个用于 Java 的微型 Web 框架,可让您快速创建 Web 端点。
默认情况下,Spark 在嵌入式服务器上运行,但它可以轻松地在现有 JBoss 服务器上运行。 Here 是我几个月前整理的一个示例,用于演示它是如何工作的以及如何让它与 JBoss 一起工作。
您可以让每个需要接收数据的应用程序公开一个 HTTP 端点,并让调用应用程序发送一个简单的 HTTP 请求。
【讨论】:
谢谢,我们可以用 Spark 发送序列化对象吗?【参考方案5】:简单而开放的胜利。您可以通过多种不同方式远程公开对象,但 Java RMI 和 EJB 将您限制为仅限 Java 客户端。
最开放、最简单的方法是使用 HTTP 作为协议和 Web 服务,可以是 SOAP 或 REST(我的偏好)。这些将与任何客户端轻松交互,即使是那些不是 Java 的客户端。客户不需要知道或关心您选择 Java 和 JBOSS 来实现您的服务器逻辑。
【讨论】:
以上是关于轻量级 Java Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
3.6 万 Star!一个跨平台快速的轻量级 Web 服务器