微服务通信

10

我刚开始接触微服务,并尝试将我的项目转变为基于微服务的项目。我的问题在于如何让每个服务彼此通信。

首先,我探索了REST风格的服务,但是如果每个服务都基于HTTP REST,他们之间如何“交流”呢?

然后我尝试学习Spring Integration,但现在更加不清楚应该如何通信了,因为我突然想到,也许我需要使用RabbitMQ作为前端和微服务后端之间的中间件。

我还接触到了云和Docker技术,所以我猜每个服务都应该在云上,但这仍然不清楚服务之间如何通信。

我正在使用Java、Spring技术。

如果有人能给我一个更好的图景,让我明白事情应该是如何的,我会很高兴的。

5个回答

6
你正在走上正确的道路。使用REST架构暴露服务是强大且简单的。每个微服务都会公开一些功能,其他微服务可以调用这些功能。你可以使用SpringMVC和注释@RestController来实现这一点。要调用REST API,可以使用Spring类RestTemplate。
你可能还需要一个网关,将请求重定向到正确的服务。我建议您尝试Netflix Cloud Stack:
- Zuul。这是您的应用程序的入口点。每个请求都发给它。它应该协调整个生态系统。 - Eureka客户端 - Eureka服务器。所有微服务都应该以某种方式告诉某人它们正在运行并且可以接受请求。因此,您可以使用Eureka服务器接受来自服务的注册,并将微服务标记为客户端。 - Ribbon。另一个重要的事情是请求的负载均衡。使用Ribbon可以轻松完成这项工作。
如果您正在使用Spring Boot,则可以使用一些注释快速设置此体系结构。
您可以在此处找到一个简单的示例:https://cloud.spring.io/spring-cloud-netflix/

4

我不是很喜欢服务A直接调用服务B的API,或者反过来,有两个原因。首先,这会在服务A和B之间创建依赖关系。其次,随着服务数量的增长,它很容易创建一种混乱的关系。我希望看到的是发布/订阅模式,例如服务A向传输层(RabbitMQ不错)发布一条消息,然后继续执行。订阅和解释消息的业务逻辑被封装在服务B中。通过这样做,服务B根本不需要知道服务A的任何信息,但它们可以很好地交流。


2
没有针对微服务的通信或传输机制标准。一般情况下,微服务使用广泛采用的轻量级协议(如HTTP和REST)或消息协议(如JMS或AMQP)相互通信。在特定情况下,可以选择更优化的通信协议,如Thrift、ZeroMQ、Protocol Buffers或Avro。
微服务之间的通信可以采用同步(请求-响应)或异步(发出并忘记)方式设计。两种方法都有其自身的优点和限制。不能只使用一种方法开发系统,需要根据用例组合使用这两种方法。
您应该根据您的用例和要求选择最适合您项目的方法。

2
我个人使用过Eureka发现服务。如果您愿意,这基本上就是微服务的“主人公”。每个微服务在启动时向单独的微服务(发现服务)注册自己。因此,发现服务知道每个微服务的地址和端口,每个微服务都可以向发现服务询问哪些(其他)微服务已注册。此外,每个微服务还可以简单地向发现服务请求有关另一个微服务的信息。所有通信(在我的情况下)都是通过REST完成的,但这是一种选择,因为Spring Boot与Eureka发现服务依赖项一起使用它。
非常少的配置即可使整个框架正常运行。
这是基于Netflix使用的框架。我相信Eureka甚至是Netflix库。

0

使用微服务之间的同步通信存在风险,最大的问题是耦合性,这意味着服务现在彼此耦合,如果其中一个服务失败,它的依赖项将完全或部分失效/崩溃,更好的解决方案是对于状态更改操作使用异步通信。

您需要清楚区分状态更改操作和读取操作(CQS命令查询分离)。对于状态更改操作,您可以使用某种消息基础架构并进行“发送并忘记”通信。对于查询,您将使用同步请求响应通信,并可以使用http API或直接转到数据存储。

如果您正在使用消息传递,则还可以查看发布订阅以在服务之间引发事件。

另一个要考虑的问题是(事务性)数据共享(而不是只读视图),如果您公开内部状态,则读者可能会获得错误的数据状态或版本,并且还可能锁定您的数据?

最后但并非最不重要的是,尽一切可能使您的服务保持自治(至少在逻辑层面上)。

希望这有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接