今天我們要說明的是過濾器(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的連線時間,這樣就完成我們整個攔截器的實作了。