KING 博主等级

一帆风顺 ⛵️⛵️⛵️

Go

go-zero grpc项目创建

钟晓川
2024-10-16 / 0 点赞 / 32 阅读

gRPC服务端

1. 生成proto文件

goctl rpc -o greet.proto
// 语法版本
syntax = "proto3"
// 包定义,对go无效
package greet;
// 生成go文件的包名
option go_package="./greet";
// 消息体,需要传输的数据结构
message Request {
  string ping = 1;
}
// 消息体,需要传输的数据结构
message Response {
  string pong = 1;
}
service Greet {
  rpc Ping(Request) returns(Response);
}

2. 生成grpc服务端

goctl rpc protoc greet.proto --go_out=./grpc-server --go-grpc_out=./grpc-server --zrpc_out=./grpc-server
  • go_out:proto生成的go代码所在的目录,proto本身的命令参数
  • go-grpc_out:proto生成的grpc代码所在的目录,proto本身的命令参数和go_out必须同一目录
  • zrpc_outgoctl rpc自带的命令,go-zero生成的代码所在的目录

3. 拉取依赖

cd grpc-server
gp mod tidy

4. 编写代码逻辑

func (l *PingLogic) Ping(in *greet.Request) (*greet.Response, error) {
  // todo
  return &greet.Response{
    Pong: "pong
  }, nil
}

5. 修改配置文件,去掉etcd配置,采用直连模式

Name: greet.rpc
ListenOn: 0.0.0.0:8080
#Etcd:
#  Hosts:
#    - 127.0.0.1:2379
#  Key: greet.rpc

6. 启动

go run main.go

观察生成的代码

s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
  // 向rpc注册服务
  greet.RegisterGreetServer(grpcServer, server.NewGreetServer(ctx))
  
  if c.Mode ==service.DevMode || c.Mode == service.TestMode {
    // 注册反射服务,在gRPC中,反射是一种机制,允许客户端在不知道服务定义(即.proto文件)的情况下查询服务端上的gRPC服务信息
    reflection.Register(grpcServer)
  }
})
defer s.Stop()

上述代码注册了反射服务, 可以使用grpcurl来进行测试

https://github.com/fullstorydev/grpcurl/releases下载

下载完成后,配置环境变量或者放在GOPATH的bin目录下即可

grpcurl --version

注意在项目配置文件中,一定要把开发模式设置为dev或者test模式,grpcurl才可用

Name: greet.rpc
ListenOn: 0.0.0.0:8080
Model: dev # 开发模式,用于发射服务可用

获取grpc服务列表,--plaintext选项代表使用http连接

grpcurl -plaintext localhost:8080 list
greet.Greet
grpc.health.v1.Health
grpc.reflection.v1.ServerReflection
grpc.reflection.v1alpha.ServerReflection

获取grpc服务的方法

grpcurl -plaintext localhost:8080 list greet.Greet
greet.Greet.Ping

获取服务细节,或者方法细节

grpcurl -plaintext localhost:8080 describe
greet.Greet is a service:
service Greet {
  rpc Ping(.greet.Request) returns (.greet.Response);
}

grpcurl -plaintext localhost:8080 describe greet.Greet
greet.Greet is a service:
service Greet {
  rpc Ping(.greet.Request) returns (.greet.Response);
}

获取类型

grpcurl -plaintext locahost:8080 describe greet.Request
greet.Request is a message:
message Request {
  string ping = 1;
}

调用方法

grpcurl -d {\"ping\":\"ping\"} -plaintext localhost:8080 greet.Greet/Ping

# 或者使用 -d @ 这种是流式输入,Windows用先回车,crtl+z 结束输入,其他一般用 先回车 Ctrl+d结束输入
grpcurl -d @ -plaintext localhost:8080 greet.Greet/Ping
{"ping":"ping"}

gRPC客户端

    1. 创建grpc-client目录,在目录下,新建etc目录和client.go
    1. client.go内容
func main() {
  var clientConf zrpc.RpcClientConf
  conf.MustLoad("grpc-client/etc/client.yaml", &clientConf)
  conn := zrpc.MustNewClient(clientConf)
  client := greet.NewGreetClient(conn.Conn())
  resp, err := client.Ping(context.Background(), &greet.Request{Ping: "ping})
  if err != nil {
    log.Fatal(err)
    return
  }
  log.Println(resp)
}
    1. client.yaml配置文件内容
Target: 127.0.0.1:8080
    1. 运行并进行测试

原生支持

func main() {
  var clientConf zrpc.RpcClientConf
  conf.MustLoad("grpc-client/etc/client.yaml", &clientConf)
  conn, err := grpc.NewClient("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
  if err != nil {
    log.Fatal(err)
    return
  }
  client := greet.NewGreetClient(conn)
  resp, err := client.Ping(context.Background(), &greet.Request{Ping: "ping"})
  if err != nil {
    log.Fatal(err)
    return
  }
  log.Println(resp)
}
0
Go