Go - 如何編寫 ProtoBuf 插件 (三) ?

前言

上篇文章《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 插件有一點小的認識,希望對你能夠有所幫助。

推薦閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章