Update README.md
本项目完成了一个RPC(远程过程调用)框架,基于Python的Socket编程实现,具有一定的平台化特定、支持跨语言调用、具有IDL定义和IDL编译功能以及并发处理等功能。
RPC/ ├── rpc_framework/ # RPC框架代码 │ ├── __init__.py # 框架入口 │ ├── client.py # RPC客户端 │ ├── cross_language_adapter.py # 跨语言适配器模块 │ └── idl_compiler.py # IDL编译器 │ ├── protocol.py # RPC协议定义 │ ├── registry.py # 服务注册表 │ ├── serializer.py # 消息序列化 │ ├── server.py # RPC服务器 ├── examples/ # 示例代码 │ ├── example_client.py # 客户端示例 │ ├── example_idl.py # IDL编译器实例 │ ├── example_service.py # 服务端示例 │ ├── service.idl # IDL定义文件 │ ├── test_idl_generate_java_client.py # JAVA语言的idl客户端代码 │ ├── test_incomplete_rpc_framework.py # 完整的RPC客户端测试 │ ├── test_simple_rpc_framework.py # 简单的RPC客户端测试 │ └── idl_test/ # IDL测试代码 │ ├── python/ # Python测试代码 │ │ ├── test_cal.py # 基本数学运算测试 │ │ ├── test_eq.py # 高级数学运算测试 │ │ └── test_ut.py # 工具类测试 │ └── java/ # Java测试代码 │ ├── test_cal.java # 基本数学运算测试 │ ├── test_eq.java # 高级数学运算测试 │ └── test_ut.java # 工具类测试 └── README.md # 项目文档
python ./examples/example_service.py
运行命令后,服务器将在 localhost:8888 启动,并注册以下服务:
localhost:8888
简单的RPC客户端测试:
python ./examples/test_simple_rpc_framework.py
运行命令后,客户端将创建并注册一系列的服务实例,包括:
完整的RPC客户端测试:
python ./examples/test_incomplete_rpc_framework.py
运行命令后,这将运行一系列测试,包括:
测试序列化器功能
测试服务器-客户端通信(一个终端即可)
测试并发调用
内建服务测试
全面的RPC客户端测试:
python ./examples/example_client.py
service CalculatorService { version "1.0.0" description "A simple calculator service" method add(a: float, b: float) -> float { description "Add two numbers" } method factorial(n: int) -> int { description "Calculate factorial" } method hello(name: string = "World") -> string { description "Generate greeting with default parameter" } }
IDL生成Java语言EquationService服务:
python ./examples/test_idl_generate_java_client.py
运行命令后,将会执行下面4个步骤:
完整Java语言生成演示:
python ./examples/example_idl.py
service.idl
examples/generated/
Python客户端:
python ./examples/idl_test/python/test_cal.py
python ./examples/idl_test/python/test_eq.py
python ./examples/idl_test/python/test_ut.py
Java客户端:
# `CalculatorServiceClient.java` 在 `examples/generated/` 目录下 javac ./examples/generated/CalculatorServiceClient.java javac ./examples/generated/EquationServiceClient.java # 可能会提示warning,无视即可 javac ./examples/generated/UtilityServiceClient.java javac -cp "./examples/generated" ./examples/idl_test/java/test_cal.java javac -cp "./examples/generated" ./examples/idl_test/java/test_eq.java javac -cp "./examples/generated" ./examples/idl_test/java/test_ut.java
java -cp "examples/idl_test/java/;./examples/generated" test_cal
java -cp "examples/idl_test/java/;./examples/generated" test_eq
java -cp "examples/idl_test/java/;./examples/generated" test_ut
from rpc_framework import RPCServer # 创建服务器 server = RPCServer(host='localhost', port=8888, max_workers=10) # 注册单个服务 def my_function(x, y): return x + y server.register_service("add", my_function, "Addition function") # 批量注册类方法 class MyService: def method1(self): pass def method2(self): pass service = MyService() server.register_class_services(service, prefix="myservice.") # 启动服务器 server.start()
from rpc_framework import RPCClient # 创建客户端 client = RPCClient(host='localhost', port=8888, timeout=30.0) # 方式1:手动管理连接 client.connect() result = client.call("add", 10, 20) client.disconnect() # 方式2:使用上下文管理器 with client: result = client.call("add", 10, 20) # 内建服务 services = client.list_services() status = client.get_server_status() ping_result = client.ping("hello")
from rpc_framework import IDLCompiler # 创建IDL编译器 compiler = IDLCompiler() # 解析IDL文件 compiler.parse_idl_file("xxx.idl") # 或解析IDL内容 idl_content = """ service MyService { method test() -> string { description "Test method" } } """ compiler.parse_idl_content(idl_content) # 生成客户端代码 python_code = compiler.generate_client_code("MyService", "python") java_code = compiler.generate_client_code("MyService", "java") # 保存到文件 compiler.save_generated_code("MyService", "python", "./generated") compiler.save_generated_code("MyService", "java", "./generated")
框架使用自定义的二进制协议,消息格式如下:
+----------+----------+----------+----------+ | Magic(4) | Type(1) | Length(4)| Body(N) | +----------+----------+----------+----------+
0x52504321
请求消息:
{ "method": "service_name", "params": [arg1, arg2, ...], "id": "request_id" }
响应消息:
{ "result": "return_value", "id": "request_id" }
错误消息:
{ "error": { "code": -1, "message": "error_description" }, "id": "request_id" }
from rpc_framework.serializer import BaseSerializer class CustomSerializer(BaseSerializer): def serialize(self, data): # 自定义序列化逻辑 pass def deserialize(self, data): # 自定义反序列化逻辑 pass
可以扩展 RPCProtocol 类来支持其他协议格式:
RPCProtocol
from rpc_framework.protocol import RPCProtocol class CustomProtocol(RPCProtocol): @staticmethod def pack_message(msg_type, body): # 自定义打包逻辑 pass
本框架在设计时参考了以下资料:
本项目采用MIT许可证 - 详见 LICENSE 文件
作者: Yuhao Wang
版本: 1.0.0
最后更新: 2025年07月
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
RPC Framework
本项目完成了一个RPC(远程过程调用)框架,基于Python的Socket编程实现,具有一定的平台化特定、支持跨语言调用、具有IDL定义和IDL编译功能以及并发处理等功能。
🌟 特性
✅ 核心功能
✅ IDL和代码生成
✅ 高级特性
📁 项目结构
🚀 快速开始
1. 运行服务器
运行命令后,服务器将在
localhost:8888启动,并注册以下服务:2. 运行客户端
简单的RPC客户端测试:
运行命令后,客户端将创建并注册一系列的服务实例,包括:
完整的RPC客户端测试:
运行命令后,这将运行一系列测试,包括:
测试序列化器功能
测试服务器-客户端通信(一个终端即可)
测试并发调用
内建服务测试
全面的RPC客户端测试:
运行命令后,客户端将创建并注册一系列的服务实例,包括:
📝 IDL(接口描述语言)
1. IDL语法示例
2. 使用IDL编译器
IDL生成Java语言EquationService服务:
运行命令后,将会执行下面4个步骤:
完整Java语言生成演示:
运行命令后,将会执行下面4个步骤:
service.idl文件examples/generated/)3. 跨语言调用能力测试
Python客户端:
Java客户端:
🔧 API参考
RPC服务器
RPC客户端
IDL编译器
🌐 跨语言支持
协议格式
框架使用自定义的二进制协议,消息格式如下:
0x52504321消息体格式
请求消息:
响应消息:
错误消息:
🔀 并发模型
服务器并发
客户端并发
🛠️ 扩展和自定义
自定义序列化器
自定义协议
可以扩展
RPCProtocol类来支持其他协议格式:📊 性能和限制
性能特点
当前限制
🤝 参考资料
本框架在设计时参考了以下资料:
📄 许可证
本项目采用MIT许可证 - 详见 LICENSE 文件
作者: Yuhao Wang
版本: 1.0.0
最后更新: 2025年07月