【问题标题】:What is the difference between Gateway and Service Activator?网关和服务激活器有什么区别?
【发布时间】:2023-03-26 05:05:01
【问题描述】:

网关和服务激活器作为消息端点有什么区别(就企业集成模式而言)?

【问题讨论】:

    标签: spring-integration enterprise-integration


    【解决方案1】:

    http://eaipatterns.com/

    通常,服务激活器用于调用本地服务,服务不知道它是从消息传递系统调用的。

    网关通常是消息传递系统的入口或出口点。

    【讨论】:

    • 我已经查看了 EAI 网站,但是,阅读了几遍,并不清楚这两个概念。还在一本书中读到了它们,但仍然不够清楚(在我的脑海中)。它们都是端点(一个包装了一个spring bean,正如您提到的,将服务与消息传递系统解耦),而另一个公开了一个服务接口。到目前为止,我发现一个可以生成回复(服务激活器),而另一个可以管理回复(网关),例如等待或超时。那是对的吗?这是主要区别还是更多?
    • 我们来谈谈 Spring Integration 的模式实现。 接收消息并调用方法,通常带有一个方法参数,即消息的有效负载;如果该方法返回 void,则该方法返回时无需执行任何其他操作。如果它返回某个对象,它将成为新的消息有效负载,并将消息发送到输出通道。在 Spring Integration 中,有两种类型的网关。消息传递网关是一种允许 Java 应用程序调用消息传递流的实现;该参数通常成为有效负载。
    • 您只需定义一个接口,Spring Integration 会构建实现以将参数作为消息处理。第二种类型的网关用于连接其他系统——有入站和出站网关。入站网关用于使用某些技术(JMS、HTTP 等)公开消息传递系统。出站网关用于从通过某种技术(JMS、HTTP 等)公开某些服务的系统发送和接收。有很多这些类型的网关(twitter、TCP、FTP……等等)
    • 好的,所以一个在设计方面几乎与另一个相反(一个包装服务,另一个构建它 - 至少对于消息传递网关)
    • 是的;此外,还有一个入站通道适配器,它轮询方法以获取新消息;以及调用具有 void 返回的方法的出站通道适配器(类似于具有 void 的服务激活器,但出站适配器必须返回 void。
    【解决方案2】:

    服务激活器调用应用程序开发人员提供实现的对象上的方法。 Spring Integration 负责使用来自输入通道的消息调用该方法,并将结果分流到某个输出通道。应用程序提供的代码可以做一些任意的工作。

    对于网关应用开发者只提供一个接口,它的实现由Spring提供。

    Spring Integration 文档的附录包括 Cafe example,其中 Barista 是通过服务激活器调用的服务,Cafe 是网关。

    应用程序的 main 方法从 Spring 应用程序上下文中查找一个 Cafe 对象,并在其上调用 placeOrder,将 Order 作为参数传入:

    public static void main(String[] args) {
          AbstractApplicationContext context = null;
          if (args.length > 0) {
              context = new FileSystemXmlApplicationContext(args);
          }
          else {
              context = new ClassPathXmlApplicationContext(
              "cafeDemo.xml", CafeDemo.class);
          }
          Cafe cafe = (Cafe) context.getBean("cafe");
          for (int i = 1; i <= 100; i++) {
              Order order = new Order(i);
              order.addItem(DrinkType.LATTE, 2, false);
              order.addItem(DrinkType.MOCHA, 3, true);
              cafe.placeOrder(order);
          }
      }
    

    Cafe 是应用程序不为其提供实现的接口。 Spring 生成一个实现,将传递给它的 Orders 发送到称为“orders”的输入通道。

    在管道的进一步下方,有两个服务激活器引用了咖啡师。 Barista 是一个 POJO,其代码可用于创建如下所示的饮品:

      public Drink prepareHotDrink(OrderItem orderItem) {
          try {
              Thread.sleep(this.hotDrinkDelay);
              System.out.println(Thread.currentThread().getName()
                      + " prepared hot drink #" + hotDrinkCounter.incrementAndGet()
                      + " for order #" + orderItem.getOrder().getNumber() 
                      + ": " + orderItem);
              return new Drink(orderItem.getOrder().getNumber(), 
                      orderItem.getDrinkType(),
                      orderItem.isIced(), orderItem.getShots());
          }
          catch (InterruptedException e) {
              Thread.currentThread().interrupt();
              return null;
          }
      }
    

    咖啡师从服务激活器的输入通道接收饮料订单,并在其上调用一个返回饮料的方法,该饮料通过服务激活器的输出通道“preparedDrinks”发送。

    【讨论】:

      【解决方案3】:

      对我来说,网关用于进行抽象并为一个或多个后端服务提供规范化的 API。 例如,您有 5 个提供者使用不同的方式与您交互(SOAP、REST、XML/http 等等),但您的客户只需要一种获取数据的方式(比如说 json/REST)。 网关会将来自您客户端的 json 请求转换为具有自己协议的正确后端,然后将后端响应转换为 json 以将响应提供给您的客户端。

      服务激活器更多地充当传入消息的触发器。假设您的激活器轮询数据库以获取传入消息,然后当条件满足“激活”时,它会调用底层服务。

      Info for gateway here.

      Info for Activator here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-24
        • 2018-02-10
        • 1970-01-01
        • 2011-08-07
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多