本文主要是介绍Gone框架介绍29 - 在Gone中使用gRPC通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/
文章目录
- 使用gRPC通信
- 编写proto文件,生成golang代码
- 编写服务端代码
- 注册客户端
- 编写配置文件
- 测试
- 总结
使用gRPC通信
首先创建一个grpc目录,在这个目录中初始化一个golang mod:
mkdir grpc
cd grpc
go mod init grpc
编写proto文件,生成golang代码
- 编写协议文件
定义一个简单的Hello服务,包含一个Say方法
文件名:proto/hello.proto
syntax = "proto3";option go_package="/proto";package Business;service Hello {rpc Say (SayRequest) returns (SayResponse);
}message SayResponse {string Message = 1;
}message SayRequest {string Name = 1;
}
- 生成golang代码
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/hello.proto
其中,protoc的安装参考Protocol Buffer 编译器安装
编写服务端代码
文件名:server/main.go
package mainimport ("context""github.com/gone-io/gone""github.com/gone-io/gone/goner""github.com/gone-io/gone/goner/cmux""google.golang.org/grpc""grpc/proto""log"
)type server struct {gone.Flagproto.UnimplementedHelloServer // 嵌入UnimplementedHelloServer
}// 重载协议中定义的服务
func (s *server) Say(ctx context.Context, in *proto.SayRequest) (*proto.SayResponse, error) {log.Printf("Received: %v", in.GetName())return &proto.SayResponse{Message: "Hello " + in.GetName()}, nil
}// 实现 gone_grpc.Service接口的RegisterGrpcServer方法,该方法在服务器启动时会被自动调用
func (s *server) RegisterGrpcServer(server *grpc.Server) {proto.RegisterHelloServer(server, s)
}func main() {gone.Prepare(func(cemetery gone.Cemetery) error {_ = cmux.Priest(cemetery) // 注册cmux,可以让gRPC服务 和 HTTP服务共享一个端口_ = goner.GrpcServerPriest(cemetery) // 注册gRPC服务器cemetery.Bury(&server{}) // 注册gRPC服务return nil}).// 启动服务Serve()
}
注册客户端
文件名:client/main.go
package mainimport ("context""fmt""github.com/gone-io/gone""github.com/gone-io/gone/goner""google.golang.org/grpc""grpc/proto""log"
)type helloClient struct {gone.Flagproto.HelloClient // 嵌入HelloClienthost string `gone:"config,server.host"`port string `gone:"config,server.port"`
}// 实现 gone_grpc.Client接口的Address方法,该方法在客户端启动时会被自动调用
// 该方法的作用是告诉客户端gRPC服务的地址
func (c *helloClient) Address() string {return fmt.Sprintf("%s:%s", c.host, c.port)
}// 实现 gone_grpc.Client接口的Stub方法,该方法在客户端启动时会被自动调用
// 在该方法中,完成 HelloClient的初始化
func (c *helloClient) Stub(conn *grpc.ClientConn) {c.HelloClient = proto.NewHelloClient(conn)
}func main() {gone.Prepare(func(cemetery gone.Cemetery) error {_ = goner.GrpcClientPriest(cemetery) // 注册gRPC客户端注册器Gonercemetery.Bury(&helloClient{}) //注册我们的实现的helloClientreturn nil}).Run(func(in struct {hello *helloClient `gone:"*"`// 在Run方法的参数中,注入 helloClient}) {// 调用Say方法,给服务段发送消息say, err := in.hello.Say(context.Background(), &proto.SayRequest{Name: "gone"})if err != nil {log.Printf("er:%v", err)return}log.Printf("say result: %s", say.Message)})
}
编写配置文件
文件名:config/default.properties
# 设置grpc服务的端口和host
server.port=9001
server.host=127.0.0.1# 设置客户端使用的grpc服务端口和host
server.grpc.port=${server.port}
server.grpc.host=${server.host}
测试
- 先运行服务端:
go run server/main.go
程序等待请求,屏幕打印内容:
2024-06-19 22:02:41.971|INFO|/Users/jim/works/gone-io/gone/goner/grpc/server.go:84||Register gRPC service *main.server
2024-06-19 22:02:41.971|INFO|/Users/jim/works/gone-io/gone/goner/grpc/server.go:88||gRPC server now listen at 127.0.0.1:9001
- 然后,另外开窗口启动客户端:
go run client/main.go
程序执行完退出,屏幕打印内容如下:
2024-06-19 22:06:20.713|INFO|/Users/jim/works/gone-io/gone/goner/grpc/client.go:59||register gRPC client *main.helloClient on address 127.0.0.1:90012024/06/19 22:06:20 say result: Hello gone
- 回到服务端窗口,可以看到服务器接收到请求,新打印一行日志:
2024/06/19 22:06:08 Received: gone
总结
在Gone中使用gRPC,需要完成以下几步:
-
编写服务端
- 编写服务端Goner,匿名嵌入proto协议生成代码的 默认实现
- 重载proto文件中定义的接口方法,编写提供服务的具体业务逻辑
- 实现
gone_grpc.Service
接口的RegisterGrpcServer
方法,在该方法中完成服务注册 - 将 服务端Goner 注册到 Gone框架
- 启动服务
-
编写客户端
- 编写客户端Goner,嵌入proto协议生成代码的客户端接口
- 实现
gone_grpc.Client
接口的Address
和Stub
方法,Address
方法返回服务端地址,Stub
初始化客服端接口 - 将 客户端Goner 注册到 Gone框架
- 启动客户端,调用客服端接口方法
本文的代码开源在: https://github.com/gone-io/gone/tree/main/example/grpc
这篇关于Gone框架介绍29 - 在Gone中使用gRPC通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!