微服务架构中的 HTTP 与 Thrift
HTTP vs Thrift in microservices architecture
我刚刚开始学习微服务,我有一个我自己无法回答的问题。 (而且我也是基于 Java 的开发人员)
我遇到这样的情况:
我有服务 A(API 服务)调用 Thrift 服务(名为 T1)获取数据。
然后我有一个服务 B,它可以使用来自 A 的数据响应,解析这些数据,然后生成一些新数据,最后,return它给客户端。
问题是:我应该使用哪个?
B 从 A 调用 API 并使用带连接池的 HttpClient/AsyncHttpClient 解析(例如 JSON 数据)或 B 直接调用 T1 并重复 A 的操作?
恕我直言,我认为 Thrift(也有连接池)比 HTTP 调用更快?我说得对吗?
我看到很多内部使用 HTTP 的服务,如 Elastic search、Neo4j、Eureka Netflix 等...
那么,我应该使用哪一个?为什么 HTTP 而不是像 Thrift、ProtoBuf 等 RPC 那样在内部使用中如此流行?
抱歉我的英语不好。
提前谢谢你。
通常使用 HTTP 和 JSON 或 XML,因为它们与平台和语言无关。 HTTP API 允许 ReSTful 架构,它已被证明是开发分布式系统的可扩展模型。
从历史上看,基于 RPC 的分布式系统方法显示出许多弱点:
通常它们依赖于语言。 Thrift 和 Protobuf 的互操作性更强,但它们仍然依赖于相当具体的第 3 方库。相比之下,有许多 HTTP 客户端和 XML 或 JSON 数据绑定/处理器的实现。
通过将客户端和服务器捆绑在一起,升级会变得困难 - 客户端通常必须与服务器同时升级。在真正的分布式网络中,这是不可能的。
RPC 在分布式系统中通常不是一个很好的比喻。通过将网络抽象为实现问题,他们通常鼓励使用低级 'chatty' 接口,这些接口要么涉及过多的网络流量,要么对不可靠的网络没有弹性。
二进制传输格式在出错时更难分析/调试。
出于这些原因,人们倾向于选择基于 Rest-with-HTTP 的 API 而不是专有 RPC API。
我刚刚开始学习微服务,我有一个我自己无法回答的问题。 (而且我也是基于 Java 的开发人员)
我遇到这样的情况:
我有服务 A(API 服务)调用 Thrift 服务(名为 T1)获取数据。
然后我有一个服务 B,它可以使用来自 A 的数据响应,解析这些数据,然后生成一些新数据,最后,return它给客户端。
问题是:我应该使用哪个? B 从 A 调用 API 并使用带连接池的 HttpClient/AsyncHttpClient 解析(例如 JSON 数据)或 B 直接调用 T1 并重复 A 的操作?
恕我直言,我认为 Thrift(也有连接池)比 HTTP 调用更快?我说得对吗?
我看到很多内部使用 HTTP 的服务,如 Elastic search、Neo4j、Eureka Netflix 等...
那么,我应该使用哪一个?为什么 HTTP 而不是像 Thrift、ProtoBuf 等 RPC 那样在内部使用中如此流行?
抱歉我的英语不好。 提前谢谢你。
HTTP 和 JSON 或 XML,因为它们与平台和语言无关。 HTTP API 允许 ReSTful 架构,它已被证明是开发分布式系统的可扩展模型。
从历史上看,基于 RPC 的分布式系统方法显示出许多弱点:
通常它们依赖于语言。 Thrift 和 Protobuf 的互操作性更强,但它们仍然依赖于相当具体的第 3 方库。相比之下,有许多 HTTP 客户端和 XML 或 JSON 数据绑定/处理器的实现。
通过将客户端和服务器捆绑在一起,升级会变得困难 - 客户端通常必须与服务器同时升级。在真正的分布式网络中,这是不可能的。
RPC 在分布式系统中通常不是一个很好的比喻。通过将网络抽象为实现问题,他们通常鼓励使用低级 'chatty' 接口,这些接口要么涉及过多的网络流量,要么对不可靠的网络没有弹性。
二进制传输格式在出错时更难分析/调试。
出于这些原因,人们倾向于选择基于 Rest-with-HTTP 的 API 而不是专有 RPC API。