在開發grpc服務時,我們經常會遇到一些通用的需求,比如:日志、鏈路追蹤、鑒權等。這些需求可以通過grpc攔截器來實現。本文使用go語言來實現一個 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)
從上面的定義可以看出,一元模式攔截器是一個函數,接收四個參數,返回兩個參數。下面我們來看一下這四個參數的含義:
ctx:上下文對象。
req:請求參數
info:包含了RPC的元信息,比如服務名、方法名等。
handler 實例的方法,用來調用實際的RPC方法。
我們只需要實現一個上述類型的函數,在里面實現我們的功能,然后再執行handler函數,就可以實現一個攔截器了。
實現攔截器
我們新建一個項目grpcdemo。
服務定義
我們先在項目目錄下新建一個proto文件,定義一個服務:
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
執行以下命令,生成go代碼:
make protos
代碼開發
第一步,新建一個tracing.go,初始化鏈路追蹤器:
tracing.go
第二步,在main.go文件中,添加相關代碼:
main.go
在上面的代碼中,我們啟動了一個grpc服務,監聽8091端口。在啟動grpc服務前,初始化了鏈路追蹤信息,然后在grpc服務中,使用了自定義的攔截器。在自定義攔截器中,我們上報了鏈路追蹤信息。
啟動jaeger服務
具體的啟動方式,可以參考官方文檔: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" }
測試結果:
我們再打開jaeger的UI,查看鏈路追蹤信息:
可以看到,我們的鏈路追蹤信息已經上報到了jaeger服務。
審核編輯:湯梓紅
-
源碼
+關注
關注
8文章
641瀏覽量
29208 -
日志
+關注
關注
0文章
138瀏覽量
10642 -
go語言
+關注
關注
1文章
158瀏覽量
9049
原文標題:怎樣開發一個grpc攔截器
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論