gRPC以及gRPC在go语言当中的应用
Posted F3nGaoXS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gRPC以及gRPC在go语言当中的应用相关的知识,希望对你有一定的参考价值。
gRPC在go语言当中的应用,第一个gRPC应用
请确保在进行后续的步骤时,确保电脑中有protobuf
MacOS可以利用brew install protobuf
安装
1、创建新的go项目
项目名称:gitee.com/qingke.wu/hello-grpc/pb
go mod init gitee.com/qingke.wu/hello-grpc/pb
.
├── Makefile #常用的make命令,如go run,go test
├── client #客户端
├── go.mod
├── go.sum
├── pb #经protoc编译后的文件
├── proto #proto源文件
├── server #服务端
└── service #对pb中的实现的业务逻辑
2、安装依赖
安装gRPC需要的依赖
go get - u google.golang.org/grpc
3、安装插件
安装定制给go和gRPC的插件
go install github.com/golang/protobuf/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
4、编写proto文件并且编译
hello.proto:
syntax = "proto3"; //语法版本
option go_package = ".;hello"; //生成的go文件的包名
message HelloRequest
string name = 1;
message HelloResponse
string message = 1;
//一个 rpc 服务通过参数和返回类型来指定可以远程调用的方法
service Hello
// rpc 定义可远程调用服务
rpc HelloWorld (HelloRequest) returns (HelloResponse)
使用protoc生成可用于go和grpc的文件
protoc --proto_path=proto proto/*.proto --go_out=plugins=grpc:./pb
可以将它写进Makefile中
gen:
protoc --proto_path=proto proto/*.proto --go_out=plugins=grpc:./pb
5、对pb中的文件进行实现
这是位于hello.pb.go文件中的HelloServer接口,我们需要自己实现它。
// HelloServer is the server API for Hello service.
type HelloServer interface
// rpc 定义可远程调用服务
HelloWorld(context.Context, *HelloRequest) (*HelloResponse, error)
所以编写在service包下新建hello_service.go
package service
import (
"context"
pb "gitee.com/qingke.wu/hello-grpc/pb"
"log"
)
// HelloServer hello.proto中service hello的实现(即实现hello service)
type HelloServer struct
func NewHelloServer() *HelloServer
return &HelloServer
// HelloWorld 实现hello.proto中的中的service hello中定义的HelloWorld方法(必须同名)
func (s *HelloServer) HelloWorld(context context.Context, request *pb.HelloRequest) (*pb.HelloResponse, error)
// 通过getter来获取到request中的name
log.Printf("Received hello.name: %v", request.GetName())
// 对request作对应的处理
// 通过response返回给调用者
return &pb.HelloResponseMessage: "Hello!" + request.GetName(), nil
6、服务端
package main
import (
pb "gitee.com/qingke.wu/hello-grpc/pb"
"gitee.com/qingke.wu/hello-grpc/service"
"google.golang.org/grpc"
"log"
"net"
)
func main()
// grpc服务
grpcServer := grpc.NewServer()
// 利用hello.pb.go中的RegisterHelloServer()将service注册到grpc
pb.RegisterHelloServer(grpcServer, service.NewHelloServer())
// 启用net利用tcp来连接并且进行监听
listen, err := net.Listen("tcp", ":9001") // 指定端口号
if err != nil
log.Fatalf("failed to listen: %v", err)
// 开启服务
err = grpcServer.Serve(listen)
if err != nil
log.Fatalf("failed to serve: %v", err)
7、客户端
package main
import (
"context"
pb "gitee.com/qingke.wu/hello-grpc/pb"
"google.golang.org/grpc"
"log"
"time"
)
func main()
// 指定端口号连接到grpc服务
// WithInsecure()不指定安全选项
conn, err := grpc.Dial("localhost:9001", grpc.WithInsecure())
if err != nil
log.Fatalf("did not connect: %v", err)
// 延迟关闭连接
defer conn.Close()
// 利用hello.pb.go文件中的NewHelloClient()来获得client
client := pb.NewHelloClient(conn)
// 设置上下文超时时间
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 构建request1
request1 := &pb.HelloRequest
request1.Name = "World!"
// 利用request发起请求,并且得到response响应
// client不需要关心HelloWorld在服务端上的具体实现
// 只需要关心request和response即可
response, err := client.HelloWorld(ctx, request1)
if err != nil
log.Fatalf("could not succ: %v", err)
// 读取response
log.Printf("Receive from server: %s", response.Message)
启动服务端再启动客户端
服务端接受来自客户端的请求:
客户端收到来自服务端的响应:
**OK!**至此,一个简单的基于go的gRPC实现的演示项目已经完成!
总结
client和server通过共同协定好的proto约定来进行通信。
其中server需要对proto生成的proto.go对象的service进行实现,然后再将grpcServer与XxxPbServer进行注册。
其中client只需要关心proto.go对象的service中的rpc调用的request和response即可。
以上是关于gRPC以及gRPC在go语言当中的应用的主要内容,如果未能解决你的问题,请参考以下文章