中间件和 SOA 示例

2022-09-01 07:43:10

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

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

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

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

编辑:自从我添加赏金以来,我有几个答案建议读书。虽然我很欣赏这里的所有反馈,但我根本无法分道扬镳,以获得一个基本上归结为“RTM”的答案(特别是当我完全破产并且负担不起手册时!重申一下,赏金和明确的答案将交给一个可以在一个有意义的,实际的例子中击中所有这些子弹的人。这不一定是中间件纲要!!!只需一两个段落,即可展示如何将所有这些和谐地协同使用,以生成 Java 业务层解决方案。再次感谢。


答案 1

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

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

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

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

您有两种选择:

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

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

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

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


答案 2

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

  • EJBs Enterprise Java Beans serverside component architecture.它能够快速、简化地开发

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

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

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

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

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

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

  • 面向服务的体系结构 (SOA) 面向服务的体系结构是企业级别平台独立性的答案。OR 为了更快地集成您的应用程序,以便在不同的应用程序服务器之间进行通信。

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

现在,让我们谈谈如何实际开始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规范主要有两种模式。发布/订阅和点对点。

发布/订阅是主题,您的应用程序希望向所有感兴趣的各方发布某些信息。例如仪表板。(Stock 应用程序希望向所有已注册的侦听器通知特定消息)。

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

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

生成代码:- 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 - 从目标读取消息,直到程序不会停止。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和Muel http://camel.apache.org/how-does-camel-compare-to-mule.html 为企业集成提供了解决方案。


推荐