RPC 对比 HTTP

初识RPC

  • RPC
    • 远程方法调用(Remote Procedure Call)
    • 大多用在服务治理领域
      • 基本都是分布式环境中的注册中心来负责新服务的注册、服务续约、服务下线、服务销毁
      • 国内 Dubbo 是应用最广的 RPC 框架
      • 国外 gRPC
    • RPC协议
      • 无论哪种RPC方案,都要自定义一套RPC协议规范。
      • 方法寻址
        • eureka 没有方法寻址这一说,无论是 feign 还是 RestTemplate 都要给定服务名+url路径。
        • RPC就和本地方法一样,不用给出服务名和路径,因此需要借助反射等技术获取当前服务的特征量,运用到自己的方法逻辑上,找到正确的服务提供方。
      • 对象序列化/反序列化

初识RPC

RPC vs REST HTTP

  • 接口风格
    • RPC(动词命名)
      • queryProduct
      • 面向执行过程
    • REST(名词)
      • {GET}/product?id=3
      • 面向所操作的资源

RPC vs REST HTTP

服务治理 RPC vs HTTP

RPCHTTP
应用层协议RPC协议,底层基于TCP超文本传输协议,底层基于TCP
编程友好程度配置简单高效,接口拿来就用配置繁琐,资源定位,GET/POST…
传输效率应用gzip等压缩技术HTTP携带的信息臃肿,报文中有效信息占比小
框架实现难度难难难,但和我们没关系简单

服务治理 RPC vs HTTP

那么问题来了

问:RPC那么好,为啥还用Spring Cloud和Eureka ?

答:RPC再好也就是个服务治理框架,能有Spring Cloud全家桶牛吗 ?

### RPC协议与HTTP协议的区别及使用场景 #### 1. 协议定义和设计理念 RPC(Remote Procedure Call)是一种远程过程调用的抽象思想,旨在让开发者能够像调用本地方法一样调用远程服务[^4]。具体实现可以基于TCP、HTTP等多种底层通信协议,例如gRPC基于HTTP/2[^2],而Dubbo则基于TCP。 HTTP(HyperText Transfer Protocol)是一种应用层协议,主要用于浏览器与服务器之间的数据交换,规定了请求和响应的格式、资源定位方式等[^3]。HTTP本身并不关注如何封装API或隐藏远程调用细节。 #### 2. 数据传输格式 HTTP协议明确规定了请求和响应的格式,包括头部信息和消息体,并且通常使用文本格式(如JSON、XML)进行数据传输[^3]。相比之下,RPC协议并没有统一的数据传输格式,不同的RPC框架可以选择二进制(如Protocol Buffers)或文本格式(如JSON)来优化性能或兼容性[^4]。 #### 3. 调用透明性 RPC的核心目标是提供一种透明的远程调用机制,使得开发者无需关心网络通信的细节[^3]。通过API封装,客户端可以像调用本地方法一样调用远程服务。而HTTP协议本身并不提供这种封装,开发者需要手动处理HTTP请求和响应的细节[^3]。 #### 4. 性能差异 由于HTTP协议设计之初是为了支持浏览器与服务器之间的交互,因此在某些场景下可能存在性能开销,例如头部信息冗长、多次握手等问题[^2]。而许多RPC框架通过使用高效的二进制序列化协议(如Protobuf)和复用连接等方式,能够在内部服务间通信中提供更高的性能。 #### 5. 使用场景 - **HTTP**:广泛应用于B/S架构中,特别是在对外提供RESTful API时。由于其跨语言、跨平台的特性,HTTP适合于异构系统之间的通信[^3]。 - **RPC**:更多用于C/S架构或微服务之间的内部通信。例如,在企业内部的服务集群中,RPC框架如gRPC、Dubbo被用来实现高效、低延迟的服务调用。 #### 6. 发展历史 从历史角度来看,RPCHTTP更早出现,但由于HTTP/1.1的普及,许多外部接口开始采用HTTP协议。然而,随着微服务架构的兴起,内部服务间的高性能通信需求促使RPC再次成为主流选择。HTTP/2虽然在性能上有所提升,但由于其较新的发布时间,尚未完全取代传统的RPC协议。 ### 示例代码对比 以下是使用HTTP和gRPC进行远程调用的简单示例: #### HTTP调用示例 ```python import requests response = requests.get("http://example.com/api/data") print(response.json()) ``` #### gRPC调用示例 ```python import grpc import example_pb2 import example_pb2_grpc channel = grpc.insecure_channel('localhost:50051') stub = example_pb2_grpc.ExampleServiceStub(channel) response = stub.GetData(example_pb2.Request(message="Hello")) print(response.message) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值