{"id":20716739,"url":"https://github.com/ozeer/grpc-server","last_synced_at":"2026-04-20T12:33:35.378Z","repository":{"id":188609432,"uuid":"678779151","full_name":"ozeer/grpc-server","owner":"ozeer","description":"gRPC go server demo","archived":false,"fork":false,"pushed_at":"2023-08-16T06:17:26.000Z","size":6503,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-17T22:12:05.092Z","etag":null,"topics":["grpc","grpc-go","grpc-server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ozeer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-08-15T11:04:03.000Z","updated_at":"2023-08-15T11:05:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"f88db98b-9263-431c-836e-34e615e9b83c","html_url":"https://github.com/ozeer/grpc-server","commit_stats":null,"previous_names":["ozeer/grpc-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozeer%2Fgrpc-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozeer%2Fgrpc-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozeer%2Fgrpc-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ozeer%2Fgrpc-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ozeer","download_url":"https://codeload.github.com/ozeer/grpc-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242989432,"owners_count":20217789,"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":["grpc","grpc-go","grpc-server"],"created_at":"2024-11-17T03:06:40.370Z","updated_at":"2026-04-20T12:33:30.351Z","avatar_url":"https://github.com/ozeer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 一、安装gRPC\n1、安装Go的gRPC库，在项目根目录执行以下命令\n```\ngo get google.golang.org/grpc@latest\n```\n\n2、安装Protocol Buffers v3\n下载地址\n```\nhttps://github.com/google/protobuf/releases\n```\n\n3、因为我们服务端是Go语言开发，所以我们执行以下命令安装protoc的Go插件\n安装Go语言插件：\n```\ngo install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0\n```\n该插件会根据.proto文件生成一个后缀为.pb.go的文件，包含所有.proto文件中定义的类型及其序列化方法。\n\n安装grpc插件（）：\n```\ngo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0\n```\n该插件会生成一个后缀为_grpc.pb.go的文件，其中包含：\n- 一种接口类型(或存根) ，供客户端调用的服务方法。\n- 服务器要实现的接口类型。\n\n上述命令会默认将插件安装到$GOPATH/bin，为了protoc编译器能找到这些插件，请确保你的$GOPATH/bin在环境变量中。\n\n4、检查上述插件安装是否成功\n确认 protoc 安装完成。\n```\n❯ protoc --version\nlibprotoc 3.20.1\n````\n确认 protoc-gen-go 安装完成。\n\n```\n❯ protoc-gen-go --version\nprotoc-gen-go v1.28.0\n```\n如果这里提示protoc-gen-go不是可执行的程序，请确保你的 GOPATH 下的 bin 目录在你电脑的环境变量中。\n\n确认 protoc-gen-go-grpc 安装完成。\n\n```\n❯ protoc-gen-go-grpc --version\nprotoc-gen-go-grpc 1.2.0\n```\n\n## 二、开始gRPC开发（以Go语言为例）\n1、编写hello.proto文件，例如，下面使用 protocol buffers 定义了一个HelloService服务。\n```\n// 版本声明，使用Protocol Buffers v3版本\nsyntax = \"proto3\";\n\n// 指定生成的Go代码在你项目中的导入路径\noption go_package = \"server/pb\";\n\n// 包名\npackage pb;\n\n// 定义服务\nservice Greeter {\n    // SayHello 方法\n    rpc SayHello (HelloRequest) returns (HelloResponse) {}\n}\n\n// 请求消息\nmessage HelloRequest {\n    string name = 1;\n}\n\n// 响应消息\nmessage HelloResponse {\n    string reply = 1;\n}\n\n```\n\n2、在Server端和Client端生成指定语言的代码（此处我们生成Go语言的gRPC代码），在.proto文件的目录下执行以下命令\n\n```\nprotoc --go_out=. hello.proto\nprotoc --go-grpc_out=. hello.proto\n```\n\n3、编写各端业务逻辑代码\n剩下的工作就是要编写业务逻辑代码。在服务端编写业务代码实现具体的服务方法，在客户端按需调用这些方法。\n\n## 三、gRPC服务方法类型说明\n\n在gRPC中你可以定义四种类型的服务方法。\n\n- 普通 rpc，客户端向服务器发送一个请求，然后得到一个响应，就像普通的函数调用一样。\n```\nrpc SayHello(HelloRequest) returns (HelloResponse);\n```\n- 服务器流式 rpc，其中客户端向服务器发送请求，并获得一个流来读取一系列消息。客户端从返回的流中读取，直到没有更多的消息。gRPC 保证在单个 RPC 调用中的消息是有序的。\n```\nrpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);\n```\n- 客户端流式 rpc，其中客户端写入一系列消息并将其发送到服务器，同样使用提供的流。一旦客户端完成了消息的写入，它就等待服务器读取消息并返回响应。同样，gRPC 保证在单个 RPC 调用中对消息进行排序。\n```\nrpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);\n```\n- 双向流式 rpc，其中双方使用读写流发送一系列消息。这两个流独立运行，因此客户端和服务器可以按照自己喜欢的顺序读写: 例如，服务器可以等待接收所有客户端消息后再写响应，或者可以交替读取消息然后写入消息，或者其他读写组合。每个流中的消息是有序的。\n\n## 四、普通rpc\n\n## 五、流式rpc\n### 1、服务端流式RPC\n\n### 2、客户端流式RPC\n\n### 3、双向流式RPC\n\n## 六、metadata\n\n## 七、错误处理\n\n## 八、加密或认证\n\n## 九、拦截器（中间件）\n\n## 十、开发过程中的一些常见问题及解决方案\n\n## 十一、引用\n- https://www.liwenzhou.com/posts/Go/gRPC/\n- https://protobuf.dev/programming-guides/proto3 （proto文件语法）\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozeer%2Fgrpc-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fozeer%2Fgrpc-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fozeer%2Fgrpc-server/lists"}