RPC-gRPC-Golang-环境搭建
创建项目并初始化
mkdir -p $GOPATH/src/grpctest/pb $GOPATH/src/grpctest/srv $GOPATH/src/grpctest/cli
cd $GOPATH/src/grpctest/ && go mod init grpctest
1.protobuf编辑
定义服务(Service)
如果想要将消息类型用在RPC(远程方法调用)系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根。如,想要定义一个RPC服务并具有一个方法,该方法能够接收 SearchRequest并返回一个SearchResponse,此时可以在.proto文件中进行如下定义:
service SearchService {
// rpc 服务的函数名 (传入参数)returns(返回参数)
rpc Search (SearchRequest) returns (SearchResponse);
}
最直观的使用protocol buffer的RPC系统是gRPC一个由谷歌开发的语言和平台中的开源的RPC系统,gRPC在使用protocl buffer时非常有效,如果使用特殊的protocol buffer插件可以直接从.proto文件中产生相关的RPC代码。
编辑protobuf文件
注意:注释不要写在和protobuf文件代码行同一行,可以在前一行或者后一行做注释,否则同行的注释使用grpc进行编译的时候会丢失!!!
cd $GOPATH/src/grpctest/pb && vim calculate.proto
内容如下:
// 声明版本
syntax = "proto3";
// 定义包名
package pb;
// 定义服务
service calculate{
// 创建服务接口
rpc get_sum(request)returns(response){}; // 我的注释
}
// 定义传入
message request{
int32 args = 1 ;
}
// 定义传出
message response{
int32 replay = 1;
}
编译protobuf文件
protoc --go_out=./ *.proto # 不加grpc插件的编译方法
protoc --go_out=plugins=grpc:./ *.proto # 添加grpc插件的编译方法
cd $GOPATH/src/grpctest/pb && protoc --go_out=plugins=grpc:./ *.proto && ls
2.服务器端
编辑server文件
cd $GOPATH/src/grpctest/srv && vim main.go
内容如下:
package main
import (
"context"
"grpctest/pb"
"log"
"net"
"google.golang.org/grpc"
)
// 1.结构体
type Calculate struct {
}
// 根据calculate.proto文件进行grpc编译生成的calculate.pb.go中的方法进行修改
/*
// CalculateServer is the server API for Calculate service.
type CalculateServer interface {
// 创建服务接口
GetSum(context.Context, *Request) (*Response, error)
}
// UnimplementedCalculateServer can be embedded to have forward compatible implementations.
type UnimplementedCalculateServer struct {
}
func (*UnimplementedCalculateServer) GetSum(context.Context, *Request) (*Response, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetSum not implemented")
}
*/
// 2.结构体方法
func (*Calculate) GetSum(ctx context.Context, request *pb.Request) (*pb.Response, error) {
return &pb.Response{
Replay: request.Args + 105,
}, nil
}
func main() {
// 3.创建网络连接
ln, err := net.Listen("tcp", "127.0.0.1:9999")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
// 4.创建GRPC句柄
srv := grpc.NewServer()
// 5.将GRPC句柄和结构体注册
pb.RegisterCalculateServer(srv, &Calculate{})
// 6.等待网络连接
if err := srv.Serve(ln); err != nil {
log.Fatal(err)
}
}
启动server服务
cd $GOPATH/src/grpctest/srv && go run main.go
扫描二维码关注公众号,回复:
11134836 查看本文章
3.客户端编码
编辑client文件
cd $GOPATH/src/grpctest/cli && vim main.go
内容如下:
package main
import (
"context"
"google.golang.org/grpc"
"grpctest/pb"
"log"
)
func main() {
// 1.连接服务端
conn, err := grpc.Dial("127.0.0.1:9999", grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 2.创建客户端句柄
cli := pb.NewCalculateClient(conn)
// 3.调用方法
response, err := cli.GetSum(context.Background(), &pb.Request{Args: 15})
if err != nil {
log.Fatal(err)
}
//4.打印结果
log.Println(response.Replay)
}
启动client服务
cd $GOPATH/src/grpctest/cli && go run main.go
client中传入15,服务端+ 105,即120
利用calculate.proto生成calculate.pb.go文件,其中会产生对应的GetSum的接口方法,在srv中对接口进行实现,cli中进行调用传参。