MICROSERVICES - 他们之间的沟通

时间:2016-12-11 12:41:57

标签: java rest microservices

我有一个关于微服务架构的问题。我正在设计一个基于微服务的系统。我读了很少的文章,我想我理解这个想法。但是,我不知道微服务应该如何相互沟通,而他们有不同的业务职责.... 我的意思是,如果我有一个预订火车票的系统,我会将后端应用程序划分为模块:

  • 客户端(登录,注销,注册)
  • 预订(为用户预订火车座位,获取所有用户预订)
  • ConnectionsDetails (搜索连接,获取连接详细信息)
  • 列车 (关于火车座位数,班级等信息)

现在,我只能认为如果用户搜索连接模块ConnectionsDetails与Trains模块通信并询问特定的列车详细信息。但其他微服务怎么可以沟通呢?如果用户想要登录 - 她/他直接询问客户模块,如果她/他想要获得所有预订 - 直接询问预订模块等...

所以我的问题是,如果模块做不同的事情,模块应该如何沟通?对不起,如果我的问题是微不足道或愚蠢的,我只是从微服务开始。

编辑: 我并不意味着我可以使用哪些工具进行沟通。我的问题是关于逻辑。在我展示的示例中,为什么一个微服务可以询问另一个微服务,如果客户端可以直接询问另一个?正如我之前所说的那样,如果他们分开的话,他们应该如何沟通(关于他们应该相互提出什么问题)呢?

2 个答案:

答案 0 :(得分:2)

要找到正确的上下文,边界和通信渠道是微服务架构中最困难的部分之一。它是关于找到您需要的数据,关系如何以及哪些服务负责什么(负责任意味着唯一允许更改它的人)。看看Blog from Martin Fowler

微服务不是模块。每项服务都应该是有关开发和部署的独立服务。是的,他们可以互相沟通,但客户也可以单独与他们沟通。微服务方法也是关于使用正确的工具来解决问题。因此,每个服务都可以用不同的编程语言实现。他们可以使用不同类型的存储,如RDMBS,NoSQL或Key-Value存储。它们将被单独缩放 - ConnectionsDetails的许多实例和预留的更少实例,例如

如果一项服务不可用,会发生什么?每项服务都应尽可能容错,如果没有别的办法,可以优先减少它的服务。您应该考虑通过选择正确的边界,使数据独立并可能引入缓存来最小化服务之间所需的通信。不要忘记CAP theorem,微服务方法使其更加明显。以下是一些可能有用的slides about resilience。不要共享相同的数据库或复制服务之间的所有内容。

"如果模块做不同的事情,模块应该如何沟通?"。您应该选择与语言无关的通信方式,并根据您的问题选择同步或异步方法。作为独立于语言的格式,JSON或XML是最常见的。同步通信可以基于REST,消息传递上的异步通信。身份验证("客户端")通常是REST服务,通过电子邮件发送预订的故障单更像是一种消息驱动的异步服务。

答案 1 :(得分:0)

我认为这是关于经典SOA与微服务的主要问题。

我想你可以找到许多相反的答案。

所以恕我直言:  如果在您的架构服务中相互通信它们不是微服务,因为它们之间存在依赖关系。

如果每个微服务具有所有需要的功能(或称组件)并且不依赖于彼此或彼此通信,那么它们就是微服务。

因此,在您的示例中,您有4个组件。 客户,预订,连接详情,火车。

但是,微服务可能没有必要与它们完全匹配。 如你所说“如果用户搜索连接”...... 所以“搜索连接”是微服务,包括所有需要的组件(Client,ConnectionDetails,Trains)并且是独立的。

最后,组件(而不是微服务)如何相互通信取决于您。使用微服务,您可以使用直接POJO而无需转换,协议,传输层。 或者你可以使通信更正式,这会让你更接近经典的SOA而不是微服务。