iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
自我挑戰組

gRPC通訊框架認識與實作系列 第 12

gRPC通訊框架認識與實作【Day 12】

  • 分享至 

  • xImage
  •  

今天我們要說明的是過濾器(Interceptor),可以用來記錄一些傳遞時的資訊,例如log或者是連線狀態跟時間等。那我們就開始吧!

Interceptor可以放在server端也可以放在client端,端看自己的需求,我們會以放在client端的實作方式為主。
首先在.com底下新增一個資料夾Interceptor用來放置我們的Interceptor檔案,然後我們新增一個gRPCInterceptor的檔案,這個method要implements的是ClientInterceptor這個interface,
所以我們就先implements,然後要override的method是interceptCall這個method:

public class gRPCInterceptor implements ClientInterceptor {
    @Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
        return null;
    }
   }

我們要設計出一個觀察連線時間的紀錄,因此我們先設定一個開始的時間,再新增一個監聽對象:

//起始時間
long beginTime = System.currentTimeMillis();

//監聽的對象
ClientCall<ReqT, RespT> listener = next.newCall(method, callOptions);

接著在return後面直接new一個我們建立的method,

//將要監聽的對象放在method中
return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(listener) {
    //更下層要監聽的對象
    @Override
    public void start(Listener<RespT> responseListener, Metadata headers) {
        super.start(
            new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) {
                @Override
                public void onClose(Status status, Metadata trailers) {
                    long connectionCloseTime = System.currentTimeMillis() - beginTime;
                    System.out.println("連線時間為: " + connectionCloseTime + " ms");
                    super.onClose(status, trailers);
                }
            }, headers);
    }
};

記得要把我們一開始設定的listener放入method中,而在這個start的method中,要在往下監聽一個onClose的method,這個method才是監測我們連線結束的method,不要忘記要將start的監聽對象放到close中,最後在close中顯示出我們要看到的連線時間。這樣我們的interceptor就設計好了。
最後我們要將這個interceptor掛在client上,所以我們回到client01,在通訊管道建立的地方加上interceptor:

ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host,port).
        intercept(new gRPCInterceptor()). //攔截器
        usePlaintext().build();

我們測試一下攔截器,可以看到攔截器紀錄整個channel的連線時間,這樣就完成我們整個攔截器的實作了。
https://ithelp.ithome.com.tw/upload/images/20230917/20147417m6bB4snsOc.jpg


上一篇
gRPC通訊框架認識與實作【Day 11】
下一篇
gRPC通訊框架認識與實作【Day 13】
系列文
gRPC通訊框架認識與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言