{"id":20986623,"url":"https://github.com/dpwgc/comborpc","last_synced_at":"2025-09-25T16:47:37.964Z","repository":{"id":199045364,"uuid":"701708918","full_name":"dpwgc/comborpc","owner":"dpwgc","description":"基于TCP+MessagePack的简易RPC框架，支持一次请求调用多个方法，支持自定义请求头、中间件、负载均衡策略，支持广播服务。","archived":false,"fork":false,"pushed_at":"2023-11-05T10:32:29.000Z","size":148,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-13T11:25:55.601Z","etag":null,"topics":["broadcast","client","go","gzip","messagepack","network","rpc","server","tcp"],"latest_commit_sha":null,"homepage":"https://gitee.com/dpwgc/comborpc","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/dpwgc.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":"2023-10-07T10:34:30.000Z","updated_at":"2023-11-05T10:31:30.000Z","dependencies_parsed_at":"2025-01-20T07:31:48.475Z","dependency_job_id":null,"html_url":"https://github.com/dpwgc/comborpc","commit_stats":null,"previous_names":["dpwgc/comborpc"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/dpwgc/comborpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fcomborpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fcomborpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fcomborpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fcomborpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dpwgc","download_url":"https://codeload.github.com/dpwgc/comborpc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpwgc%2Fcomborpc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276953811,"owners_count":25734617,"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","status":"online","status_checked_at":"2025-09-25T02:00:09.612Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["broadcast","client","go","gzip","messagepack","network","rpc","server","tcp"],"created_at":"2024-11-19T06:14:22.758Z","updated_at":"2025-09-25T16:47:37.930Z","avatar_url":"https://github.com/dpwgc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ComboRPC\n\n## 一个基于 TCP + MessagePack 的简易RPC框架\n\n### 特点\n\n* 支持单个请求调用多个方法\n* 使用MessagePack序列化消息，Gzip压缩消息\n* 支持自定义请求头\n* 支持自定义中间件\n* 支持自定义负载均衡\n* 支持广播调用\n\n# 开始使用\n\n***\n\n## 导入包\n\n### 运行以下Go命令来安装模块包\n\n```\n$ go get github.com/dpwgc/comborpc\n```\n\n### 在代码中引入模块包\n\n```\nimport \"github.com/dpwgc/comborpc\"\n```\n\n***\n\n## 服务端 - 简单示例\n\n### 启动一个服务路由：`example.go`\n\n```\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/dpwgc/comborpc\"\n)\n\n// 服务路由示例\nfunc main() {\n\n    // 新建路由，TCP服务端口设为8001\n    router := comborpc.NewRouter(comborpc.RouterOptions{\n        Endpoint:    \"0.0.0.0:8001\",\n    })\n\n    // 添加路由中间件（一般用于请求头权限信息统一校验）\n    router.AddMiddleware(testMiddleware)\n\n    // 添加路由方法（为指定路由设置处理方法）\n    router.AddMethod(\"testMethod\", testMethod)\n    // router.AddMethod(\"testMethod1\", testMethod1)\n    // router.AddMethod(\"testMethod2\", testMethod2)\n\n    // 启动路由\n    router.Run()\n}\n\n// 路由中间件（示例） \nfunc testMiddleware(ctx *comborpc.Context) {\n    \n    // 获取请求头中的token参数值\n    token := ctx.GetHeader(\"token\")\n    fmt.Println(\"token:\", token)\n    \n    // 执行下一个方法\n    ctx.Next()\n}\n\n// 路由方法（示例） \nfunc testMethod(ctx *comborpc.Context) {\n    \n    // 将请求数据绑定在request对象上\n    request := TestRequest{}\n    ctx.Bind(\u0026request)\n    \n    // 打印请求体\n    fmt.Println(\"A1:\", request.A1, \"A2:\", request.A2, \"A3:\", request.A3)\n    \n    // 设置响应数据\n    ctx.Write(TestResponse{\n        Code: 200,\n        Msg:  \"ok\",\n    })\n}\n\n// 请求体（示例）\ntype TestRequest struct {\n    A1 string\n    A2 int64\n    A3 float64\n}\n\n// 响应体（示例）\ntype TestResponse struct {\n    Code int\n    Msg  string\n}\n```\n\n### 运行`example.go`程序\n\n```\n$ go run example.go\n```\n\n### 当终端弹出如下日志时，说明路由已启动\n\n```\n2023/11/01 18:00:00 listen and serve on 0.0.0.0:8001\n```\n\n***\n\n## 服务端 - 更多设置及用法\n\n* `comborpc.RouterOptions`: 路由设置-结构体\n  * `Endpoint`: 服务端地址\n  * `QueueLen`: 连接队列长度\n  * `MaxGoroutine`: 最大协程数量\n  * `Timeout`: 服务端超时时间\n\n\n* `comborpc.Router`: 服务路由-结构体\n  * `AddMethod`: 添加路由方法\n  * `AddMiddleware`: 添加路由中间件\n  * `AddMiddlewares`: 添加多个路由中间件\n  * `Run`: 启动路由\n  * `Close`: 关闭路由\n\n\n* `comborpc.Context`: 路由方法上下文-结构体\n  * `Bind`: 将请求数据解析并绑定在指定结构体上\n  * `Write`: 设置响应体\n  * `GetHeader`: 根据key获取指定请求头参数\n  * `GetHeaders`: 获取全部请求头参数\n  * `RemoteAddr`: 客户端ip地址\n  * `LocalAddr`: 本地ip地址\n  * `CallMethod`: 当前被客户端调用的方法名\n  * `CustomCache`: 用户自定义的上下文缓存\n  * `Next`: 进入下一个方法（路由中间件相关）\n  * `Abort`: 中断执行链路并返回上层，不再继续执行下一个方法（路由中间件相关）\n\n***\n\n## 客户端 - 简单示例\n\n### 使用`comborpc.SingleCall`向`0.0.0.0:8001`服务端发起单一调用，一次请求只调用一个方法，返回一个`comborpc.Response`对象\n\n```\n// 单一请求示例\nfunc exampleSingleCall() {\n  \n  // 接收响应结果的结构体\n  responseBind := TestResponse{}\n\n  // 构建并发送请求，同时将响应结果绑定到responseBind对象上\n  comborpc.NewSingleCall(comborpc.CallOptions{\n      Endpoints: []string{\"0.0.0.0:8001\"},\n  }).SetRequest(\"testMethod\", TestRequest{\n      A1: \"hello world 3\",\n      A2: 1003,\n      A3: 54.1,\n  }).DoAndBind(\u0026responseBind)\n\n  // 打印响应结果\n  fmt.Println(\"single response:\", \"code:\", responseBind.Code, \"msg:\", responseBind.Msg)\n}\n```\n\n### 使用`comborpc.ComboCall`向`0.0.0.0:8001`服务端发起组合调用，一次请求同时调用两个方法，返回一个`comborpc.Response`数组\n\n```\n// 组合请求示例\nfunc exampleComboCall() {\n\n  // 构建并发送请求\n  responseList, _ := comborpc.NewComboCall(comborpc.CallOptions{\n      Endpoints: []string{\"0.0.0.0:8001\"},\n  }).AddRequest(\"testMethod1\", TestRequest{\n      A1: \"hello world 1\",\n      A2: 1001,\n      A3: 89.2,\n  }).AddRequest(\"testMethod2\", TestRequest{\n      A1: \"hello world 2\",\n      A2: 1002,\n      A3: 67.5,\n  }).Do()\n\t\n  // 遍历响应列表\n  for _, response := range responseList {\n  \n      // 将响应列表的每个子项数据绑定到responseBind对象上\n      responseBind := TestResponse{}\n      response.Bind(\u0026responseBind)\n\t\t\n      // 打印每个响应结果\n      fmt.Println(\"combo response item:\", \"code:\", responseBind.Code, \"msg:\", responseBind.Msg)\n  }\n}\n```\n\n### 自定义请求头 `Headers`\n\n#### 请求头是一个`map[string]string`类型对象\n\n* 通过`PutHeader`方法添加请求头参数\n* 通过`RemoveHeader`方法删除请求头参数\n\n```\ncall := comborpc.NewSingleCall(comborpc.CallOptions{\n    Endpoints: []string{\"0.0.0.0:8001\"},\n}).PutHeader(\"token\", \"12345678\").PutHeader(\"version\", \"v1.0\") // 添加请求头参数\n\ncall.RemoveHeader(\"version\") // 删除指定的请求头参数\n\n// 发送请求\ncall.SetRequest(\"testMethod\", TestRequest{\n    A1: \"hello world 3\",\n    A2: 1003,\n    A3: 54.1,\n}).Do()\n```\n\n### 自定义负载均衡器 `comborpc.LoadBalanceFunc`\n\n#### 客户端默认的负载均衡策略是随机负载均衡，当传入`Endpoints`数组长度为1时，直接向第一个服务地址发起请求。\n\n#### 自定义负载均衡方法编写（示例）\n```\n// 随机负载均衡处理方法\nfunc exampleLoadBalance(endpoints []string) string {\n    if len(endpoints) == 0 {\n        return \"\"\n    }\n    // 随机负载均衡策略\n    rand.Seed(time.Now().Unix())\n    return endpoints[rand.Intn(len(endpoints))]\n}\n```\n\n#### 在调用`NewComboCall`/`NewSingleCall`时设置自定义负载均衡方法\n\n```\ncomborpc.NewComboCall(comborpc.CallOptions{\n    Endpoints: []string{\"0.0.0.0:8001\", \"0.0.0.0:8002\", \"0.0.0.0:8003\"}, // 传入三个服务地址\n    LoadBalance: exampleLoadBalance, // 将默认的负载均衡方法替换为自定义负载均衡方法\n}).AddRequest(\"testMethod\", TestRequest{\n    A1: \"hello world\",\n    A2: 1002,\n    A3: 67.5,\n}).Do()\n```\n\n***\n\n## 客户端 - 更多设置及用法\n\n* `comborpc.CallOptions`: 调用参数-结构体\n  * `Endpoints`: 服务端地址列表\n  * `Timeout`: 客户端超时时间\n  * `LoadBalance`: 自定义负载均衡方法\n\n\n* `comborpc.ComboCall`: 组合调用-结构体\n  * `AddRequest`: 添加请求体\n  * `Do`: 执行请求\n  * `Broadcast`: 广播请求（给所有服务端地址发送请求）\n  * `PutHeader`: 设置请求头参数\n  * `RemoveHeader`: 删除请求头参数\n\n\n* `comborpc.SingleCall`: 单一调用-结构体\n  * `SetRequest`: 设置请求体\n  * `Do`: 执行请求\n  * `DoAndBind`: 执行请求，并将响应数据绑定到指定结构体上\n  * `Broadcast`: 广播请求（给所有服务端地址发送请求）\n  * `PutHeader`: 设置请求头参数\n  * `RemoveHeader`: 删除请求头参数\n\n\n* `comborpc.Response`: 响应-结构体\n  * `Bind`: 将响应数据解析并绑定在指定结构体上\n  * `Success`: 判断是否响应成功","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpwgc%2Fcomborpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdpwgc%2Fcomborpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpwgc%2Fcomborpc/lists"}