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中进行调用传参。

发布了76 篇原创文章 · 获赞 15 · 访问量 6206

猜你喜欢

转载自blog.csdn.net/weixin_42366378/article/details/105753542