{"id":19458535,"url":"https://github.com/infernalazazel/kylin-rpc","last_synced_at":"2026-05-16T03:36:40.196Z","repository":{"id":245422414,"uuid":"818201737","full_name":"InfernalAzazel/kylin-rpc","owner":"InfernalAzazel","description":"krpc 是一个用于在 FastAPI 中实现 RPC（远程过程调用）接口的简单库。它提供了一种方便的方式来定义和处理 RPC 请求和响应。","archived":false,"fork":false,"pushed_at":"2024-06-26T09:48:28.000Z","size":3108,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-08T01:54:33.467Z","etag":null,"topics":["fastapi","python310","rpc","rpc-framework"],"latest_commit_sha":null,"homepage":"https://infernalazazel.github.io/kylin-rpc/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/InfernalAzazel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-21T10:13:58.000Z","updated_at":"2024-06-26T09:47:58.000Z","dependencies_parsed_at":"2024-06-26T11:11:58.164Z","dependency_job_id":null,"html_url":"https://github.com/InfernalAzazel/kylin-rpc","commit_stats":null,"previous_names":["infernalazazel/kylin-rpc"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfernalAzazel%2Fkylin-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfernalAzazel%2Fkylin-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfernalAzazel%2Fkylin-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/InfernalAzazel%2Fkylin-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/InfernalAzazel","download_url":"https://codeload.github.com/InfernalAzazel/kylin-rpc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240662859,"owners_count":19837369,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","python310","rpc","rpc-framework"],"created_at":"2024-11-10T17:27:29.063Z","updated_at":"2026-05-16T03:36:35.177Z","avatar_url":"https://github.com/InfernalAzazel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# krpc\n\n`krpc` 是一个用于在 FastAPI 中实现 RPC（远程过程调用）接口的简单库。它提供了一种方便的方式来定义和处理 RPC 请求和响应。\n\n## 功能\n\n- 简单易用的 RPC 接口定义\n- 自动参数验证和错误处理\n- 兼容 FastAPI 的路由和依赖注入机制\n- 得益于 FastAPI 实现 KrpcAPI 自动文档\n- 支持多种解码\n- 高性能处理\n\n## 安装\n\n使用 [Poetry](https://python-poetry.org/) 进行安装：\n\n```sh\npoetry add kylin-rpc fastapi msgpack\n```\n\n或者使用 `pip` 进行安装：\n\n```sh\npip install kylin-rpc fastapi msgpack\n```\n\n## 快速开始\n\n在 `examples/basic/main.py` 中创建一个 FastAPI 应用，并定义一些 JSON-RPC 方法：\n\n```python\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel, Field\nfrom starlette.requests import Request\nfrom krpc import Entrypoint, RpcException, RpcErrorCode\n\n\nclass OperationParams(BaseModel):\n    a: int = Field(..., json_schema_extra={\"example\": 3}, description='A 变量')\n    b: int = Field(..., json_schema_extra={\"example\": 3}, description='B 变量')\n\n\napp = FastAPI(title=\"Krpc API\")\n# 创建一个 JSON-RPC 入口点\napi_v1 = Entrypoint('/api/v1/jsonrpc')\n\n\n# 处理全局异常\n@app.exception_handler(RpcException)\nasync def unicorn_exception_handler(request: Request, exc: RpcException):\n    message = api_v1.get_message(request)\n    return message.response_handle(error=exc.to_dict)\n\n\n# 定义一个 JSON-RPC 方法 add\n@api_v1.method\nasync def add(params: OperationParams, speak: str) -\u003e int:\n    print(speak)\n    if params.a is None or params.b is None:\n        raise RpcException.parse(RpcErrorCode.INVALID_PARAMS)\n    return params.a + params.b\n\n\n# 定义一个 JSON-RPC 方法 subtract\n@api_v1.method\nasync def subtract(params: OperationParams) -\u003e int:\n    if params.a is None or params.b is None:\n        raise RpcException.parse(RpcErrorCode.INVALID_PARAMS)\n    return params.a - params.b\n\n\n# 将 JSON-RPC 入口点注册到 FastAPI 应用中\napp.include_router(api_v1)\n\n# 运行应用\nif __name__ == \"__main__\":\n    import uvicorn\n\n    uvicorn.run(app, host=\"0.0.0.0\", port=8000)\n```\n\n### 运行示例\n\n确保已经安装了依赖，可以运行以下命令来启动服务：\n\n```sh\npython examples/basic/main.py\n```\n\n现在，你可以发送 JSON-RPC 请求到 `http://localhost:8000/api/v1/jsonrpc` 来调用定义的方法。例如：\n\n### 客户端\n\n在 `examples/basic/client.py` 中编写的代码：\n\n```python\nimport asyncio\nfrom pydantic import BaseModel\n\nfrom krpc import RpcClient\n\n\nclass OperationParams(BaseModel):\n    a: int\n    b: int\n\n\nclass AddParams(BaseModel):\n    params: OperationParams\n    speak: str\n    model_config = {\n        'method_name': 'add'\n    }\n\n\nasync def main():\n    rpc_client = RpcClient(url=\"http://127.0.0.1:8000/api/v1/jsonrpc\")\n\n    params = AddParams(params=OperationParams(a=1, b=2), speak=\"hello\")\n    response = rpc_client.call_model(params)\n    print(f\"同步调用结果: {response}\")\n\n    response = await rpc_client.call_model_async(params)\n    print(f\"异步调用结果: {response}\")\n\n    response = rpc_client.call('add', {'params': {\"a\": 1, \"b\": 2}})\n    print(f\"同步少参调用结果: {response}\")\n\n\nasyncio.run(main())\n```\n\n运行：\n\n```sh\npython examples/basic/client.py\n```\n\n如果不出意外你会看到类似如下输出:\n\n```shell\n同步调用结果: {'id': '8ad9a6cc-d332-4c3f-b6f8-ba734b773a34', 'result': 3, 'error': None}\n异步调用结果: {'id': 'da25ef99-5fc4-4e01-8393-b3afad5a0eaa', 'result': 3, 'error': None}\n同步少参调用结果: {'id': '16a913d6-8930-4178-ae1c-ce9ee757883e', 'result': None, 'error': {'code': -32602, 'message': 'Invalid params', 'data': 'Missing required parameter: speak'}}\n```\n\n\n## RpcAPI 自动文档\n\n- Swagger UI\n\n![1.png](resources/1.png)\n\n- ReDoc\n\n![2.png](resources/2.png)\n\n## 许可证\n\nMIT License\n\n版权所有（c）2024 Kylin","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfernalazazel%2Fkylin-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finfernalazazel%2Fkylin-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfernalazazel%2Fkylin-rpc/lists"}