{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/rpc-solutions/",
  "atlas": "https://www.pystone.net/?node=rpc-solutions#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/rpc-solutions.md",
  "context": "https://www.pystone.net/notes/rpc-solutions.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:rpc-solutions",
  "slug": "rpc-solutions",
  "title": "RPC方案",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "RPC方案 1. 通信协议: 使用基于 TCP/IP 的协议进行通信。ADB转发可以将设备上的特定端口映射到桌面端的端口，从而实现网络通信。 2. RPC机制: 可以使用如 gRPC, JSON RPC 等现成的RPC框架，或者自定义一个简单的基于JSON的协议。 3. 数据格式: 数据交换可以使用 JSON 或 Protobuf 等轻量级格式，这样可以简化跨语言通信的复杂性。",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "0e397eb918b71a55f89bae0bf7ce532c52c5ccb6ad69b4efcac6fc28408accf1",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "RPC方案",
      "anchor": "rpc方案",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#rpc%E6%96%B9%E6%A1%88"
    },
    {
      "depth": 2,
      "text": "RPC技术方案选型",
      "anchor": "rpc技术方案选型",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#rpc%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88%E9%80%89%E5%9E%8B"
    },
    {
      "depth": 3,
      "text": "1. gRPC",
      "anchor": "1-grpc",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#1-grpc"
    },
    {
      "depth": 3,
      "text": "2. JSON-RPC",
      "anchor": "2-json-rpc",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#2-json-rpc"
    },
    {
      "depth": 3,
      "text": "3. XML-RPC",
      "anchor": "3-xml-rpc",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#3-xml-rpc"
    },
    {
      "depth": 3,
      "text": "4. 自定义简单的基于JSON的协议",
      "anchor": "4-自定义简单的基于json的协议",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#4-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%AE%80%E5%8D%95%E7%9A%84%E5%9F%BA%E4%BA%8Ejson%E7%9A%84%E5%8D%8F%E8%AE%AE"
    },
    {
      "depth": 2,
      "text": "RPC与HTTP协议",
      "anchor": "rpc与http协议",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#rpc%E4%B8%8Ehttp%E5%8D%8F%E8%AE%AE"
    },
    {
      "depth": 3,
      "text": "GET 和 POST 请求（HTTP 协议）",
      "anchor": "get-和-post-请求http-协议",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#get-%E5%92%8C-post-%E8%AF%B7%E6%B1%82http-%E5%8D%8F%E8%AE%AE"
    },
    {
      "depth": 3,
      "text": "RPC",
      "anchor": "rpc",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#rpc"
    },
    {
      "depth": 3,
      "text": "区别总结",
      "anchor": "区别总结",
      "citation": "https://www.pystone.net/notes/rpc-solutions/#%E5%8C%BA%E5%88%AB%E6%80%BB%E7%BB%93"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:systems-and-network-security",
      "title": "系统基础与网络安全",
      "url": "https://www.pystone.net/notes/systems-and-network-security/",
      "atlas": "https://www.pystone.net/?node=systems-and-network-security#knowledge-atlas",
      "label": "系统基础与网络安全",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "网络工程中的“RPC方案”导航项",
      "citation": "https://www.pystone.net/notes/systems-and-network-security/#%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B"
    }
  ],
  "contentMarkdown": "# RPC方案\n1. 通信协议:\n使用基于 TCP/IP 的协议进行通信。ADB转发可以将设备上的特定端口映射到桌面端的端口，从而实现网络通信。\n2. RPC机制:\n可以使用如 gRPC, JSON-RPC 等现成的RPC框架，或者自定义一个简单的基于JSON的协议。\n3. 数据格式:\n数据交换可以使用 JSON 或 Protobuf 等轻量级格式，这样可以简化跨语言通信的复杂性。\n\n## RPC技术方案选型\n### 1. gRPC\n- 跨语言支持：gRPC 是一个高性能的 RPC 框架，由 Google 开发，支持多种语言，包括 Python 和 C#。\n- 基于 HTTP/2：gRPC 基于 HTTP/2 协议，支持双向流、流控、头部压缩等。\n- 使用 Protocol Buffers：默认使用 Protocol Buffers 作为接口定义语言和消息序列化格式，这提供了高效的数据传输。\n- 适用场景：适合于高性能、跨语言、双向流通信的场景。\n\n### 2. JSON-RPC\n- 简单性：JSON-RPC 是一个基于 JSON 的轻量级 RPC 协议，易于理解和实现。\n- 跨语言兼容性：几乎所有编程语言都支持 JSON，因此它适用于 Python 和 C#。\n- 适用场景：适合于需要简单、无状态的单次请求-响应模式的场景。\n\n### 3. XML-RPC\n- 标准化：XML-RPC 是一种使用 XML 编码的远程过程调用协议。\n- 跨语言支持：大多数现代编程语言都支持 XML，包括 Python 和 C#。\n- 适用场景：适用于需要标准化、跨语言解决方案的场景，但性能上不如 JSON-RPC 或 gRPC。\n\n### 4. 自定义简单的基于JSON的协议\n\n\n## RPC与HTTP协议\n\n在 Web 开发中的 GET 和 POST 请求（属于 HTTP 协议）与 RPC（远程过程调用）之间存在显著区别。这些区别涵盖了它们的用途、设计哲学、以及如何在网络上传输数据。\n\n### GET 和 POST 请求（HTTP 协议）\n1. **用途**:\n    - **GET**: 用于请求从服务器检索特定资源。GET 请求应该是幂等的，意味着多次执行相同的 GET 请求应返回相同的结果。\n    - **POST**: 用于向服务器提交数据，通常用于创建或更新资源。POST 请求不是幂等的，意味着多次执行相同的 POST 请求可能会有不同的效果。\n2. **数据传输**:\n    - **GET**: 请求参数包含在 URL 中，存在长度限制。\n    - **POST**: 请求数据通常在请求体中发送，没有长度限制。\n3. **安全性**:\n    - **GET**: 因为数据在 URL 中，所以不适合传输敏感数据。\n    - **POST**: 可以更安全地传输敏感数据，因为数据不会出现在 URL 中。\n4. **缓存和历史记录**:\n    - **GET**: 请求可能被浏览器缓存，也会留在浏览器历史记录中。\n    - **POST**: 一般不会被缓存，也不会留在浏览器历史记录中。\n\n### RPC\n\n1. **用途**:\n    - RPC 设计用于执行远程服务器上的过程或方法调用，就像调用本地方法一样。RPC 更注重于操作和方法调用。\n2. **数据传输**:\n    - RPC 可以通过多种传输协议发送，如 HTTP、TCP、UDP 等。数据通常在请求体中传输，格式可以是 JSON、XML、二进制（如 Protocol Buffers）等。\n3. **接口定义**:\n    - RPC 服务通常有明确的接口定义，说明了可调用的方法和它们的参数类型、返回类型等。\n4. **协议**:\n    - RPC 可以使用各种协议实现，如 gRPC（基于 HTTP/2）、JSON-RPC、XML-RPC 等。这些协议定义了如何在客户端和服务器之间进行有效的远程方法调用。\n\n### 区别总结\n\n- **层级和抽象**：GET/POST 请求是 HTTP 协议的一部分，关注于资源的传输和状态的变更。RPC 关注于远程执行函数或方法，提供了更高层次的抽象。\n- **灵活性**：RPC 提供更多的灵活性，可以选择不同的传输协议和数据格式，而 GET/POST 请求受限于 HTTP 协议的特定规则。\n- **设计哲学**：GET/POST 请求遵循 RESTful 设计原则，强调无状态和资源的表述。RPC 更侧重于行为和过程的调用。\n\n其他解释：https://www.bilibili.com/video/BV1Qv4y127B4/?spm_id_from=333.788&vd_source=37d77b0c4f47ce9562d64df16c394303\n\nRef:\nChatGPT\n"
}
