做網(wǎng)站跳轉(zhuǎn)怎么收費網(wǎng)絡營銷軟件推廣
gone是可以高效開發(fā)Web服務的Golang依賴注入框架
github地址:https://github.com/gone-io/gone
文檔地址:https://goner.fun/zh/
文章目錄
- 使用gRPC通信
- 編寫proto文件,生成golang代碼
- 編寫服務端代碼
- 注冊客戶端
- 編寫配置文件
- 測試
- 總結(jié)
使用gRPC通信
首先創(chuàng)建一個grpc目錄,在這個目錄中初始化一個golang mod:
mkdir grpc
cd grpc
go mod init grpc
編寫proto文件,生成golang代碼
- 編寫協(xié)議文件
定義一個簡單的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
}// 重載協(xié)議中定義的服務
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
}// 實現(xiàn) gone_grpc.Service接口的RegisterGrpcServer方法,該方法在服務器啟動時會被自動調(diào)用
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"`
}// 實現(xiàn) gone_grpc.Client接口的Address方法,該方法在客戶端啟動時會被自動調(diào)用
// 該方法的作用是告訴客戶端gRPC服務的地址
func (c *helloClient) Address() string {return fmt.Sprintf("%s:%s", c.host, c.port)
}// 實現(xiàn) gone_grpc.Client接口的Stub方法,該方法在客戶端啟動時會被自動調(diào)用
// 在該方法中,完成 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{}) //注冊我們的實現(xiàn)的helloClientreturn nil}).Run(func(in struct {hello *helloClient `gone:"*"`// 在Run方法的參數(shù)中,注入 helloClient}) {// 調(diào)用Say方法,給服務段發(fā)送消息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
程序等待請求,屏幕打印內(nèi)容:
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
程序執(zhí)行完退出,屏幕打印內(nèi)容如下:
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
總結(jié)
在Gone中使用gRPC,需要完成以下幾步:
-
編寫服務端
- 編寫服務端Goner,匿名嵌入proto協(xié)議生成代碼的 默認實現(xiàn)
- 重載proto文件中定義的接口方法,編寫提供服務的具體業(yè)務邏輯
- 實現(xiàn)
gone_grpc.Service
接口的RegisterGrpcServer
方法,在該方法中完成服務注冊 - 將 服務端Goner 注冊到 Gone框架
- 啟動服務
-
編寫客戶端
- 編寫客戶端Goner,嵌入proto協(xié)議生成代碼的客戶端接口
- 實現(xiàn)
gone_grpc.Client
接口的Address
和Stub
方法,Address
方法返回服務端地址,Stub
初始化客服端接口 - 將 客戶端Goner 注冊到 Gone框架
- 啟動客戶端,調(diào)用客服端接口方法
本文的代碼開源在: https://github.com/gone-io/gone/tree/main/example/grpc