1.實現一個Filter,注意要寫上注解。
import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.dubbo.common.extension.Activate; import com.alibaba.dubbo.rpc.Filter; import com.alibaba.dubbo.rpc.Invocation; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.Result; import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; @Activate public class DubboLogFilter implements Filter { protected final static Logger logger = LoggerFactory.getLogger(DubboLogFilter.class); @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { InvokeLog invokeLog = new InvokeLog(); //設置請求時間 invokeLog.setStartTime(new Date()); //設置請求報文 setRequest(invocation, invokeLog); //接口調用開始時間 Result result = null; try { result = invoker.invoke(invocation); if(result.hasException()) { //如果有異常 invokeLog.setFlag("failure"); invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException())); } else { //如果成功 if(result.getValue() != null){ String returnStr = JSON.toJSONString(result.getValue()); invokeLog.setResponseData(returnStr); } //TODO DUBBO接口如果無返回值暫未處理 } } catch (RuntimeException e) { invokeLog.setFlag("failure"); invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException())); } catch (Exception e) { invokeLog.setFlag("failure"); invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException())); } finally { //接口調用時長 invokeLog.setEndTime(new Date()); invokeLog.setResponseTime(invokeLog.getEndTime().getTime() - invokeLog.getStartTime().getTime()); //SpringHelper.getBean("invokeLogService", InvokeLogService.class).insert(invokeLog); } System.out.println(JSON.toJSONString(invokeLog)); return result; } /** * 設置接口調用參數 * */ protected void setRequest(Invocation invocation, InvokeLog invokeLog) { try { Object[] arguments = invocation.getArguments(); if (arguments != null && arguments.length > 0) { String requestStr = JSON.toJSONString(invocation.getArguments()); invokeLog.setRequestData(requestStr); } } catch (Exception e) { // 不能影響dubbo的接口運行 invokeLog.setRequestData(Throwables.getStackTraceAsString(e)); } } }
2.resources文件夾下新建目錄META-INF\dubbo,在該目錄下增加文件com.alibaba.dubbo.rpc.Filter,文件內容為:
dubboLogFilter=com.example.dubboTest.base.DubboLogFilter
3.在application.properties文件夾下增加配置spring.dubbo.provider.filter=dubboLogFilter
4.以上配置后,dubbo的Filter就會生效,當有消費者調用服務時,該Filter就會被觸發
dubbo的filter在微服務中應用場景比較多,如日志,追蹤,黑白名單等。
5.源碼地址: