Runnable,当future完成时会被调用RpcContext_inner.rpcClientSend() 后执行的回调RpcContext_inner.startTrace(String) 后执行的回调<filter>
<filter-name>EagleEyeFilter</filter-name>
<filter-class>com.taobao.eagleeye.EagleEyeFilter</filter-class>
<init-param>
<param-name>useLocalIp</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EagleEyeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:filter-mapping 的设置,一定要保证它的顺序在其他 mapping 前面,
否则很可能被前面的 Filter 处理请求之后直接返回,导致一直没有埋点。RPCFilter时,会将下一步执行的InvocationHandler传递进来,如果不执行
invocationHandler.invoke(invocation);
则当前调用链就此终结
// * 可以通过{ com.taobao.hsf.util.concurrent.Futures#createSettableFuture()}
提供的方法构建ListenableFuture
RPCFilter.onResponse(Invocation, RPCResult)方法
EagleEye.endTrace(String, int)、EagleEye.rpcClientRecv(String, int)、
EagleEye.rpcServerSend(String, int) 设置的 resultCode 都会被忽略RPCFilter来将自己的逻辑植入到HSF的调用流程中
┌--------------------------------------------------------------------------------┐
| com.taobao.hsf.invocation.filter.RPCFilterBuilder$HeadNode |
└--------------------------------------------------------------------------------┘
| nextHandler.invoke(invocation); ^
v | onResponse(invocation, rpcResult)
┌--------------------------------------------------------------------------------┐
| com.taobao.hsf.invocation.filter.TestFilter1 |
└--------------------------------------------------------------------------------┘
| nextHandler.invoke(invocation); ^
v | onResponse(invocation, rpcResult)
┌--------------------------------------------------------------------------------┐
| com.taobao.hsf.invocation.filter.TestFilter2222222 |
└--------------------------------------------------------------------------------┘
| nextHandler.invoke(invocation); ^
v | onResponse(invocation, rpcResult)
┌--------------------------------------------------------------------------------┐
| com.taobao.hsf.invocation.filter.RPCFilterBuilder$TailNode |
└--------------------------------------------------------------------------------┘
| ^
v |
nextHandler.invoke(invocation); ------同步或者异步-------> future.set(rpcResult);
用户可以如下的方式扩展:
@Order(2)
public class TestFilter2222222 implements ServerFilter {
@Override
public ListenableFuture invoke(InvocationHandler invocationHandler, Invocation invocation)
throws Throwable {
System.out.println("Before TestFilter2 invoke");
System.out.println("TestFilter2 invoke...")@Scope(Option.PROTOTYPE),每次请求{ com.taobao.hsf.util.AppServiceContainer#getInstance(Class, String, String[])} 均会返回一个新的实例
如果未标注@Scope则等值于@Scope(Option.SINGLETON)
EagleEyeRequestTracer.endTrace(HttpServletRequest, HttpServletResponse)。Copyright © 2018. All rights reserved.