中间件和SOA示例

IAm*_*aja 31 java soa jms message-queue ejb-3.0

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

  • 面向服务的体系结构(SOA)
  • 面向消息的中间件(MOM)
  • 消息队列
  • Apache Camel
  • 马骡
  • EJB的
  • 端点和路由
  • 服务总线/ ESB
  • JMS

在网上/维基百科上查看每一个之后,我能够(大部分)获得这些中的每一个都不错的定义.我不理解的是所有这些技术/概念如何在后端协同工作以提供第二/业务层解决方案.

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

编辑:由于我添加了赏金,我有几个答案建议阅读书籍.虽然我很欣赏这里的所有反馈,但我根本无法分享300个声望点的答案,基本上归结为"RTM"(特别是当我平了,并且买不起手册!)重申,赏金和明确的答案将发送给能够在一个有意义的实际例子中击中所有这些子弹的人.这不一定是中间件的纲要!只是一段或两段,展示了如何将所有这些结合在一起以生成Java业务层解决方案.再次感谢.

Ara*_*ram 21

SOA主要原则:将系统构建为每个服务所在的服务集

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

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

如果您想要集成这些不同的功能从而创建新的解决方案(例如亚马逊商店前端是由他们的目录服务,购物车服务等组成的新服务),该怎么办?

你有两个选择:

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

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

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

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

  • ActiveMQ与JMS没有任何关系.它有许多其他支持的协议,包括STOMP,REST,XMPP和Amqp,它们不需要Java或JMS实现. (2认同)

neo*_*neo 10

每个技术的Java类/示例.可能不可能在单一职位上,因为你问的是进化产业在过去十年中经历了并且仍在不断发展.所以,过去十年发生的事情不能在一篇文章中介绍.然而,它很好地理解它是如何经历这个阶段以及为什么需要新的技术堆栈以及它解决了什么样的问题.

  • EJB Enterprise Java Bean服务器端组件体系结构.它可以实现快速简化的开发

    1)分布式(其中多个应用服务器彼此对话,服务器组件(例如,服务调用托管在不同服务器上的其他服务).

    2)transactional - persistance bean(DB TXNs),是任何简单/ web /分布式应用程序中最重要的部分.易于开发,例如配置基础.编写负责事务的XML,例如何时提交,何时回滚(异常)等.JPA Java Persistance API提供对象关系maping.比如你的表行通过xml配置映射到你的java对象.

    3)安全 - 身份验证(uid/pwd)和授权(基于角色 - 登录用户以及他可以执行的所有任务?).

这一点在开发任何企业应用程序方面看起来都很好,但是它有一些缺点,例如它非常重(包含在其中的所有罐子).用作bean的类应该确认EJB标准(类应该为EJB引擎实现某些接口以了解它是哪种类型的bean).

为了克服这种情况,有许多替代方案可供业界用于EJB,例如Hibrnate做同样的事情,如OR映射,TXN处理同样由EJB中的persistance bean提供.Spring,轻量级框架并简化了业务逻辑(您可以使用已经构建的类,它不需要实现任何接口,检查异常或扩展一些必需的抽象类).

现在有一天,大多数公司都在轻量级框架上工作,比如Spring,Hibernate,IBatis,Axis-2.

  • 面向服务的体系结构(SOA)面向服务的体系结构是企业级平台独立性的答案.或者更快地集成您的应用程序,以便在不同的应用程序服

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

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

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

Web服务可以先开发合同 - 首先编写WSDL.代码优先 - 首先编写代码.

现在,让我们谈谈如何开始实际的Web服务.

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

  • 面向消息的中间件(MOM)
  • JMS
  • 消息队列(点对点)

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

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

    MOM是概念,JMS是这个概念的规范.许多供应商都有这个规范的实现,例如IBM有MQ,OpenJMS开源实现,来自Tibco的EMS等.

JMS规范主要有两种模式.Pub/sub和ponin-to-point.

发布/订阅是主题,您的应用程序想要向所有感兴趣的各方发布某些信息.仪表板.(股票应用程序希望向所有已注册的侦听器通知某些消息).

点对点通信通过消息队列完成.

业务用例 - 认为您有应用程序,例如客户要求客户服务.另一方面,您有多个客户服务代表和其他方客户,有时候比客户服务代表更多,一次只有一位代表会收到处理请求,他/她在完成任务之前不会得到下一个请求.(同一个队列中的多个窗口以及任何窗口都是免费的将处理请求).您可以考虑其中的其他复杂性,例如,如果其中一个节点发生故障,请求未处理,特定类型的请求需要由特定节点处理.等等

生成代码: - 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
  • 端点和路由
  • Apache Camel
  • 马骡

现在,假设您已经采用了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"));
Run Code Online (Sandbox Code Playgroud)

路由 当服务总线收到特定消息时,它将通过没有服务/代理目的地(如队列/主题)路由它.此路径称为路径.

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

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


and*_*oke 5

企业集成模式可以帮助您了解所有内容的组合方式.

[更新:]你对另一个答案的后续问题让我意识到你对特定产品感到困惑.这部分是因为实践中的软件倾向于映射到多个概念,部分原因是不同的公司认为它们提供"一切",而实际上并非如此.

ESB是工具包/库,可以将所有内容连接在一起.它们既不是服务本身,也不是消息传递实现,而是填补其间奇怪的小差距的goo.如果你从头开始编写所有东西,你甚至可能都不需要,因为他们最擅长的是修复一堆不同技术之间的不匹配,如果你从头开始,就可以避免这种混乱.

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

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

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