如何編寫 ProtoBuf 外掛 (三) ?

xinliang發表於2022-01-09

前言

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

推薦閱讀

本作品採用《CC 協議》,轉載必須註明作者和本文連結
日拱一卒

相關文章