{"id":13692083,"url":"https://github.com/andeya/erpc","last_synced_at":"2025-05-14T02:08:03.803Z","repository":{"id":34270657,"uuid":"38157198","full_name":"andeya/erpc","owner":"andeya","description":"An efficient, extensible and easy-to-use RPC framework.","archived":false,"fork":false,"pushed_at":"2024-12-12T07:36:19.000Z","size":17676,"stargazers_count":2523,"open_issues_count":12,"forks_count":408,"subscribers_count":134,"default_branch":"master","last_synced_at":"2025-05-07T04:02:23.831Z","etag":null,"topics":["go","microservice","peer-to-peer","protocol","rpc","socket"],"latest_commit_sha":null,"homepage":"https://andeya.github.io/erpc-book","language":"Go","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/andeya.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":"2015-06-27T11:08:13.000Z","updated_at":"2025-04-23T11:13:08.000Z","dependencies_parsed_at":"2023-07-14T12:51:08.007Z","dependency_job_id":"856b1251-23aa-4490-a87a-6f5d83527987","html_url":"https://github.com/andeya/erpc","commit_stats":{"total_commits":899,"total_committers":14,"mean_commits":64.21428571428571,"dds":"0.026696329254727424","last_synced_commit":"c886c09b7164c86a68a7a7cae9a234cfdb3db0b0"},"previous_names":["henrylee2cn/teleport","henrylee2cn/erpc"],"tags_count":57,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andeya%2Ferpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andeya%2Ferpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andeya%2Ferpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andeya%2Ferpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andeya","download_url":"https://codeload.github.com/andeya/erpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253968230,"owners_count":21992252,"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":["go","microservice","peer-to-peer","protocol","rpc","socket"],"created_at":"2024-08-02T17:00:53.465Z","updated_at":"2025-05-14T02:07:58.787Z","avatar_url":"https://github.com/andeya.png","language":"Go","funding_links":[],"categories":["Open source library","Go"],"sub_categories":["Web Framework"],"readme":"# eRPC\n\n[![tag](https://img.shields.io/github/tag/andeya/erpc.svg)](https://github.com/andeya/erpc/releases)\n![Go Version](https://img.shields.io/badge/Go-%3E%3D%201.18-%23007d9c)\n[![GoDoc](https://godoc.org/github.com/andeya/erpc?status.svg)](https://pkg.go.dev/github.com/andeya/erpc/v7)\n![Build Status](https://github.com/andeya/erpc/actions/workflows/go-ci.yml/badge.svg)\n[![Go report](https://goreportcard.com/badge/github.com/andeya/erpc/v7)](https://goreportcard.com/report/github.com/andeya/erpc/v7)\n[![License](https://img.shields.io/github/license/andeya/erpc)](./LICENSE)\n\neRPC is an efficient, extensible and easy-to-use RPC framework.\n\nSuitable for RPC, Microservice, Peer-to-Peer, IM, Game and other fields.\n\n[简体中文](https://github.com/andeya/erpc/tree/master/README_ZH.md)\n\n\n![eRPC-Framework](https://github.com/andeya/erpc/raw/master/doc/erpc_module_diagram.png)\n\n\n## Install\n\n\n- go vesion ≥ 1.18\n\n- install\n```sh\nGO111MODULE=on go get -u -v -insecure github.com/andeya/erpc/v7\n```\n\n- import\n```go\nimport \"github.com/andeya/erpc/v7\"\n```\n\n## Feature\n\n- Use peer to provide the same API package for the server and client\n- Provide multi-layout abstractions such as:\n  - peer\n  - session/socket\n  - router\n  - handle/context\n  - message\n  - protocol\n  - codec\n  - transfer filter\n  - plugin\n- Support reboot and shutdown gracefully\n- HTTP-compatible message format:\n  - Composed of two parts, the `Header` and the `Body`\n  - `Header` contains metadata in the same format as HTTP header\n  - `Body` supports for custom codec of Content Type-Like, already implemented:\n    - Protobuf\n    - Thrift\n    - JSON\n    - XML\n    - Form\n    - Plain\n  - Support push, call-reply and more message types\n- Support custom message protocol, and provide some common implementations:\n  - `rawproto` - Default high performance binary protocol\n  - `jsonproto` - JSON message protocol\n  - `pbproto` - Ptotobuf message protocol\n  - `thriftproto` - Thrift message protocol\n  - `httproto` - HTTP message protocol\n- Optimized high performance transport layer\n  - Use Non-block socket and I/O multiplexing technology\n  - Support setting the size of socket I/O buffer\n  - Support setting the size of the reading message (if exceed disconnect it)\n  - Support controling the connection file descriptor\n- Support a variety of network types:\n  - `tcp`\n  - `tcp4`\n  - `tcp6`\n  - `unix`\n  - `unixpacket`\n  - `kcp`\n  - `quic`\n  - other\n    - websocket\n    - evio\n- Provide a rich plug-in point, and already implemented:\n  - auth\n  - binder\n  - heartbeat\n  - ignorecase(service method)\n  - overloader\n  - proxy(for unknown service method)\n  - secure\n- Powerful and flexible logging system:\n  - Detailed log information, support print input and output details\n  - Support setting slow operation alarm threshold\n  - Support for custom implementation log component\n- Client session support automatically redials after disconnection\n\n\n## Benchmark\n\n**Self Test**\n\n- A server and a client process, running on the same machine\n- CPU:    Intel Xeon E312xx (Sandy Bridge) 16 cores 2.53GHz\n- Memory: 16G\n- OS:     Linux 2.6.32-696.16.1.el6.centos.plus.x86_64, CentOS 6.4\n- Go:     1.9.2\n- Message size: 581 bytes\n- Message codec: protobuf\n- Sent total 1000000 messages\n\n- erpc\n\n| client concurrency | mean(ms) | median(ms) | max(ms) | min(ms) | throughput(TPS) |\n| ------------------ | -------- | ---------- | ------- | ------- | --------------- |\n| 100                | 1        | 0          | 16      | 0       | 75505           |\n| 500                | 9        | 11         | 97      | 0       | 52192           |\n| 1000               | 19       | 24         | 187     | 0       | 50040           |\n| 2000               | 39       | 54         | 409     | 0       | 42551           |\n| 5000               | 96       | 128        | 1148    | 0       | 46367           |\n\n- erpc/socket\n\n| client concurrency | mean(ms) | median(ms) | max(ms) | min(ms) | throughput(TPS) |\n| ------------------ | -------- | ---------- | ------- | ------- | --------------- |\n| 100                | 0        | 0          | 14      | 0       | 225682          |\n| 500                | 2        | 1          | 24      | 0       | 212630          |\n| 1000               | 4        | 3          | 51      | 0       | 180733          |\n| 2000               | 8        | 6          | 64      | 0       | 183351          |\n| 5000               | 21       | 18         | 651     | 0       | 133886          |\n\n**Comparison Test**\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eEnvironment\u003c/th\u003e\u003cth\u003eThroughputs\u003c/th\u003e\u003cth\u003eMean Latency\u003c/th\u003e\u003cth\u003eP99 Latency\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd width=\"10%\"\u003e\u003cimg src=\"https://github.com/andeya/rpc-benchmark/raw/master/result/env.png\"\u003e\u003c/td\u003e\n\u003ctd width=\"30%\"\u003e\u003cimg src=\"https://github.com/andeya/rpc-benchmark/raw/master/result/throughput.png\"\u003e\u003c/td\u003e\n\u003ctd width=\"30%\"\u003e\u003cimg src=\"https://github.com/andeya/rpc-benchmark/raw/master/result/mean_latency.png\"\u003e\u003c/td\u003e\n\u003ctd width=\"30%\"\u003e\u003cimg src=\"https://github.com/andeya/rpc-benchmark/raw/master/result/p99_latency.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n**[More Detail](https://github.com/andeya/rpc-benchmark)**\n\n- Profile torch of erpc/socket\n\n![erpc_socket_profile_torch](https://github.com/andeya/erpc/raw/master/doc/erpc_socket_profile_torch.png)\n\n**[svg file](https://github.com/andeya/erpc/raw/master/doc/erpc_socket_profile_torch.svg)**\n\n- Heap torch of erpc/socket\n\n![erpc_socket_heap_torch](https://github.com/andeya/erpc/raw/master/doc/erpc_socket_heap_torch.png)\n\n**[svg file](https://github.com/andeya/erpc/raw/master/doc/erpc_socket_heap_torch.svg)**\n\n\n## Example\n\n### server.go\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/andeya/erpc/v7\"\n)\n\nfunc main() {\n\tdefer erpc.FlushLogger()\n\t// graceful\n\tgo erpc.GraceSignal()\n\n\t// server peer\n\tsrv := erpc.NewPeer(erpc.PeerConfig{\n\t\tCountTime:   true,\n\t\tListenPort:  9090,\n\t\tPrintDetail: true,\n\t})\n\t// srv.SetTLSConfig(erpc.GenerateTLSConfigForServer())\n\n\t// router\n\tsrv.RouteCall(new(Math))\n\n\t// broadcast per 5s\n\tgo func() {\n\t\tfor {\n\t\t\ttime.Sleep(time.Second * 5)\n\t\t\tsrv.RangeSession(func(sess erpc.Session) bool {\n\t\t\t\tsess.Push(\n\t\t\t\t\t\"/push/status\",\n\t\t\t\t\tfmt.Sprintf(\"this is a broadcast, server time: %v\", time.Now()),\n\t\t\t\t)\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\t}()\n\n\t// listen and serve\n\tsrv.ListenAndServe()\n}\n\n// Math handler\ntype Math struct {\n\terpc.CallCtx\n}\n\n// Add handles addition request\nfunc (m *Math) Add(arg *[]int) (int, *erpc.Status) {\n\t// test meta\n\terpc.Infof(\"author: %s\", m.PeekMeta(\"author\"))\n\t// add\n\tvar r int\n\tfor _, a := range *arg {\n\t\tr += a\n\t}\n\t// response\n\treturn r, nil\n}\n```\n\n### client.go\n\n```go\npackage main\n\nimport (\n  \"time\"\n\n  \"github.com/andeya/erpc/v7\"\n)\n\nfunc main() {\n  defer erpc.SetLoggerLevel(\"ERROR\")()\n\n  cli := erpc.NewPeer(erpc.PeerConfig{})\n  defer cli.Close()\n  // cli.SetTLSConfig(\u0026tls.Config{InsecureSkipVerify: true})\n\n  cli.RoutePush(new(Push))\n\n  sess, stat := cli.Dial(\":9090\")\n  if !stat.OK() {\n    erpc.Fatalf(\"%v\", stat)\n  }\n\n  var result int\n  stat = sess.Call(\"/math/add\",\n    []int{1, 2, 3, 4, 5},\n    \u0026result,\n    erpc.WithAddMeta(\"author\", \"andeya\"),\n  ).Status()\n  if !stat.OK() {\n    erpc.Fatalf(\"%v\", stat)\n  }\n  erpc.Printf(\"result: %d\", result)\n  erpc.Printf(\"Wait 10 seconds to receive the push...\")\n  time.Sleep(time.Second * 10)\n}\n\n// Push push handler\ntype Push struct {\n  erpc.PushCtx\n}\n\n// Push handles '/push/status' message\nfunc (p *Push) Status(arg *string) *erpc.Status {\n  erpc.Printf(\"%s\", *arg)\n  return nil\n}\n```\n\n[More Examples](https://github.com/andeya/erpc/tree/master/examples)\n\n## Usage\n\n**NOTE:**\n\n- It is best to set the packet size when reading: `SetReadLimit`\n- The default packet size limit when reading is 1 GB\n\n### Peer(server or client) Demo\n\n```go\n// Start a server\nvar peer1 = erpc.NewPeer(erpc.PeerConfig{\nListenPort: 9090, // for server role\n})\npeer1.Listen()\n\n...\n\n// Start a client\nvar peer2 = erpc.NewPeer(erpc.PeerConfig{})\nvar sess, err = peer2.Dial(\"127.0.0.1:8080\")\n```\n\n### Call-Struct API template\n\n```go\ntype Aaa struct {\n    erpc.CallCtx\n}\nfunc (x *Aaa) XxZz(arg *\u003cT\u003e) (\u003cT\u003e, *erpc.Status) {\n    ...\n    return r, nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the call route\n// HTTP mapping: /aaa/xx_zz\n// RPC mapping: Aaa.XxZz\npeer.RouteCall(new(Aaa))\n\n// or register the call route\n// HTTP mapping: /xx_zz\n// RPC mapping: XxZz\npeer.RouteCallFunc((*Aaa).XxZz)\n```\n\n### Service method mapping\n\n- The default mapping(HTTPServiceMethodMapper) of struct(func) name to service methods:\n    - `AaBb` -\u003e `/aa_bb`\n    - `ABcXYz` -\u003e `/abc_xyz`\n    - `Aa__Bb` -\u003e `/aa_bb`\n    - `aa__bb` -\u003e `/aa_bb`\n    - `ABC__XYZ` -\u003e `/abc_xyz`\n    - `Aa_Bb` -\u003e `/aa/bb`\n    - `aa_bb` -\u003e `/aa/bb`\n    - `ABC_XYZ` -\u003e `/abc/xyz`\n    ```go\n    erpc.SetServiceMethodMapper(erpc.HTTPServiceMethodMapper)\n    ```\n\n- The mapping(RPCServiceMethodMapper) of struct(func) name to service methods:\n    - `AaBb` -\u003e `AaBb`\n    - `ABcXYz` -\u003e `ABcXYz`\n    - `Aa__Bb` -\u003e `Aa_Bb`\n    - `aa__bb` -\u003e `aa_bb`\n    - `ABC__XYZ` -\u003e `ABC_XYZ`\n    - `Aa_Bb` -\u003e `Aa.Bb`\n    - `aa_bb` -\u003e `aa.bb`\n    - `ABC_XYZ` -\u003e `ABC.XYZ`\n    ```go\n    erpc.SetServiceMethodMapper(erpc.RPCServiceMethodMapper)\n    ```\n\n### Call-Function API template\n\n```go\nfunc XxZz(ctx erpc.CallCtx, arg *\u003cT\u003e) (\u003cT\u003e, *erpc.Status) {\n    ...\n    return r, nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the call route\n// HTTP mapping: /xx_zz\n// RPC mapping: XxZz\npeer.RouteCallFunc(XxZz)\n```\n\n### Push-Struct API template\n\n```go\ntype Bbb struct {\n    erpc.PushCtx\n}\nfunc (b *Bbb) YyZz(arg *\u003cT\u003e) *erpc.Status {\n    ...\n    return nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the push handler\n// HTTP mapping: /bbb/yy_zz\n// RPC mapping: Bbb.YyZz\npeer.RoutePush(new(Bbb))\n\n// or register the push handler\n// HTTP mapping: /yy_zz\n// RPC mapping: YyZz\npeer.RoutePushFunc((*Bbb).YyZz)\n```\n\n### Push-Function API template\n\n```go\n// YyZz register the handler\nfunc YyZz(ctx erpc.PushCtx, arg *\u003cT\u003e) *erpc.Status {\n    ...\n    return nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the push handler\n// HTTP mapping: /yy_zz\n// RPC mapping: YyZz\npeer.RoutePushFunc(YyZz)\n```\n\n### Unknown-Call-Function API template\n\n```go\nfunc XxxUnknownCall (ctx erpc.UnknownCallCtx) (interface{}, *erpc.Status) {\n    ...\n    return r, nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the unknown call route: /*\npeer.SetUnknownCall(XxxUnknownCall)\n```\n\n### Unknown-Push-Function API template\n\n```go\nfunc XxxUnknownPush(ctx erpc.UnknownPushCtx) *erpc.Status {\n    ...\n    return nil\n}\n```\n\n- register it to root router:\n\n```go\n// register the unknown push route: /*\npeer.SetUnknownPush(XxxUnknownPush)\n```\n\n### Plugin Demo\n\n```go\n// NewIgnoreCase Returns a ignoreCase plugin.\nfunc NewIgnoreCase() *ignoreCase {\n    return \u0026ignoreCase{}\n}\n\ntype ignoreCase struct{}\n\nvar (\n    _ erpc.PostReadCallHeaderPlugin = new(ignoreCase)\n    _ erpc.PostReadPushHeaderPlugin = new(ignoreCase)\n)\n\nfunc (i *ignoreCase) Name() string {\n    return \"ignoreCase\"\n}\n\nfunc (i *ignoreCase) PostReadCallHeader(ctx erpc.ReadCtx) *erpc.Status {\n    // Dynamic transformation path is lowercase\n    ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path)\n    return nil\n}\n\nfunc (i *ignoreCase) PostReadPushHeader(ctx erpc.ReadCtx) *erpc.Status {\n    // Dynamic transformation path is lowercase\n    ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path)\n    return nil\n}\n```\n\n### Register above handler and plugin\n\n```go\n// add router group\ngroup := peer.SubRoute(\"test\")\n// register to test group\ngroup.RouteCall(new(Aaa), NewIgnoreCase())\npeer.RouteCallFunc(XxZz, NewIgnoreCase())\ngroup.RoutePush(new(Bbb))\npeer.RoutePushFunc(YyZz)\npeer.SetUnknownCall(XxxUnknownCall)\npeer.SetUnknownPush(XxxUnknownPush)\n```\n\n### Config\n\n```go\ntype PeerConfig struct {\n    Network            string        `yaml:\"network\"              ini:\"network\"              comment:\"Network; tcp, tcp4, tcp6, unix, unixpacket, kcp or quic\"`\n    LocalIP            string        `yaml:\"local_ip\"             ini:\"local_ip\"             comment:\"Local IP\"`\n    ListenPort         uint16        `yaml:\"listen_port\"          ini:\"listen_port\"          comment:\"Listen port; for server role\"`\n    DialTimeout time.Duration `yaml:\"dial_timeout\" ini:\"dial_timeout\" comment:\"Default maximum duration for dialing; for client role; ns,µs,ms,s,m,h\"`\n    RedialTimes        int32         `yaml:\"redial_times\"         ini:\"redial_times\"         comment:\"The maximum times of attempts to redial, after the connection has been unexpectedly broken; Unlimited when \u003c0; for client role\"`\n\tRedialInterval     time.Duration `yaml:\"redial_interval\"      ini:\"redial_interval\"      comment:\"Interval of redialing each time, default 100ms; for client role; ns,µs,ms,s,m,h\"`\n    DefaultBodyCodec   string        `yaml:\"default_body_codec\"   ini:\"default_body_codec\"   comment:\"Default body codec type id\"`\n    DefaultSessionAge  time.Duration `yaml:\"default_session_age\"  ini:\"default_session_age\"  comment:\"Default session max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h\"`\n    DefaultContextAge  time.Duration `yaml:\"default_context_age\"  ini:\"default_context_age\"  comment:\"Default CALL or PUSH context max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h\"`\n    SlowCometDuration  time.Duration `yaml:\"slow_comet_duration\"  ini:\"slow_comet_duration\"  comment:\"Slow operation alarm threshold; ns,µs,ms,s ...\"`\n    PrintDetail        bool          `yaml:\"print_detail\"         ini:\"print_detail\"         comment:\"Is print body and metadata or not\"`\n    CountTime          bool          `yaml:\"count_time\"           ini:\"count_time\"           comment:\"Is count cost time or not\"`\n}\n```\n\n### Optimize\n\n- SetMessageSizeLimit sets max message size.\n  If maxSize\u003c=0, set it to max uint32.\n\n    ```go\n    func SetMessageSizeLimit(maxMessageSize uint32)\n    ```\n\n- SetSocketKeepAlive sets whether the operating system should send\n  keepalive messages on the connection.\n\n    ```go\n    func SetSocketKeepAlive(keepalive bool)\n    ```\n\n- SetSocketKeepAlivePeriod sets period between keep alives.\n\n    ```go\n    func SetSocketKeepAlivePeriod(d time.Duration)\n    ```\n\n- SetSocketNoDelay controls whether the operating system should delay\n  message transmission in hopes of sending fewer messages (Nagle's\n  algorithm).  The default is true (no delay), meaning that data is\n  sent as soon as possible after a Write.\n\n    ```go\n    func SetSocketNoDelay(_noDelay bool)\n    ```\n\n- SetSocketReadBuffer sets the size of the operating system's\n  receive buffer associated with the connection.\n\n    ```go\n    func SetSocketReadBuffer(bytes int)\n    ```\n\n- SetSocketWriteBuffer sets the size of the operating system's\n  transmit buffer associated with the connection.\n\n    ```go\n    func SetSocketWriteBuffer(bytes int)\n    ```\n\n\n## Extensions\n\n### Codec\n\n| package                                  | import                                   | description                  |\n| ---------------------------------------- | ---------------------------------------- | ---------------------------- |\n| [json](https://github.com/andeya/erpc/blob/master/codec/json_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | JSON codec(erpc own)     |\n| [protobuf](https://github.com/andeya/erpc/blob/master/codec/protobuf_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | Protobuf codec(erpc own) |\n| [thrift](https://github.com/andeya/erpc/blob/master/codec/thrift_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | Form(url encode) codec(erpc own)   |\n| [xml](https://github.com/andeya/erpc/blob/master/codec/xml_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | Form(url encode) codec(erpc own)   |\n| [plain](https://github.com/andeya/erpc/blob/master/codec/plain_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | Plain text codec(erpc own)   |\n| [form](https://github.com/andeya/erpc/blob/master/codec/form_codec.go) | `\"github.com/andeya/erpc/v7/codec\"` | Form(url encode) codec(erpc own)   |\n\n### Plugin\n\n| package                                  | import                                   | description                              |\n| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |\n| [auth](https://github.com/andeya/erpc/tree/master/plugin/auth) | `\"github.com/andeya/erpc/v7/plugin/auth\"` | An auth plugin for verifying peer at the first time |\n| [binder](https://github.com/andeya/erpc/tree/master/plugin/binder) | `\"github.com/andeya/erpc/v7/plugin/binder\"` | Parameter Binding Verification for Struct Handler |\n| [heartbeat](https://github.com/andeya/erpc/tree/master/plugin/heartbeat) | `\"github.com/andeya/erpc/v7/plugin/heartbeat\"` | A generic timing heartbeat plugin        |\n| [proxy](https://github.com/andeya/erpc/tree/master/plugin/proxy) | `\"github.com/andeya/erpc/v7/plugin/proxy\"` | A proxy plugin for handling unknown calling or pushing |\n[secure](https://github.com/andeya/erpc/tree/master/plugin/secure)|`\"github.com/andeya/erpc/v7/plugin/secure\"` | Encrypting/decrypting the message body\n[overloader](https://github.com/andeya/erpc/tree/master/plugin/overloader)|`\"github.com/andeya/erpc/v7/plugin/overloader\"` | A plugin to protect erpc from overload\n\n### Protocol\n\n| package                                  | import                                   | description                              |\n| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |\n| [rawproto](https://github.com/andeya/erpc/tree/master/proto/rawproto) | `\"github.com/andeya/erpc/v7/proto/rawproto` | A fast socket communication protocol(erpc default protocol) |\n| [jsonproto](https://github.com/andeya/erpc/tree/master/proto/jsonproto) | `\"github.com/andeya/erpc/v7/proto/jsonproto\"` | A JSON socket communication protocol     |\n| [pbproto](https://github.com/andeya/erpc/tree/master/proto/pbproto) | `\"github.com/andeya/erpc/v7/proto/pbproto\"` | A Protobuf socket communication protocol     |\n| [thriftproto](https://github.com/andeya/erpc/tree/master/proto/thriftproto) | `\"github.com/andeya/erpc/v7/proto/thriftproto\"` | A Thrift communication protocol     |\n| [httproto](https://github.com/andeya/erpc/tree/master/proto/httproto) | `\"github.com/andeya/erpc/v7/proto/httproto\"` | A HTTP style socket communication protocol     |\n\n### Transfer-Filter\n\n| package                                  | import                                   | description                              |\n| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |\n| [gzip](https://github.com/andeya/erpc/tree/master/xfer/gzip) | `\"github.com/andeya/erpc/v7/xfer/gzip\"` | Gzip(erpc own)                       |\n| [md5](https://github.com/andeya/erpc/tree/master/xfer/md5) | `\"github.com/andeya/erpc/v7/xfer/md5\"` | Provides a integrity check transfer filter |\n\n### Mixer\n\n| package                                  | import                                   | description                              |\n| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |\n| [multiclient](https://github.com/andeya/erpc/tree/master/mixer/multiclient) | `\"github.com/andeya/erpc/v7/mixer/multiclient\"` | Higher throughput client connection pool when transferring large messages (such as downloading files) |\n| [websocket](https://github.com/andeya/erpc/tree/master/mixer/websocket) | `\"github.com/andeya/erpc/v7/mixer/websocket\"` | Makes the eRPC framework compatible with websocket protocol as specified in RFC 6455 |\n| [evio](https://github.com/andeya/erpc/tree/master/mixer/evio) | `\"github.com/andeya/erpc/v7/mixer/evio\"` | A fast event-loop networking framework that uses the erpc API layer |\n| [html](https://github.com/xiaoenai/tp-micro/tree/master/helper/mod-html) | `html \"github.com/xiaoenai/tp-micro/helper/mod-html\"` | HTML render for http client |\n\n## Projects based on eRPC\n\n| project                                  | description                              |\n| ---------------------------------------- | ---------------------------------------- |\n| [TP-Micro](https://github.com/xiaoenai/tp-micro) | TP-Micro is a simple, powerful micro service framework based on eRPC |\n| [Pholcus](https://github.com/andeya/pholcus) | Pholcus is a distributed, high concurrency and powerful web crawler software |\n\n## Business Users\n\n\u003ca href=\"http://www.xiaoenai.com\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/andeya/imgs-repo/master/xiaoenai.png\" height=\"50\" alt=\"深圳市梦之舵信息技术有限公司\"/\u003e\u003c/a\u003e\n\u0026nbsp;\u0026nbsp;\n\u003ca href=\"https://tech.pingan.com/index.html\"\u003e\u003cimg src=\"http://pa-tech.hirede.com/templates/pa-tech/Images/logo.png\" height=\"50\" alt=\"平安科技\"/\u003e\u003c/a\u003e\n\u003cbr/\u003e\n\u003ca href=\"http://www.fun.tv\"\u003e\u003cimg src=\"http://static.funshion.com/open/static/img/logo.gif\" height=\"70\" alt=\"北京风行在线技术有限公司\"/\u003e\u003c/a\u003e\n\u0026nbsp;\u0026nbsp;\n\u003ca href=\"http://www.kejishidai.cn\"\u003e\u003cimg src=\"http://simg.ktvms.com/picture/logo.png\" height=\"70\" alt=\"北京可即时代网络公司\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://www.kuaishou.com/\"\u003e\u003cimg src=\"https://inews.gtimg.com/newsapp_bt/0/4400789257/1000\" height=\"70\" alt=\"快手短视频平台\"/\u003e\u003c/a\u003e\n\n## License\n\neRPC is under Apache v2 License. See the [LICENSE](https://github.com/andeya/erpc/raw/master/LICENSE) file for the full license text\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandeya%2Ferpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandeya%2Ferpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandeya%2Ferpc/lists"}