概念及使用场景
概念
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。Socket编程就是RPC通信。
技术和框架
RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
- 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
- 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
- 通信框架:MINA 和 Netty。
使用协议
在 RPC 中可选的网络传输方式有多种,可以选择 TCP 协议、UDP 协议、HTTP 协议。RPC 框架都使用 TCP 协议,但其实 UDP 也可以,而 gRPC 干脆就用了 HTTP2。
使用场景
当用户的请求到来时,我们需要将用户的请求分散到多个服务去各自处理,然后又需要将这些子服务的结果汇总起来呈现给用户。那么服务之间该使用何种方式进行交互就是需要解决的核心问题。
RPC 就是为解决服务之间信息交互而发明和存在的。
RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。
HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。
RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):
- 长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
- 注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
- 安全性,没有暴露资源操作。
- 微服务支持。就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。
RPC 核心功能
RPC 的核心功能是指实现一个 RPC 最重要的功能模块,即如图:
![](https://img.haomeiwen.com/i1154482/4701c00e0e299b0b.png)
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。
下面分别介绍核心 RPC 框架的重要组成:
- 客户端(Client):服务调用方。
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
- 服务端(Server):服务的真正提供者。
- Network Service:底层传输,可以是 TCP 或 HTTP。
参考内容:https://developer.51cto.com/art/201906/597963.htm
python实现RPC小实战
服务端程序:rpc_server.py
# 创建一个基础socket连接
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1', 5000)
sock.bind(ip_port)
sock.listen(5) # 监听客户端连接,并设置最大连接数
while True:
conn,addr = sock.accept() # 接收一个客户端连接
print(conn.recv(1024)) # 从接收缓冲读消息 recv buffer
conn.sendall(b"world") # 将响应发送到发送缓冲 send buffer
conn.close() # 关闭连接
客户端程序 rpc_client.py
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 5000)) # 连接服务器
sock.sendall(b"hello") # 将消息输出到发送缓冲 send buffer
print(sock.recv(1024)) # 从接收缓冲 recv buffer 中读响应
sock.close() # 关闭套接字
可能遇到的问题:
1.ConnectionRefusedError: [Errno 61] Connection refused
解决办法:
先启动服务端程序,再启动客户端程序即可
网友评论