在開發(fā)grpc服務(wù)時,我們經(jīng)常會遇到一些通用的需求,比如:日志、鏈路追蹤、鑒權(quán)等。這些需求可以通過grpc攔截器來實現(xiàn)。本文使用go語言來實現(xiàn)一個 grpc一元模式(Unary)攔截器,上報鏈路追蹤信息。
原始類型定義
我們可以在grpc的源碼包里(interceptor.go),找到一元模式攔截器的類型定義:
// UnaryServerInterceptor provides a hook to intercept the execution of a unary RPC on the server. info // contains all the information of this RPC the interceptor can operate on. And handler is the wrapper // of the service method implementation. It is the responsibility of the interceptor to invoke handler // to complete the RPC. type UnaryServerInterceptor func(ctx context.Context, req any, info *UnaryServerInfo, handler UnaryHandler) (resp any, err error)
從上面的定義可以看出,一元模式攔截器是一個函數(shù),接收四個參數(shù),返回兩個參數(shù)。下面我們來看一下這四個參數(shù)的含義:
ctx:上下文對象。
req:請求參數(shù)
info:包含了RPC的元信息,比如服務(wù)名、方法名等。
handler 實例的方法,用來調(diào)用實際的RPC方法。
我們只需要實現(xiàn)一個上述類型的函數(shù),在里面實現(xiàn)我們的功能,然后再執(zhí)行handler函數(shù),就可以實現(xiàn)一個攔截器了。
實現(xiàn)攔截器
我們新建一個項目grpcdemo。
服務(wù)定義
我們先在項目目錄下新建一個proto文件,定義一個服務(wù):
hello.proto
定義一個Makefile:
protos: protoc --proto_path=./ --go_out=pb --go-grpc_out=pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative ./*.proto tidy: go mod tidy run: go mod tidy go run main.go
執(zhí)行以下命令,生成go代碼:
make protos
代碼開發(fā)
第一步,新建一個tracing.go,初始化鏈路追蹤器:
tracing.go
第二步,在main.go文件中,添加相關(guān)代碼:
main.go
在上面的代碼中,我們啟動了一個grpc服務(wù),監(jiān)聽8091端口。在啟動grpc服務(wù)前,初始化了鏈路追蹤信息,然后在grpc服務(wù)中,使用了自定義的攔截器。在自定義攔截器中,我們上報了鏈路追蹤信息。
啟動jaeger服務(wù)
具體的啟動方式,可以參考官方文檔:www.jaegertracing.io/docs/1.26/g…
測試
我們使用goland的grpc插件,來測試一下:
# GRPC localhost:8091/pb.HelloService/Hello { "name": "ZhangSan" } # GRPC localhost:8091/pb.HelloService/HelloAgain { "name": "ZhangSan" }
測試結(jié)果:
我們再打開jaeger的UI,查看鏈路追蹤信息:
可以看到,我們的鏈路追蹤信息已經(jīng)上報到了jaeger服務(wù)。
審核編輯:湯梓紅
-
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29208 -
日志
+關(guān)注
關(guān)注
0文章
138瀏覽量
10642 -
go語言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9049
原文標(biāo)題:怎樣開發(fā)一個grpc攔截器
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論