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_out
:goctl 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客户端
-
- 创建
grpc-client
目录,在目录下,新建etc
目录和client.go
- 创建
-
- 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)
}
-
- client.yaml配置文件内容
Target: 127.0.0.1:8080
-
- 运行并进行测试
原生支持
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)
}