{"id":15014247,"url":"https://github.com/oddityyyy/odd-rpc","last_synced_at":"2025-04-12T07:42:18.118Z","repository":{"id":208198683,"uuid":"721038798","full_name":"oddityyyy/odd-rpc","owner":"oddityyyy","description":"A high performance, distributed RPC framework. 高性能分布式远程过程调用框架","archived":false,"fork":false,"pushed_at":"2023-12-12T13:23:35.000Z","size":1700,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-26T02:51:13.157Z","etag":null,"topics":["distributed","high-performance","java","netty","rpc"],"latest_commit_sha":null,"homepage":"https://github.com/oddityyyy/odd-rpc","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oddityyyy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-11-20T08:30:37.000Z","updated_at":"2024-03-13T12:31:54.000Z","dependencies_parsed_at":"2023-12-12T14:45:00.561Z","dependency_job_id":null,"html_url":"https://github.com/oddityyyy/odd-rpc","commit_stats":null,"previous_names":["oddityyyy/odd-rpc"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddityyyy%2Fodd-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddityyyy%2Fodd-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddityyyy%2Fodd-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddityyyy%2Fodd-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oddityyyy","download_url":"https://codeload.github.com/oddityyyy/odd-rpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248536981,"owners_count":21120683,"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":["distributed","high-performance","java","netty","rpc"],"created_at":"2024-09-24T19:45:22.269Z","updated_at":"2025-04-12T07:42:18.086Z","avatar_url":"https://github.com/oddityyyy.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 一、stub 和 skeleton\n在RPC（远程过程调用）中，\"stub\" 和 \"skeleton\" 是两个关键概念，它们代表着不同的角色和功能：\n\n1. **Stub**:\n- Stub 是客户端用于代表远程服务的本地代理对象。\n- 在客户端实现，作为客户端程序调用远程服务的方式。\n- Stub 模拟了远程服务的接口，并通过网络将方法调用传递到实际的远程服务端。\n- 客户端调用 Stub 对象的方法时，实际上是在发送请求到远程服务器，并接收处理远程服务器返回的结果。\n2. **Skeleton**:\n- Skeleton 是远程服务在服务器端的代理对象。\n- 在服务器端实现，用于接收客户端请求、解析请求并调用本地服务的方式。\n- Skeleton 接收来自客户端的请求，解包请求并将请求转发到本地服务的实际实现。\n- 它提供了远程服务接口的本地实现，通过网络接收来自客户端的调用请求，并将其转发到实际的服务对象。\n\n总的来说，Stub 位于客户端，是客户端用来调用远程服务的本地代理对象； 而 Skeleton 位于服务器端，是服务器用来处理客户端请求并实际执行远程服务的代理对象。 Stub 主要用于客户端编程，Skeleton 则用于服务端编程，它们分别代表了在客户端和服务端对远程服务进行调用和处理的方式。\n## 二、Netty 和 NettyHttp 两种RPC协议的区别\n### Netty\nNetty底层使用Hessian2序列化协议，在channel中直接传输RpcRequest和RpcResponse对象，但是入站和出站需要经过NettyEncoder和NettyDecoder编码和解码（序列化/反序列化），相当于是TCP协议。\n### NettyHttp\nNettyHttp底层使用Hessian2序列化协议，在channel中传输之前需要将RpcRequest和RpcResonse对象装箱和拆箱为Http报文格式（请求头：host+keepAlive+contentLenth 和 请求体），入站和出站需要经过Netty包下的HttpClientCodec和HttpObjectAggregator编码和解码（装箱/拆箱+序列化/反序列化），相当于是HTTP协议。\n### http协议可以不用json序列化而用hessian2序列化方式么？\n\n是的，HTTP 请求和响应的数据可以使用不同的序列化方式，包括 Hessian2 格式。Hessian2 是一种二进制序列化协议，与 JSON 格式相比，它更加紧凑，适合在网络传输中使用。\n要在 HTTP 请求和响应中使用 Hessian2 序列化方式，你需要做以下工作：\n\n1. **服务端和客户端协商使用 Hessian2 序列化**：确保客户端和服务端都能理解并使用 Hessian2 序列化协议。你需要在服务端和客户端的代码中配置和实现对应的序列化和反序列化逻辑。\n2. **设置合适的请求头和响应头**：在 HTTP 请求和响应的头部信息中设置合适的 Content-Type。Hessian2 格式的 Content-Type 通常是 **application/x-hessian2**。这样可以告知服务端和客户端使用 Hessian2 格式进行序列化和反序列化。\n### 整体流程\n### [https://www.cnblogs.com/ssskkk/p/14891061.html](https://www.cnblogs.com/ssskkk/p/14891061.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddityyyy%2Fodd-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foddityyyy%2Fodd-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddityyyy%2Fodd-rpc/lists"}