{"id":26826708,"url":"https://github.com/hslam/rpc","last_synced_at":"2025-04-28T16:49:17.416Z","repository":{"id":57545327,"uuid":"224660170","full_name":"hslam/rpc","owner":"hslam","description":"Package rpc implements a remote procedure call over TCP, UNIX, HTTP and WS. Up to 4x faster than net/rpc.","archived":false,"fork":false,"pushed_at":"2023-05-17T14:06:57.000Z","size":14047,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-30T11:32:42.856Z","etag":null,"topics":["batching","code","epoll","fast","go","golang","kqueue","multiplexing","netpoll","pb","ping","pipelining","rpc","server-push","tls","transport","watch"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hslam.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-28T13:32:27.000Z","updated_at":"2024-10-04T12:26:47.000Z","dependencies_parsed_at":"2024-06-21T02:16:27.065Z","dependency_job_id":"bdf7ce68-7e0d-45b2-9eb6-3f43f2832ab6","html_url":"https://github.com/hslam/rpc","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Frpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Frpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Frpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslam%2Frpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hslam","download_url":"https://codeload.github.com/hslam/rpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251348752,"owners_count":21575329,"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":["batching","code","epoll","fast","go","golang","kqueue","multiplexing","netpoll","pb","ping","pipelining","rpc","server-push","tls","transport","watch"],"created_at":"2025-03-30T11:30:37.073Z","updated_at":"2025-04-28T16:49:17.392Z","avatar_url":"https://github.com/hslam.png","language":"Go","readme":"# rpc\n[![PkgGoDev](https://pkg.go.dev/badge/github.com/hslam/rpc)](https://pkg.go.dev/github.com/hslam/rpc)\n[![Build Status](https://github.com/hslam/rpc/workflows/build/badge.svg)](https://github.com/hslam/rpc/actions)\n[![codecov](https://codecov.io/gh/hslam/rpc/branch/master/graph/badge.svg)](https://codecov.io/gh/hslam/rpc)\n[![Go Report Card](https://goreportcard.com/badge/github.com/hslam/rpc?v=7e100)](https://goreportcard.com/report/github.com/hslam/rpc)\n[![LICENSE](https://img.shields.io/github/license/hslam/rpc.svg?style=flat-square)](https://github.com/hslam/rpc/blob/master/LICENSE)\n\nPackage rpc implements a remote procedure call over TCP, UNIX, HTTP and WS. The rpc improves throughput and reduces latency. Up to 4 times faster than net/rpc.\n\n## Feature\n* More throughput and less latency.\n* **[Netpoll](https://github.com/hslam/netpoll \"netpoll\")** epoll/kqueue/net\n* **[Network](https://github.com/hslam/socket \"socket\")** tcp/unix/http/[ws](https://github.com/hslam/websocket \"websocket\")\n* **[Codec](https://github.com/hslam/codec \"codec\")** json/[code](https://github.com/hslam/code \"code\")/pb\n* Multiplexing/Pipelining\n* [Auto batching](https://github.com/hslam/writer \"writer\")\n* Call/Go/RoundTrip/Ping/Stream/CallWithContext\n* Conn/Transport/Client\n* TLS\n\n**Comparison to other packages**\n\n|Package| [netrpc](https://github.com/golang/go/tree/master/src/net/rpc \"netrpc\")| [jsonrpc](https://github.com/golang/go/tree/master/src/net/rpc/jsonrpc \"jsonrpc\")|[rpc](https://github.com/hslam/rpc \"rpc\")|[grpc](https://google.golang.org/grpc \"grpc\")|[rpcx](https://github.com/smallnest/rpcx \"rpcx\")|\n|:--:|:--|:--|:--|:--|:--|\n|Epoll/Kqueue|No|No|Yes|No|No|\n|Multiplexing|Yes|Yes|Yes|Yes|Yes|\n|Pipelining|No|No|Yes|No|No|\n|Auto Batching|No|No|Yes|No|No|\n|Transport|No|No|Yes|No|No|\n\n## [Benchmark](http://github.com/hslam/rpc-benchmark \"rpc-benchmark\")\n\n##### Low Concurrency\n\n\u003cimg src=\"https://raw.githubusercontent.com/hslam/rpc-benchmark/master/rpc-bar-qps.png\" width = \"400\" height = \"300\" alt=\"rpc\" align=center\u003e\u003cimg src=\"https://raw.githubusercontent.com/hslam/rpc-benchmark/master/rpc-bar-p99.png\" width = \"400\" height = \"300\" alt=\"rpc\" align=center\u003e\n\n##### High Concurrency\n\n\u003cimg src=\"https://raw.githubusercontent.com/hslam/rpc-benchmark/master/rpc-curve-qps.png\" width = \"400\" height = \"300\" alt=\"rpc\" align=center\u003e\u003cimg src=\"https://raw.githubusercontent.com/hslam/rpc-benchmark/master/rpc-curve-p99.png\" width = \"400\" height = \"300\" alt=\"rpc\" align=center\u003e\n\n## Get started\n\n### Install\n```\ngo get github.com/hslam/rpc\n```\n### Import\n```\nimport \"github.com/hslam/rpc\"\n```\n\n### Usage\n#### [Examples](https://github.com/hslam/rpc/tree/master/examples \"examples\")\narith.proto\n```\nsyntax = \"proto3\";\npackage service;\n\nmessage ArithRequest {\n    int32 a = 1;\n    int32 b = 2;\n}\n\nmessage ArithResponse {\n    int32 pro = 1;\n}\n```\n\n**[GoGo Protobuf ](https://github.com/gogo/protobuf \"gogoprotobuf\")**\n```\nprotoc ./arith.proto --gogofaster_out=./\n```\n\narith.go\n```go\npackage service\n\ntype Arith struct{}\n\nfunc (a *Arith) Multiply(req *ArithRequest, res *ArithResponse) error {\n\tres.Pro = req.A * req.B\n\treturn nil\n}\n```\n\nserver.go\n```go\npackage main\n\nimport (\n\t\"github.com/hslam/rpc\"\n\t\"github.com/hslam/rpc/examples/codec/pb/service\"\n)\n\nfunc main() {\n\trpc.Register(new(service.Arith))\n\trpc.Listen(\"tcp\", \":9999\", \"pb\")\n}\n```\n\nconn.go\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hslam/rpc\"\n\t\"github.com/hslam/rpc/examples/codec/pb/service\"\n)\n\nfunc main() {\n\tconn, err := rpc.Dial(\"tcp\", \":9999\", \"pb\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer conn.Close()\n\treq := \u0026service.ArithRequest{A: 9, B: 2}\n\tvar res service.ArithResponse\n\tif err = conn.Call(\"Arith.Multiply\", req, \u0026res); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%d * %d = %d\\n\", req.A, req.B, res.Pro)\n}\n```\n\ntransport.go\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hslam/rpc\"\n\t\"github.com/hslam/rpc/examples/codec/pb/service\"\n)\n\nfunc main() {\n\ttrans := \u0026rpc.Transport{\n\t\tMaxConnsPerHost:     1,\n\t\tMaxIdleConnsPerHost: 1,\n\t\tOptions:             \u0026rpc.Options{Network: \"tcp\", Codec: \"pb\"},\n\t}\n\tdefer trans.Close()\n\treq := \u0026service.ArithRequest{A: 9, B: 2}\n\tvar res service.ArithResponse\n\tif err := trans.Call(\":9999\", \"Arith.Multiply\", req, \u0026res); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%d * %d = %d\\n\", req.A, req.B, res.Pro)\n}\n```\n\nclient.go\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hslam/rpc\"\n\t\"github.com/hslam/rpc/examples/codec/pb/service\"\n)\n\nfunc main() {\n\topts := \u0026rpc.Options{Network: \"tcp\", Codec: \"pb\"}\n\tclient := rpc.NewClient(opts, \":9997\", \":9998\", \":9999\")\n\tclient.Scheduling = rpc.LeastTimeScheduling\n\tdefer client.Close()\n\treq := \u0026service.ArithRequest{A: 9, B: 2}\n\tvar res service.ArithResponse\n\tif err := client.Call(\"Arith.Multiply\", req, \u0026res); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%d * %d = %d\\n\", req.A, req.B, res.Pro)\n}\n```\n\ncontext.go\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/hslam/rpc\"\n\t\"github.com/hslam/rpc/examples/codec/pb/service\"\n\t\"time\"\n)\n\nfunc main() {\n\tconn, err := rpc.Dial(\"tcp\", \":9999\", \"pb\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer conn.Close()\n\treq := \u0026service.ArithRequest{A: 9, B: 2}\n\tvar res service.ArithResponse\n\temptyCtx := context.Background()\n\tvalueCtx := context.WithValue(emptyCtx, rpc.BufferContextKey, make([]byte, 64))\n\tctx, cancel := context.WithTimeout(valueCtx, time.Minute)\n\tdefer cancel()\n\terr = conn.CallWithContext(ctx, \"Arith.Multiply\", req, \u0026res)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"%d * %d = %d\\n\", req.A, req.B, res.Pro)\n}\n```\n\n#### Output\n```\n9 * 2 = 18\n```\n\n\n### License\nThis package is licensed under a MIT license (Copyright (c) 2019 Meng Huang)\n\n\n### Author\nrpc was written by Meng Huang.\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslam%2Frpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhslam%2Frpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslam%2Frpc/lists"}