前言
上篇文章《Go - 如何編寫 ProtoBuf 外掛 (二) 》,分享了基於 自定義選項
定義了 interceptor
外掛,然後在 helloworld.proto
中使用了外掛,最後在 golang
程式碼中獲取到使用的外掛資訊。
接上篇,繼續分享。
既然獲取到了外掛資訊,我們就可以使用它們。本文主要分享在 grpc.ServerOption
中的 grpc.UnaryInterceptor
中使用。
演示程式碼
還是以上篇文章中 helloworld.proto
為例。
// 生成 helloworld.pb.go
// 生成 helloworld_grpc.pb.go
// 使用的 protoc --version 為 libprotoc 3.18.1
// 使用的 protoc-gen-go --version 為 protoc-gen-go v1.27.1
// 使用的 protoc-gen-go-grpc --version 為 protoc-gen-go-grpc 1.1.0
// 在根目錄下執行 protoc 命令
protoc --go_out=helloworld/gen --go-grpc_out=helloworld/gen helloworld/helloworld.proto
一、基於上篇文章中獲取 options
的程式碼進行修改,主要是將其存入到結構體即可。
// 演示程式碼,結構體
var handlers = &struct {
Methods map[string]*options.MethodHandler // FullMethod : Handler
Services map[string]*options.ServiceHandler // FullMethod : Handler
}{
Methods: make(map[string]*options.MethodHandler),
Services: make(map[string]*options.ServiceHandler),
}
二、在 grpc.NewServer
中使用攔截器。
// 演示程式碼
serverOptions := []grpc.ServerOption{
grpc.UnaryInterceptor(unaryServerInterceptor()),
}
srv := grpc.NewServer(serverOptions...)
resolveFileDescriptor() // 解析 options 擴充套件項
三、在 unaryServerInterceptor()
方法中,可以根據當前請求的服務名和方法名獲取到對應設定的 options
。
// 演示程式碼
fullMethod := strings.Split(info.FullMethod, "/")
serviceName := fullMethod[1]
// 獲取 service options
getServiceHandler(serviceName)
// 獲取 method options
getMethodHandler(info.FullMethod)
四、自己寫一個 grpcclient
呼叫一下即可。
--- /helloworld.Greeter/SayHello1 ---
service use interceptor authorization: login_token
method use interceptor whitelist: ip_whitelist
method use interceptor logger: true
至此,在 grpc.UnaryInterceptor
中就可以獲取到 options
了,其他演示程式碼我就不貼了。
最後,透過獲取到的 options
,便可以執行自己定義的具體方法。
小結
透過最近的 “如何編寫 ProtoBuf 外掛” 這三篇文章,相信你對編寫 ProtoBuf 外掛有一點小的認識,希望對你能夠有所幫助。
推薦閱讀
- Go - 如何編寫 ProtoBuf 外掛 (二) ?
- Go - 如何編寫 ProtoBuf 外掛 (一) ?
- Go - 關於 protoc 工具的小疑惑
- Go - 關於 .proto 檔案的小思考
- Go - 基於逃逸分析來提升程式效能
本作品採用《CC 協議》,轉載必須註明作者和本文連結