GRPC的安装使用

  1. 阅读前先了解【protobuf的安装和使用】protobuf的安装使用_M_YBin的博客-CSDN博客protobuf的安装和使用:golang插件、编译、异常处理https://blog.csdn.net/u012455110/article/details/125290669
  2. 在golang中给.proto文件添加RPC服务(如下图),再次进行编译:
    protoc --go_out=./ *.proto
  3. 发现生产的go文件并没有什么变化,因为protoc编译器并不知道该如何为HelloService服务生成代码。
    //默认是proto2
    syntax = "proto3";
    
    option go_package="./;pd";
    package pd;
    
    //定义枚举类型
    enum Week {
        Monday = 0;//枚举值必须从0开始
        Turesday = 1;
    }
    //定义消息体
    message Student {
        int32 age = 1; //可以不从1开始,但是不能重复,不能使用19000-19999
        string name = 2;
        People p = 3;
        repeated int32 score = 4;//数组
        //枚举
        Week w = 5;
        //联合体
        oneof data {
            string teacher = 6;
            string class = 7;
        }
    }
    //嵌套消息体
    message People {
        int32 weight = 1;
    }
    //添加RPC服务
    service learn {
        rpc English(People) returns (Student);
    }
  4. 在protoc-gen-go内部集成了一个grpc的插件,我们可以针对grpc生成代码:
    protoc --go_out=plugins=grpc:. *.proto
  5. 在生成的代码中多了一些类似XXXServiceServer、XXXServiceClient的新类型(如下图)
  6. 到此,通过protoc编译生成的grpc服务已经完成,但是Golang并没有自带grpc库(自带rpc),需要我们进行安装才能正常使用。
  7. grpc环境安装
    1. 安装方法一:
      # 官方推荐,但是会出现访问超时,不能正常访问情况
      go get -u -v google.golang.org/grpc
    2. 安装方法二:
      git clone https://github.com/grpc/grpc-go.git      $GOPATH/src/google.golang.org/grpc
      git clone https://github.com/golang/net.git        $GOPATH/src/golang.org/x/net
      git clone https://github.com/golang/text.git       $GOPATH/src/golang.org/x/text
      go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
      git clone https://github.com/google/go-genproto.git  $GOPATH/src/google.golang.org/genproto
      
      cd $GOPATH/src/
      go install google.golang.org/grpc
  8. grpc的使用
    1. proto代码
      syntax = "proto3";
      option go_package="./;pd";
      package pd;
      message Child{
          string name = 1;
      }
      message Info{
          string content = 1;
      }
      //定义服务
      service SayService{
          rpc SayEnglish (Child)returns (Info);
      }
    2. server代码
      package main
      
      import (
      	"context"
      	"fmt"
      	"google.golang.org/grpc"
      	"microservices/pd"
      	"net"
      )
      type SayServiceServer struct {
      
      }
      func (this *SayServiceServer)SayEnglish(ctx context.Context, child *pd.Child) (*pd.Info, error){
      	reply := &pd.Info{
      		Content : child.Name + " Say:Hello World!",
      	}
      	return reply, nil
      }
      func main()  {
      	//获取grpc服务端对象
      	grpcServer := grpc.NewServer()
      	//注册grpc服务
      	pd.RegisterSayServiceServer(grpcServer, new(SayServiceServer))
      	//设置服务器监听
      	lis, err := net.Listen("tcp", "127.0.0.1:8800")
      	if err != nil {
      		fmt.Println("net.Listen:", err)
      	}
      	grpcServer.Serve(lis)
      }
      
    3. client代码

      package main
      
      import (
      	"context"
      	"fmt"
      	"google.golang.org/grpc"
      	"microservices/pd"
      )
      
      func main()  {
      	conn, err := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure())
      	if err != nil{
      		fmt.Println("grpc.Dial:", err)
      	}
      	defer conn.Close()
      	client := pd.NewSayServiceClient(conn)
      	reply, err := client.SayEnglish(context.Background(), &pd.Child{Name: "lisi"})
      	if err !=nil{
      		fmt.Println("client.SayEnglish:", reply)
      	}
      	fmt.Println("reply:", reply)
      }
    4. 执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M_YBin

你的鼓励是我的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值