在微服务架构中,如何处理必须进行小数据处理和调用其他服务的复合请求?

时间:2016-06-16 16:19:04

标签: architecture restful-architecture microservices

例如,一旦用户进入我们工作流程中的付款步骤,就需要调用许多不同的服务(例如付款,电子邮件生成,内容生成)。前端是否应设计或应该设计服务以处理此类请求?如果是这样,该如何设计该服务,以便它可以处理复合请求而无需特别硬编码这些请求的组成?

3 个答案:

答案 0 :(得分:2)

我认为微服务必须使用队列才能与其他人通信。

前端可以生成调用,但后端必须保存逻辑,以便在执行操作后需要通知哪些队列。

我认为RabbitMq是这类设计的绝佳工具。例如:

  • 用户在结帐时通过第1阶段
    • 发送 - 用户ID,发送电子邮件至emailqueue_standby Queue
    • 发送 - userid,项目到emailcontent_standby队列
    • 发送 - userid,paymentdata到paymentchecking队列
  • 用户在结帐时完成第2阶段
    • 从emailqueue_standby Queue消耗消息 - >激活发送电子邮件的代码
    • 从paychecking Queue消费消息 - >激活代码检查付款数据 - >发表回复approve_payment_data - >值user_id,Deal_id
    • 从approve_payment_data队列消耗消息 - >如果用户付款被批准继续,否则请停止回到第1阶段。

因此,此流程可以让您一次更新多个阶段而不会阻止代码,还允许在后端服务器之间分配负载。

答案 1 :(得分:1)

您正在寻找与BPEL一致的内容来抽象您的业务逻辑。除非你明确需要将其外化,否则我强烈建议你不要。测试起来要困难得多,并且会给您的服务带来很大的复杂性。

话虽这么说,您可能希望用外观包装其他服务,这样您就不会受到呼叫细节的影响。这使您的逻辑可以测试,并允许这些服务实现独立于应用程序的其余部分进行更改。

答案 2 :(得分:1)

这实际上取决于你所指的是什么。

复合用户界面

在用户界面中,您应该构建一个复合ui。 (微)服务应该负责垂直层而不是水平层。例如,业务层或数据层应该由财务,销售等垂直层替换,在这些层中,您可以构建更小的组件。这些组件在技术上负责从存储到用户界面的业务问题。我主要使用像AngularJS这样的框架,其中一部分UI请求一些数据,各种服务可以添加到数据中。例如,亚马逊推荐书籍列表。您从映射到单个product-id的url开始。您可以从ServiceA检索书籍信息,从ServiceB购买价格,从ServiceC购买运费,从ServiceD获得折扣等。还有推荐书籍列表。该列表包含ServiceB中的几个产品ID(例如),这些产品会再次向ServiceA发送书籍信息请求,例如名称和信息。图片网址。

现在发票可以是相同的,也可以是电子邮件。创建它就像它是一个复合ui。

<强>集成

如果要检索数据以便能够与外部系统通信,例如,没有用户界面。它不属于财务或销售或其他任何东西。如果愿意,创建一个新的边界,一个有界的上下文,例如IT / Ops。例如,它的责任是与第三方整合。它拥有这个问题。

然后可以定义几个接口,例如IProvideBookInformationIProvideBookPriceIProvideBookInformation可以使用BookInfo ProvideBook(Guid id)之类的方法,其中BookInfo是也属于此IT / Ops服务的DTO。

然后SalesFinance负责实现此接口。所以他们依赖于这个界面。然后以您喜欢的方式进行部署,例如,在.NET世界中,您可以使用NuGet。然后,在部署此IT / Ops服务时,您还可以从实现这些接口的其他服务部署组件。这就像复合UI示例,其中部署了一个网站,其中包含几个为用户界面提供数据的其他组件。但现在它是一个后端集成服务,而不是具有用户界面的东西。 IT / Ops服务与实现没有直接的依赖关系。但是当它需要服务的实现时,它会加载它可以找到的所有组件并搜索其所需接口的实现。一旦找到实现,它就会执行它并获取数据。组件可能直接进入数据库,这很简单,我们都很简单。但它也可能通过一些REST api或您最喜欢的任何方式请求数据。它以这种方式收集所有数据,通过它所有者的接口,但由其他服务提供的实现。收集完所有数据后,它会呼叫第三方并做任何应该做的事情。