33

我是一个没有经验的 Java 开发人员,我试图围绕一些基本的中间件/SOA 概念和技术,特别是:

  • 面向服务的架构 (SOA)
  • 面向消息的中间件 (MOM)
  • 消息队列
  • 阿帕奇骆驼
  • 骡子
  • EJB
  • 端点和路由
  • 服务总线/ESB
  • 管理系统

在在线/在维基百科上查看每一个之后,我能够(在大多数情况下)为每一个得到体面的定义。我不明白的是所有这些技术/概念如何在后端协同工作以提供第二层/业务层解决方案。

有人可以举一个使用所有这些技术/概念的架构示例,并解释它们在整体解决方案中的作用吗?一旦我看到一个工作示例,我相信它会帮助我连接大部分点。

编辑:自从我添加了赏金,我有几个建议阅读书籍的答案。尽管我很欣赏这里的所有反馈,但我根本无法放弃 300 声望点来回答本质上归结为“RTM”的答案(尤其是当我破产且买不起手册时!)重申,赏金和明确的答案将交给一个可以在一个有意义的、实际的例子中击中所有这些子弹的人。这不一定是中间件纲要!!!只需一两段就可以说明如何将所有这些协调使用以生成 Java 业务层解决方案。再次感谢。

4

7 回答 7

23

SOA 主要原则:将系统构建为一组服务,其中每个服务

  • 粗粒度
  • 可互操作
  • 松耦合

一家公司提供了许多经过多年开发并以某种形式向用户(人类或其他系统)公开的业务服务(粗粒度)。设计和开发这些功能中的每一个的可能性更大,而不是牢记上述三个原则。此外,这些功能中的每一个都可能在不同的异构平台上运行,使用不同的技术等。

如果您想整合这些不同的功能从而创建新的解决方案怎么办(例如,亚马逊店面是一项由他们的目录服务、购物车服务等组成的新服务)?

你有两个选择:

  1. 牢记 3 条原则,从头开始构建新功能。但这是一项非常昂贵的努力,而且几乎永远不会成功。
  2. 一种有效且风险较小的替代方案是从现有的、经过验证的(经过良好测试的)服务组装/组合它。

选项 2 是ESB可以帮助支持路由、转换、监控等的地方。Apache CamelMule是开源 ESB。端点和路由是这些 ESB 实现的 EIP(企业集成模式)中使用的术语。当 ESB 想要路由/集成在异构平台上运行的服务时, ESB 可以借助MOM面向消息的中间件)(例如,目录服务可能在大型机系统上运行,但购物车是使用运行的有状态 EJB实现的在 Java 应用程序服务器中)。消息队列是 MOM 中的一个概念,它充当发送方和接收方之间消息的临时存储。这种临时存储提供了很多好处,如异步交付、保证交付等。有几个不同的 MOM 供应商,如 IBM (WebSphere MQ)、开源 ActiveMQ 等。我们可以使用JMS使您的代码独立于供应商。

我试图将所有概念与一个例子联系起来。我也试图保持简短。请提出后续问题以获得更多理解。

MOM 不是实现 SOA 的必要条件。例如,如果您的所有服务都通过 HTTP 通过 SOAP 公开,那么在这种情况下您不需要 MOM。

于 2012-04-09T20:33:00.140 回答
10

每种技术的 Java 类/示例。在单个帖子中可能无法实现,因为您所问的是进化行业在过去十年中经历了并且仍在不断发展。因此,过去十年发生的事情不能在一篇文章中涵盖。但是,很高兴了解它是如何经历这个阶段的,为什么需要新技术堆栈以及它解决了什么样的问题。

  • EJB 企业 Java Beans 服务器端组件架构。它可以实现快速和简化的开发

    1)分布式(多个应用程序服务器相互通信,服务器组件(例如服务调用托管在不同服务器上的其他服务)。

    2)事务性-持久性bean(DB TXN),任何简单/网络/分布式应用程序的最重要部分。易于开发,例如配置库。编写处理事务的 XML,例如何时提交、何时回滚(发生异常)等。JPA Java Persistance API 提供对象关系映射。比如你的表格行通过xml配置映射到你的java对象。

    3)安全 - 身份验证(uid/pwd)和授权(基于角色 - 谁是登录用户以及他可以做什么所有任务?)。

这在开发任何企业应用程序时看起来不错,但是它有一些缺点,例如它非常重(其中包含所有 jars。)。用作 bean 的类应符合 EJB 标准(类应为 EJB 引擎实现某些接口以了解它是哪种类型的 bean)。

为了克服这种情况,业界有许多可供 EJB 使用的替代方案,例如 Hibrnate 执行相同的操作,例如 OR 映射,TXN 处理与 EJB 中的持久 bean 提供的相同。Spring,轻量级框架并简化业务逻辑(您可以使用您已经构建的类,无需实现任何接口、检查异常或扩展一些强制性抽象类)。

现在,大多数公司都在使用轻量级框架,例如 Spring、Hibernate、IBatis、Axis-2。

  • 面向服务的架构 (SOA) 面向服务的架构是对企业级平台独立性的回应。或者为了更快地集成您的应用程序,在不同的应用程序服务器之间进行通信。

    试想一下,您想实施解决方案,为世界各地的酒店预订提供选项。您的要求是检查这些酒店的客房供应情况。现在,这意味着您需要一次与多个酒店应用程序进行交互。不必每家酒店都使用相同的标准,或者它们的应用程序(服务器、编程语言)可以部署在不同的应用程序服务器上。同时,编写可以与所有不同类型的应用程序服务器通信的不同应用程序是不切实际的。我们需要一些基于标准的解决方案来解决这个问题。这可以通过 Web 服务实现。

这是可能的,因为 Web 服务在基于 XML 的 SOAP(简单对象访问协议)中发送消息。XML 用于跨任何语言、平台或网络协议交换数据。

Web 服务可以分为基于 SOAP 和 REST。基于 SOAP 的服务 JAX-RPC 和 JAX-WS ( http://www.ibm.com/developerworks/webservices/library/ws-tip-jaxwsrpc/index.html )

Web服务可以先契约开发——先写WSDL。code first - 先写代码。

现在,让我们谈谈如何实际开始使用 Web 服务。

最简单的 Web 服务或 hello world(JAXWS) 可以写成如下:- http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/

  • 面向消息的中间件 (MOM)
  • 管理系统
  • 消息队列(点对点)

    MOM 需要克服请求-响应式通信的缺点。当客户端发送响应时,服务器需要处于活动状态。客户端等待响应,直到服务器执行并响应。

    请求响应 - 如果服务器或客户端关闭,应用程序将失败。MOM - 任何一个端点都不需要按时发送请求消息以进行处理。

    MOM 是概念,JMS 是这个概念的规范。许多供应商已经实现了这个规范,例如 IBM 有 MQ、OpenJMS 开源实现、Tibco 的 EMS 等。

JMS 规范主要有两种模式。发布/订阅和 ponin 到点。

Pub/sub是主题,您的应用程序希望向所有相关方发布某些信息。例如仪表板。(股票应用程序希望向所有注册的侦听器通知某些消息)。

点对点通信是通过消息队列完成的。

业务用例 - 认为您有应用程序,例如客户对客户服务的请求。另一方,您有多个客户服务代表,而其他客户有时多于客户服务代表,一次只有一个代表会收到要处理的请求,他/她在完成任务之前不会收到下一个请求。(同一个队列多个窗口,哪个窗口空闲将处理请求)。您可以在其中考虑其他复杂性,例如,如果其中一个节点发生故障、请求未处理以及特定类型的请求需要由特定节点处理怎么办。等等

生成代码:- http://docs.oracle.com/javaee/1.4/tutorial/examples/jms/simple/src/SimpleProducer.java

消费者同步代码:-(POJO 类) http://docs.oracle.com/javaee/1.4/tutorial/examples/jms/simple/src/SimpleSynchConsumer.java

http://www.java2s.com/Code/Java/J2EE/ThisexampleisasimpleJMSclientapplication.htm

使用异步代码:-(Spring by example - 从目的地读取消息直到程序不会停止。) http://www.springbyexample.org/examples/simple-spring-jms-listener-config.html

虽然,它只是基本的,但此 MOM 中需要涵盖许多方面,例如什么是故障转移机制、什么是选择器、持久消息、消息确认模式等......

  • 服务总线/ESB
  • 端点和路由
  • 阿帕奇骆驼
  • 骡子

现在,假设您很久以前就采用了 SOA 和 MOM,并且您有一堆服务可以相互通信以完成企业范围的任务。想象一下,管理诸如应该从哪里重定向的多个目的地之类的逻辑将非常麻烦。有人称此应用程序逻辑。服务总线将用于减少应用程序逻辑并更多地关注业务逻辑(应用程序提供的功能)。

简单来说,将端点视为暴露在服务器上的 URL。您将使用此 url/端点来调用您的服务。

例如 http://localhost:8888/Context/MyService?wsdl

在代码中: -

    String endpointAddress = "http://localhost:8080/jaxws/services/hello_world?wsdl";

    // Add a port to the Service
    service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

    HelloWorld hw = service.getPort(HelloWorld.class);
    System.out.println(hw.sayHi("World"));

路由 当服务总线接收到特定消息时,它将通过任何服务/代理目的地(例如队列/主题)来路由它。这条路径称为路由。

例如,您的股票申请得到分析师的一些输入,它将通过应用程序/Web 组件进行处理,然后将结果发布给所有感兴趣/注册的成员以进行特定的股票更新。

Apache Camel and Muel http://camel.apache.org/how-does-camel-compare-to-mule.html 为企业集成提供了解决方案。

于 2012-04-13T04:35:27.653 回答
5

企业集成模式可以帮助您了解一切如何组合在一起。

[更新:]您对另一个答案的后续问题使我意识到您对特定产品感到困惑。这部分是因为实践中的软件倾向于映射到多个概念,部分是因为不同的公司争辩说他们提供“一切”,而实际上他们并没有。

ESB 是工具包/库,可让您将所有内容连接在一起。它们既不是服务本身,也不是消息传递实现,而是填补中间奇怪的小空白的粘性物质。如果您从头开始编写所有内容,您甚至可能不需要,因为他们最擅长的是修复一大堆不同技术之间的不匹配,如果您从头开始,您可以避免这种混乱。

服务就是服务。在实现一个 EJB 时,您可能会使用一些 EJB(我只提到这一点是因为出于某种原因您将它们包含在您的问题中)。

消息中间件是从 A 到 B 获取消息的软件。它非常有用,但也很复杂,每个人和他们的兄弟都发明了自己的。所以你需要一些抽象来避免锁定。那可以是 ESB,或者,如果您是全 Java,那么它可以是 JMS。但是,即使您完全是使用 JMS 的 Java,您可能仍然希望使用 ESB,因为它们是您仍然需要编写的所有 Java 代码位的库(路由逻辑的随机位、消息重新格式化等)。

希望有帮助。我最初的答案更多是关于您使用这些工具构建的抽象模式 - 当您将事物连接在一起时,同样的问题会一次又一次地出现。

于 2012-04-09T16:08:07.517 回答
3

Endpoints & Routes:信息的来源和目的地。消息队列是一种端点。另一种类型是消息主题。

端点是“事物的逻辑名称”,例如 PRICE.MSFT,发布者或消费者应用程序使用它来获取或发送到事物。主题将信息传递给每个订阅的人(一对一或一对多),队列将消息传递给第一个获得它的人(通常是一对一)。忘记队列,一切都可以用主题来完成,主题有几个优点。

面向消息的中间件 (MOM):在主题或队列之间传递信息的软件基础设施。它是“面向消息”而不是像 TCP 那样“面向数据包”。因此,每个信息块都以一个(希望是自描述的)消息的形式传递。然后,您的 MOM 的实现为您提供了一个 API,您可以在其中执行 msg.get("bid") 之类的操作

JMS 和 AMQP 是 MOM 规范的示例。MOM 实现是实现这些规范的真正产品:TIBCO EMS、Websphere MQ、MSMQ、Solace 等等

Apache Camel - 关于如何在这个 MOM 世界中配置工作流的非常有趣的方法。而是一个更高级的概念。

面向服务的体系结构 (SOA)、服务总线/ESB 只是过去称为 EAI(企业应用程序集成)的新流行语。它们是关于如何使用“妈妈”的建议以及支付高价顾问的一种方式。“ESB”添加到 MOM 的想法是将您的发布者视为提供服务的“服务”。换句话说:不要过多考虑消费者现在想要什么。未来可能有 5 个消费者,发布者应该提供服务,而不是“创建消费者 A 想要的信息”。(一旦您的架构发展到 5 个以上的应用程序,它就会变得更加清晰)。此外,您应该有一些通用的对象模型,也许在 XML 中以使应用程序之间的事情变得简单。

Mule - ESB 的一种形式,但它并不完全是主流。在 5 年内,大多数中间件操作可能已经完全转移到 AMQP 或其他东西上。

EJB:Sun 关于在容器中运行的复杂 Java 类的想法。旨在使应用程序开发更容易。但在许多情况下,它使事情变得更加复杂。更好的选择是“Spring”——但 EJB 是关于其他东西的(不仅仅是 MOM)。它更多地是关于如何开发更大的应用程序(参见 IoC 模式)。

如果您正在寻找从哪里开始:我建议您学习 JMS(所有其他 MOM 都类似,JMS 是 EJB/Mule 的基础,...),除非您有超高性能要求,否则将消息视为包含 XML 的 TextMessage。大多数工具都在该区域可用。或者更简单但不太复杂的 MapMessage 键/值对。

于 2012-04-17T09:31:06.393 回答
1

您将许多不同的概念和技术与不同的抽象级别混合在一起。但是您的所有概念都与(企业)应用程序集成有关。我将尝试评论您的定义:

  • 面向服务的体系结构 (SOA)
    SOA 提供了一组原则和方法来将现有应用程序集成为松散耦合的单元。来自企业集成模式(见下文):“ SOA 模糊了集成和分布式应用程序之间的界限”。
  • 服务总线/ESB
    ESB 是 SOA 的一个主要概念,用于减少 SOA 中应用程序之间的依赖关系。每个应用程序都连接到 ESB,而不是应用程序之间的大量依赖关系。
  • 面向消息的中间件 (MOM)
    MOM 是用于在分布式系统之间发送和接收消息的基础设施。这用于集成应用程序。在 SOA 炒作出现之前,MOM 是一把金锤。由于两者都很有用,大型集成套件同时提供 ESB 和 MOM(或在其 ESB 中使用 MOM)。
  • 消息队列
    消息队列只是 MOM 体系结构中的一个技术细节方面。当消息发送/接收解耦时,消息被存储在队列中,直到接收者准备好。
  • Apache Camel
    当《企业集成模式:设计、构建和部署消息解决方案》一书投放市场时,已经创建了一些软件解决方案,为本书中的模式提供了实现。阿帕奇骆驼就是其中之一。Camel 也是 Apache ServiceMix 的一部分,它也是一个开源 ESB。FuseSource 和 Talend 正在将 Apache ServiceMix、Apache Camel 和 Apache Active MQ (MOM) 打包成具有商业支持的捆绑包。
  • Mule
    Mule 也是一个开源 ESB 和集成平台。

  • 来自 Wikipedia的EJB : Enterprise JavaBeans (EJB) 是一种托管的服务器端组件架构,用于模块化构建企业应用程序。这意味着 EJB 是应用程序中的一个组件,主要与集成应用程序无关。
  • 端点和路由
    当您使用 Apache Camel 时,您正在设计端点之间的路由,请参阅教程。简而言之,消息通过端点进入/离开您的系统,并在路由定义的流程中进行处理。
  • JMS
    JMS 或 Java 消息服务是具有标准化 Java API 的面向消息的中间件 (MOM)。
于 2012-04-16T14:10:23.840 回答
1

考虑到您的所有要求并将它们打包到查询中,我遇到了一个很好的案例研究,应该可以满足您的需求:

我继续使用亚马逊的“在这本书中搜索”功能对这本书进行全文搜索。它涵盖了您讨论过的所有集成案例,看起来很全面,并引导您完成整个设计和实现过程。

我很尴尬地说我自己还没有通读过这篇文章但我强烈建议在投资副本之前使用与我相同的工具来查看它是否符合您的需求。它似乎比简单地将大量不完整的文档强加给您或将内容汇总到此处的答案中更彻底、更完整和更有帮助。

于 2012-04-09T19:00:15.920 回答
0

企业应用程序集成 (EAI)是将业务应用程序与异构系统连接起来的关键。多年来,集成解决方案的架构师以各种方式发明了他们自己的模式混合。但是这些架构中的大多数都有相似之处,在架构集成模式中启动了一套被广泛接受的标准。这些标准中的大多数都在企业集成模式目录中进行了描述,该目录位于:http ://www.eaipatterns.com/toc.html 。

WSO2 ESB

WSO2 企业服务总线 (ESB) 4.7.0 文档!WSO2 ESB 是一个快速、轻量级、100% 开源且用户友好的 ESB,在 Apache 软件许可证 v2.0 下分发。WSO2 ESB 允许系统管理员和开发人员方便地配置消息路由、中介、转换、日志记录、任务调度、故障转移、负载平衡等。它支持最常用的企业集成模式 (EIP),并支持传输交换、事件、基于规则的中介和基于优先级的中介,以满足高级集成需求。ESB 运行时设计为基于 Apache Synapse 中介引擎的完全异步、非阻塞和流式传输。

于 2013-11-05T06:32:13.340 回答