http://www.topgoer.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1/gRPC/

安装

go get github.com/golang/protobuf/proto
go get google.golang.org/grpc(无法使用,用如下命令代替)
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

protobuf安装

go get github.com/golang/protobuf/protoc-gen-go
上面安装好后,会在GOPATH/bin下生成protoc-gen-go.exe
但还需要一个protoc.exe,windows平台编译受限,很难自己手动编译,直接去网站下载一个,地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0 ,同样放在GOPATH/bin下

proto3语法官网

https://developers.google.com/protocol-buffers/docs/proto3

proto3语法生成文件

proto文件:option go_package = "../services";

protoc --go_out=plugins=grpc:../services Prod.proto

小案例

服务端

结构

grpc,protobuf安装,脚手架

pbfiles/Prod.proto文件

syntax = "proto3"; // 指定proto版本
package services;     // 指定默认包名

// 指定golang包名路径
option go_package = "../services";

// HelloRequest 请求结构
message ProdRequest {
  int32 prod_id = 1;
}

// HelloResponse 响应结构
message ProdResponse {
  string message = 1;
}

service ProdService {
  rpc GetProdStock(ProdRequest) returns(ProdResponse);
}

生成services/Prod.pb.go文件

在Prod.proto同级目录中
protoc --go_out=plugins=grpc:../services Prod.proto

services/ProdService.go自定义响应方法文件

package services

import (
	"context"
)

type ProdService struct {

}

func(this *ProdService) GetProdStock(ctx context.Context, in *ProdRequest) (*ProdResponse, error) {
	return &ProdResponse{Message:"jeff"},nil
}

server.go服务端启动文件

package main

import (
	"google.golang.org/grpc"
	"net"
	"rpc_server/services"
)

func main()  {
	rpcServer:=grpc.NewServer()
	services.RegisterProdServiceServer(rpcServer,new(services.ProdService))


	lis,_:=net.Listen("tcp",":8081")

	rpcServer.Serve(lis)
}

客户端

结构

grpc,protobuf安装,脚手架

复制Prod.pb.go文件

mian.go 客户端启动文件

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"rpc_client/services"
)

func main()  {
	conn,err:=grpc.Dial(":8081",grpc.WithInsecure())
	if err!=nil{
		fmt.Println(err)
	}
	defer conn.Close()

	prodClient:=services.NewProdServiceClient(conn)
	prodRes,err:= prodClient.GetProdStock(context.Background(),&services.ProdRequest{ProdId: 12})
	if err!=nil{
		fmt.Println(err)
	}
	fmt.Println(prodRes.Message)
}

相关文章: