做音频的网站,linux中怎么打开wordpress,做网站的需求分析,网店装修图gone是可以高效开发Web服务的Golang依赖注入框架 github地址#xff1a;https://github.com/gone-io/gone 文档地址#xff1a;https://goner.fun/zh/ 文章目录 使用gRPC通信编写proto文件#xff0c;生成golang代码编写服务端代码注册客户端编写配置文件测试总结 使用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-golatest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpclatest
protoc --go_out. --go_optpathssource_relative \
--go-grpc_out. --go-grpc_optpathssource_relative \
proto/hello.proto其中protoc的安装参考Protocol Buffer 编译器安装 编写服务端代码
文件名server/main.go
package mainimport (contextgithub.com/gone-io/gonegithub.com/gone-io/gone/gonergithub.com/gone-io/gone/goner/cmuxgoogle.golang.org/grpcgrpc/protolog
)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 (contextfmtgithub.com/gone-io/gonegithub.com/gone-io/gone/gonergoogle.golang.org/grpcgrpc/protolog
)type helloClient struct {gone.Flagproto.HelloClient // 嵌入HelloClienthost string gone:config,server.hostport 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.port9001
server.host127.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