【学习笔记】go-gRPC 初尝试

安装protoc

安装地址

找到对应版本的anz安装文件
【学习笔记】go-gRPC 初尝试_第1张图片

解压,将文件夹移动到goroot目录中,可以通过命令go env查看goroot目录。

如我的goroot目录为D:\Program Files\Go

【学习笔记】go-gRPC 初尝试_第2张图片

或者移动到自定义目录,并将该目录设置到环境变量中即可。

安装go插件

go本身并不支持protoc,要安装插件获得对应支持。

这里使用go mod 更新插件

在项目目录中

go mod init grpc_study
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

编辑proto文件

syntax="proto3"; //pb版本号
package raftRpc;  //pb包名
option go_package = "./pb"; // 如果编译出现找不到go_package问题,建议添加声明

service TestRpc {
  rpc Testecho (EchoRequest) returns (EchoResponse) {}
}

message EchoRequest {
  string message = 1;
}

message EchoResponse {
  string message = 1;
}

生成.go文件

使用如下命令进行编译
protoc --go_out=. --go-grpc_out=. .\test.proto

会看到执行编译目录下输出两个文件
【学习笔记】go-gRPC 初尝试_第3张图片

  • test.pb.go主要是对message生成对应的结构体和方法
  • test_grpc.pb.go生成gRPC,主要是对service生成对应的interface接口和方法

使用生成的文件编写服务

服务端

package main

import (
	"context"
	"grpc_study/pb"
	"log"
	"net"

	"google.golang.org/grpc"
)

type server struct {
	// 继承 protoc-gen-go-grpc 生成的服务端代码
	pb.UnimplementedTestRpcServer
}

// SimplePRC 服务端代码
func (s *server) Testecho(ctx context.Context, in *pb.EchoRequest) (*pb.EchoResponse, error) {
	log.Println("client call simpleRPC...")

	log.Println(in)
	return &pb.EchoResponse{Message: "hi! you say " + in.Message}, nil
}

func main() {
	// 监听本地 5678 端口
	listen, err := net.Listen("tcp", ":5678")
	if err != nil {
		log.Fatal(err)
		return
	}

	// 创建 gRPC 服务器
	s := grpc.NewServer()
	// 将实现的接口注册进 gRPC 服务器
	pb.RegisterTestRpcServer(s, &server{})
	log.Println("gRPC server starts running...")
	// 启动 gRPC 服务器
	err = s.Serve(listen)
	if err != nil {
		log.Fatal(err)
		return
	}
}

客户端

package main

import (
	"context"
	"grpc_study/pb"
	"log"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func Testecho(c pb.TestRpcClient) {
	ctx := context.Background()
	// 调用服务端 SimpleRPC 并获取响应
	reply, err := c.Testecho(ctx, &pb.EchoRequest{Message: "hello"})
	if err != nil {
		log.Fatal(err)
	}
	log.Println(reply.GetMessage())
}

func main() {
	// 连接服务端,因为我们没有SSL证书,因此这里需要禁用安全传输
	dial, err := grpc.Dial("127.0.0.1:5678", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
		return
	}
	defer dial.Close()

	conn := pb.NewTestRpcClient(dial)
	Testecho(conn)
}

运行结果

file

附件(有需要自取)

由于防盗链设置,请到原文下载原文连接

参考资料

CSDN : 【Golang | gRPC】使用protoc编译.proto文件
CSDN : gRPC 入门使用教程
CSDN : go导入自定义包

你可能感兴趣的:(GoLang,学习,golang,rpc)