gRPC 与 NATS 或 Kafka 相比有什么意义吗?

Arr*_*rrr 12 rest websocket apache-kafka grpc nats.io

一直以来,说到微服务架构,我首先想到的就是NATS和Kafka。但最近我在 dotnet core 中发现了这个 gRPC 模板,这引起了我的注意。我读了很多相关内容并观看了很多视频,但我认为其中任何一个都不能正确解决 gRPC,因为它们通常在 gRPC 和消息代理或 REST 等协议之间进行对比,我认为这是非常不合适的,尽管 SOAP 是相关的这里。我的假设是 gRPC 是 SOAP 的现代版本,由于它有协议缓冲区,因此具有更好的性能和更少的实现麻烦。而且我认为 gRPC 根本无法与 Kafka 或 NATS 相比。而且它不能取代 RESTful 服务,就像 SOAP 一样。

现在的问题是,我的假设在多大程度上是正确的?例如,当涉及到在集群上的节点之间选择通信桥时,我现在是否必须将 gPRC 添加到我的选项中(NATS、Kafkam Rabbit 等),或者我应该在创建 Web 代理以将外部请求桥接至我的微服务?

最后,实时通信怎么样,gRPC可以完全替代websocket/socket.io/signalR吗?它取代了什么?

JCK*_*del 14

我经常看到人们在一个关键方面错用了这些技术:公共身份验证

例如,检查此图: 在此输入图像描述

这是Inverted Json的基准测试(https://github.com/lega911/ijson),比较了一些工具,例如iJson、RabbitMQ、Nats、0MQ等。

请注意,Nats、ZeroMQ 和 iJson 并不打算用作公共端点(例如,Nats 具有用户/密码、令牌和密钥,但它在开放环境(例如 Web 浏览器)中毫无用处,因为没有使密钥不公开的方法)。

另一方面,GRPC 与 JWT 和 Oauth2 配合得很好,使其对公共端点完全安全(与任何其他 HTTP 端点一样安全),因为这些令牌是服务器签名的(因此,即使它们是公开的,它们不能被锻造或回火)

所以,我想说的是:有些技术意味着面向公众,有些技术意味着将服务器和服务器内的进程粘合在一起(这是私人连接)。

GRPC 是公共的,ZeroMQ 和 iJson 是完全私有的(例如,iJson 没有任何类型的身份验证)。Nats 使用密钥或密码,因此,虽然比 iJson 和 ZeroMQ“更安全”,但它并不意味着公开。

当你说 REST(我在这里假设是 HTTP,因为 REST 只是一种架构)、websocket/socket.io/signalR 时,你正在描述所有公共接口。GRPC 将在这里介绍您(它与作为请求/响应和 websocket/socket.io/signalR 的 REST 相当,因为它支持半双工和全双工流(类似于套接字))。

另一方面,Nats、iJson、ZeroMQ 并不意味着这样做。它们的目的是在服务之间进行通信。

所以,基本上,REST/websocket/socket.io/signalR = gRPC。

服务之间的内部通信(在相同或不同的服务器中)= NAT、iJSON、ZeroMQ。

(请注意,我什至没有考虑图中的其他技术,因为它们是产品,IMO,而不是可以用来实现目的的简单库,例如 RabbitMQ、nginx 等。其他我不熟悉足以能够发表意见(但我对该图中的 uvloop 感到惊讶))。

  • 注意 NATS 100% 支持基于 jwt 的身份验证 + 浏览器 sdk.. (4认同)

小智 7

你的直觉是正确的,gRPC 无法与 kafka、Rabbit 等异步队列系统相比。

然而,它是通常通过 SOAP、RPC、REST 等实现的同步服务器到服务器通信技术的替代品,在这些技术中,您希望从另一台服务器获得响应,而不是将消息发送到队列中,然后实际上忘记该消息。