3. go的grpc开发体验

注意:新版本的protoc和之前的3.14之前的版本的protoc插件有区别:
如果大家使用的是新版本的protoc参考:
https://grpc.io/docs/languages/go/quickstart/ 官方文档最权威,里面的安装都是最新的
如果大家使用的protoc3.14以及以前的版本 就可以参考下面的文档

1. 下载工具

protobuf项目地址

如果觉得下载较慢可以点击这里下载:
protoc-3.14.0-win64.zip
protoc-3.14.0-linux-x86_64.zip

注意:protoc的版本需要和golang/protobuf保持一致 (尽量自己去下载最新的版本)

下载完成后解压后记得将路径添加到环境变量中

2. 下载go的依赖包

  1. go get github.com/golang/protobuf/protoc-gen-go

如果是新版本protoc则需要安装下面两个

  1. go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
  2. go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1

注意:安装过程中会提示说go get会慢慢被弃用,不是错误只是提示,go的新版本依赖安装会慢慢弃用go get方式安装,以后一律采用 go install方式安装第三方依赖

3. proto文件

  1. syntax = "proto3";
  2. option go_package = ".;proto"; #新版本的protoc和protobuf这里应该写成 option go_package = "./;proto";
  3. service Greeter {
  4. rpc SayHello (HelloRequest) returns (HelloReply);
  5. }
  6. message HelloRequest {
  7. string name = 1;
  8. }
  9. message HelloReply {
  10. string message = 1;
  11. }

4. 生成go文件

goland插件地址: https://plugins.jetbrains.com/plugin/14004-protocol-buffer-editor/versions

  1. protoc -I . goods.proto --go_out=plugins=grpc:.
  2. #如果大家使用最新的protoc此处可能会报错说不支持这种用法,所以可以使用下面的语句生成:
  3. protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. goods.proto
  4. # 生 pb.go 文件
  5. protoc greet.proto --go_out=. --go-grpc_out=.

5. 服务端代码

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc"
  6. "grpc_demo/hello"
  7. "net"
  8. )
  9. type Server struct {
  10. hello.UnimplementedServerServer //新版生成的go源码强制要求这里默认集成默认生成的unimplemented代码,大家集成以下就行了,其他代码不用变
  11. }
  12. func (s *Server) SayHello(ctx context.Context,request *hello.HelloRequest)(*hello.HelloReply,error){
  13. return &hello.HelloReply{Message:"Hello "+request.Name},nil
  14. }
  15. func main() {
  16. g := grpc.NewServer()
  17. s := Server{}
  18. hello.RegisterGreeterServer(g,&s)
  19. lis, err := net.Listen("tcp", fmt.Sprintf(":8080"))
  20. if err != nil {
  21. panic("failed to listen: "+err.Error())
  22. }
  23. g.Serve(lis)
  24. }

6. 客户端

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "google.golang.org/grpc"
  6. "grpc_demo/proto"
  7. )
  8. func main() {
  9. conn,err := grpc.Dial("127.0.0.1:8080",grpc.WithInsecure())
  10. if err!=nil{
  11. panic(err)
  12. }
  13. defer conn.Close()
  14. c := hello.NewGreeterClient(conn)
  15. r,err := c.SayHello(context.Background(),&hello.HelloRequest{Name:"yeliangchen"})
  16. if err!=nil{
  17. panic(err)
  18. }
  19. fmt.Println(r.Message)
  20. }

*