国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Dubbo自定義日志攔截器

meteor199 / 2432人閱讀

摘要:前言上一篇文章自定義注解統一記錄用戶行為日志記錄了層中通過自定義注解配合自動記錄用戶行為日志的過程。那么按照分布式架構中服務層的調用過程是否也可以實現統一記錄日志自定義日志攔截器可以實現這個需求。

前言

上一篇文章 Spring aop+自定義注解統一記錄用戶行為日志 記錄了 web層中通過自定義注解配合Spring aop自動記錄用戶行為日志的過程。那么按照分布式架構中Dubbo服務層的調用過程是否也可以實現統一記錄日志?自定義日志攔截器可以實現這個需求。

需求場景

在使用Dubbo搭建的分布式項目中,服務層代碼調用是這樣的:

     @GetMapping(value = "/info")
2    public BaseResult userInfo() {
3        //rpc遠程調用用戶服務
4        BaseResult result = mUserService.userInfo();
6        return result;
7    }

這里的用戶服務位于另外一個服務進程,由服務提供者暴露出來,讓web層遠程調用,需要記錄服務結果的調用過程,便于跟蹤定位bug.

自定義日志攔截器

翻看下Dubbo官方文檔,可以看到如下內容:

簡要說明:

Dubbo 中所有的攔截器全部繼承自org.apache.dubbo.rpc.Filter接口,我們自己也可以自行擴展,只要繼承該接口即可.

用戶自定義 filter 默認在內置 filter 之后執行

新增 DubboServiceFilter 攔截器如下:

public class DubboServiceFilter implements Filter {

    private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceFilter.class);

    @Override
    public Result invoke(Invoker invoker, Invocation invocation) throws RpcException {
        //外部日志開關默認關閉
        String logSwitch = StringUtils.equals(RedisUtil.get(BaseConstants.CACHE_SERVICE_LOG_SWITCH), BaseConstants.YES) ? BaseConstants.YES : BaseConstants.NO;
        if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
            //打印入參日志
            DubboServiceRequest serviceRequest = new DubboServiceRequest();
            serviceRequest.setInterfaceName(invocation.getInvoker().getInterface().getName());
            serviceRequest.setMethodName(invocation.getMethodName());
            serviceRequest.setArgs(invocation.getArguments());
            LOGGER.info("dubbo服務接口入參: " + JSON.toJSONString(serviceRequest));
        }
        //開始時間
        long startTime = System.currentTimeMillis();
        //執行接口調用邏輯
        Result result = invoker.invoke(invocation);
        //調用耗時
        long elapsed = System.currentTimeMillis() - startTime;
        //如果發生異常 則打印異常日志
        if (result.hasException() && invoker.getInterface() != GenericService.class) {
            LOGGER.error("dubbo執行異常: ", result.getException());
        } else {
            if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
                //打印響應日志
                DubboServiceResponse serviceResponse = new DubboServiceResponse();
                serviceResponse.setMethodName(invocation.getMethodName());
                serviceResponse.setInterfaceName(invocation.getInvoker().getInterface().getName());
                serviceResponse.setArgs(invocation.getArguments());
                serviceResponse.setResult(new Object[]{result.getValue()});
                serviceResponse.setSpendTime(elapsed);
                LOGGER.info("dubbo服務響應成功,返回數據: " + JSON.toJSONString(serviceResponse));
            }
        }
        //返回結果響應結果
        return result;
    }
}

代碼中對應的實體bean如下:

入參實體:

/**
 * @program: easywits
 * @description:Dubbo服務請求入參實體
 * @author: zhangshaolin
 * @create: 2019-01-08 20:35
 **/
@Data
public class DubboServiceRequest implements Serializable{
    private static final long serialVersionUID = 7127824956842786618L;

    /**
     * 接口名
     */
    private String interfaceName;

    /**
     * 方法名
     */
    private String methodName;

    /**
     * 參數
     */
    private Object[] args;
}

響應實體:

/**
 * @program: easywits
 * @description: Dubbo服務響應結果實體
 * @author: zhangshaolin
 * @create: 2019-01-08 20:36
 **/
@Data
public class DubboServiceResponse implements Serializable{
    private static final long serialVersionUID = -2531169660859647737L;

    /**
     * 接口名
     */
    private String interfaceName;

    /**
     * 方法名
     */
    private String methodName;

    /**
     * 參數
     */
    private Object[] args;

    /**
     * 返回結果
     */
    private Object result;

    /**
     * 調用耗時(毫秒)
     */
    private long spendTime;
}

/src/main/resources/META-INF/dubbo目錄下新增純文本文件org.apache.dubbo.rpc.Filter 內容為:

dubboServiceFilter=com.easywits.common.filter.DubboServiceFilter

鍵值對形式,鍵隨便起個名字

值為DubboServiceFilter攔截器的完整包名.

最后在服務提供者配置文件中添加配置使攔截器生效:




    
    

    
    

    
    
    
    ....省略部分服務配置
驗證結果

抓一下我們業務中的部分日志信息看下效果,如下圖:

可以清楚地看到Dubbo服務接口調用的請求參數信息,以及最終的響應結果信息,便于定位線上問題。

參考文檔:http://dubbo.apache.org/zh-cn/docs/dev/impls/filter.html

最后

記錄一個比較簡單的具體實用場景,后續會不定期更新更多的實用場景,歡迎關注公眾號【張少林同學】!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72894.html

相關文章

  • Dubbo 定義異常,你是怎么處理的?

    摘要:前言記錄對于自定義異常的處理方式實現目標服務層異常,直接向上層拋出,層統一捕獲處理如果是系統自定義異常,則返回其中對應為錯誤碼,對應為異常信息如果非系統自定義異常,返回未知錯誤,同時將異常堆棧信息輸出到日志便于定位問題項目架構先來張系統架 showImg(https://segmentfault.com/img/remote/1460000017782781?w=768&h=506);...

    dingding199389 評論0 收藏0
  • 馬蜂窩大交通業務監控報警系統架構設計與實現

    摘要:為了讓大交通下的各業務線都能夠通過報警盡早發現問題解決問題,進而提升業務系統的服務質量,我們決定構建統一的監控報警系統。本文主要介紹馬蜂窩大交通業務監控報警系統的定位整體架構設計,以及我們在落地實踐過程中的一些踩坑經驗。 部門的業務線越來越多,任何一個線上運行的應用,都可能因為各種各樣的原因出現問題:比如業務層面,訂單量比上周減少了,流量突然下降了;技術層面的問題,系統出現 ERROR...

    smartlion 評論0 收藏0
  • dubbo源碼解析(四十六)消費端發送請求過程

    摘要:可以參考源碼解析二十四遠程調用協議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠程通信層的四。二十的可以參考源碼解析十七遠程通信的一。 2.7大揭秘——消費端發送請求過程 目標:從源碼的角度分析一個服務方法調用經歷怎么樣的磨難以后到達服務端。 前言 前一篇文章講到的是引用服務的過程,引用服務無非就是創建出一個代理。供消費者調用服務的相關方法。...

    fish 評論0 收藏0
  • 聊聊Dubbo - Dubbo可擴展機制實戰

    摘要:今天我想聊聊的另一個很棒的特性就是它的可擴展性。的擴展機制在的官網上,描述自己是一個高性能的框架。接下來的章節中我們會慢慢揭開擴展機制的神秘面紗。擴展擴展點的實現類。的定義在配置文件中可以看到文件中定義了個的擴展實現。 摘要: 在Dubbo的官網上,Dubbo描述自己是一個高性能的RPC框架。今天我想聊聊Dubbo的另一個很棒的特性, 就是它的可擴展性。 Dubbo的擴展機制 在Dub...

    techstay 評論0 收藏0
  • 聊聊Dubbo - Dubbo可擴展機制源碼解析

    摘要:什么是類那什么樣類的才是擴展機制中的類呢類是一個有復制構造函數的類,也是典型的裝飾者模式。代碼如下有一個參數是的復制構造函數有一個構造函數,參數是擴展點,所以它是一個擴展機制中的類。 摘要:?在Dubbo可擴展機制實戰中,我們了解了Dubbo擴展機制的一些概念,初探了Dubbo中LoadBalance的實現,并自己實現了一個LoadBalance。是不是覺得Dubbo的擴展機制很不錯呀...

    lmxdawn 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<