如何改善微服务之间的通信?

8
在我们公司中,我们使用Spring Boot、微服务、Spring Cloud等技术基础设施。我们对这个基础设施感到满意,但我仍然有一些担忧:我们使用REST协议通信,尽管我认为它很好用,但我仍然认为我们可以找到更好的替代方案。使用REST时,你需要使用客户端和服务器(RestController),需要知道服务器URI、HTTP方法(POST、GET、PUT等)以及参数所在位置(请求体、查询字符串等)。难道如果我们像RMI那样有一个类似的东西,不是更容易吗?我知道它是一种相当古老的技术(而且它并不独立于语言),但它使生活更加轻松(你只需要一个接口和其实现)。在搜索周围时,我发现了一些有趣的项目,如Feign客户端或Spring Cloud Stream,但似乎都不是完美的解决方案。你对这个问题有什么想法?你觉得这是一个问题吗?如果是,你会如何处理?谢谢你的帮助。
3个回答

5
在我的公司中,我们使用JMS为微服务栈添加了一个“内部”通信堆栈。它可靠、易于使用、高效且性能非常好。
我们使用Apache ActiveMQ作为实现,但RabbitMQ也被广泛使用。

这正是我一直在寻找的。我们也使用rabbitMQ,而且有一个非常好的RPC实现(http://docs.spring.io/spring-amqp/reference/htmlsingle/#_message_correlation_with_a_reply_queue),但我一直在尝试了解是否有更好的解决方案。你看过这个吗?http://www.grpc.io/ - Pirulino
我们不将其用作RPC工具,而是用作消息交换(这是JMS的主要目标)。RPC工具通常不能回答许多问题,而JMS可以:如果网络暂时断开会发生什么?如果你想要指定一个实例怎么办?所有实例怎么办?特定类别或类型的实例怎么办?使用JMS很容易解决所有这些用例,我不确定你是否能够轻松通过RPC工具来做到这一点。你可以通过JMS进行RPC,但我认为将应用程序设计为消息驱动的应用程序可能更容易。 - Alexandre Cartapanis
你也可以看一下 akka,它是设计消息驱动应用的好工具,被广泛用于内部微服务通信这个场景。 - Alexandre Cartapanis

3

微服务不应该紧密耦合,RMI要求你的代码在两端都存在,当你无法控制另一端(例如不想升级的客户端)时,这是很麻烦的,而且穿越防火墙也很困难。

SOAP解决了你提到的大部分问题,不幸的是Java从未拥有过一个好的SOAP堆栈。话虽如此,REST在从Web页面和JavaScript访问服务时具有其他优点。


1

是的,我们确实使用它们。但是通过使用它们,我们解决了URI发现问题(和负载均衡)。我们还使用Spring Cloud Config Server来管理配置。 但我仍然认为即使有所有这些技术,编写REST客户端/服务器也相当昂贵。 REST是我们拥有的最佳解决方案吗?难道没有更容易使用的东西吗? - Pirulino

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