在spring boot框架下開發dubbo filter


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.源碼地址:

https://gitee.com/zhuyuehua/springboot2_dubbo.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM