Go grpc案例

December 28, 2020

这篇文章介绍了如何在Go中使用gRPC。首先,它解释了如何在.proto文件中定义服务,并使用protocol buffer编译器生成客户端和服务端代码。然后,它详细介绍了如何安装gRPC包,设置环境变量,以及如何创建gRPC服务器和客户端。最后,它提供了一个完整的gRPC示例代码,并提供了代码的GitHub链接。

相关定义

  • .proto文件中定义一个服务。
  • 使用protocol buffer编译器生成客户端和服务端代码。
  • 使用gRPC的Go API为你的服务写一个客户端和服务器。

安装grpc包

go get google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go

设置环境变量

export PATH=$(go env GOPATH)/bin:$PATH

Server

目录结构

grpc-server/
├── go.mod
├── go.sum
├── grpc-server.iml
├── proto
│   ├── demo.pb.go
│   └── demo.proto
├── server.go
└── service
    └── get_data.go

定义proto文件

syntax = "proto3";

package proto;
option go_package = ".;proto";

service Demo {
  rpc GetData(DemoReq) returns (DemoRsp){}
}

message DemoReq {
  string a = 1; // 请求参数a
}

message DemoRsp{
  string rel = 1; // 返回参数值
}

生成pb.go文件

protoc --go_out=plugins=grpc,paths=source_relative:. *.proto

demo.pb.go文件生成

server.go

package main

import (
	"fmt"
	"google.golang.org/grpc"
	"grpc-server/proto"
	"grpc-server/service"
	"log"
	"net"
)

const grpcPort = 6655

func main() {
	l, err := net.Listen("tcp", fmt.Sprintf(":%d", grpcPort))
	if err != nil {
		log.Fatal(err)
	}

	g := grpc.NewServer()
    
    //注册server,使用service.go文件中的Demo方法
	proto.RegisterDemoServer(g, &service.Demo{})

	if err = g.Serve(l); err != nil {
		log.Fatal(err)
	}
}

service.go

package service

import (
	"context"
	"grpc-server/proto"
)

type Demo struct {
}

// 方法实现,直接把请求参数返回
func (c Demo) GetData(ctx context.Context, msg *proto.DemoReq) (*proto.DemoRsp, error) {
	params := msg.A
	return &proto.DemoRsp{
		Rel: params,
	}, nil
}

client

目录结构

grpc-client/
├── client.go
├── go.mod
├── go.sum
└── proto
    ├── demo.pb.go
    └── demo.proto

文件拷贝

Server服务生成的demo.pb.go文件拷贝到Client目录中。

client.go

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"grpc-client/proto"
)

const (
	grpcAddr = "127.0.0.1:6655"
)

func main()  {
	c, err := grpc.Dial(grpcAddr, grpc.WithInsecure())
	if err != nil {
		panic(c)
	}

    // 发送grpc请求  请求参数为123
	rsp, err := proto.NewDemoClient(c).
		GetData(context.Background(), &proto.DemoReq{
			A: "123",
	})

    // 打印返回的值
	fmt.Println(rsp)
}

代码地址

https://github.com/iarno/grpc-demo.git

Gogrpc

IARNO

服务端开发

Gin pprof性能分析

Golang 协程异步请求