亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Dubbo自定義日志攔截器

meteor199 / 2494人閱讀

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

前言

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

需求場景

在使用Dubbo搭建的分布式項目中,服務(wù)層代碼調(diào)用是這樣的:

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

這里的用戶服務(wù)位于另外一個服務(wù)進程,由服務(wù)提供者暴露出來,讓web層遠(yuǎn)程調(diào)用,需要記錄服務(wù)結(jié)果的調(diào)用過程,便于跟蹤定位bug.

自定義日志攔截器

翻看下Dubbo官方文檔,可以看到如下內(nèi)容:

簡要說明:

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

用戶自定義 filter 默認(rèn)在內(nèi)置 filter 之后執(zhí)行

新增 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 {
        //外部日志開關(guān)默認(rèn)關(guān)閉
        String logSwitch = StringUtils.equals(RedisUtil.get(BaseConstants.CACHE_SERVICE_LOG_SWITCH), BaseConstants.YES) ? BaseConstants.YES : BaseConstants.NO;
        if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
            //打印入?yún)⑷罩?            DubboServiceRequest serviceRequest = new DubboServiceRequest();
            serviceRequest.setInterfaceName(invocation.getInvoker().getInterface().getName());
            serviceRequest.setMethodName(invocation.getMethodName());
            serviceRequest.setArgs(invocation.getArguments());
            LOGGER.info("dubbo服務(wù)接口入?yún)? " + JSON.toJSONString(serviceRequest));
        }
        //開始時間
        long startTime = System.currentTimeMillis();
        //執(zhí)行接口調(diào)用邏輯
        Result result = invoker.invoke(invocation);
        //調(diào)用耗時
        long elapsed = System.currentTimeMillis() - startTime;
        //如果發(fā)生異常 則打印異常日志
        if (result.hasException() && invoker.getInterface() != GenericService.class) {
            LOGGER.error("dubbo執(zhí)行異常: ", result.getException());
        } else {
            if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
                //打印響應(yīng)日志
                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服務(wù)響應(yīng)成功,返回數(shù)據(jù): " + JSON.toJSONString(serviceResponse));
            }
        }
        //返回結(jié)果響應(yīng)結(jié)果
        return result;
    }
}

代碼中對應(yīng)的實體bean如下:

入?yún)嶓w:

/**
 * @program: easywits
 * @description:Dubbo服務(wù)請求入?yún)嶓w
 * @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;

    /**
     * 參數(shù)
     */
    private Object[] args;
}

響應(yīng)實體:

/**
 * @program: easywits
 * @description: Dubbo服務(wù)響應(yīng)結(jié)果實體
 * @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;

    /**
     * 參數(shù)
     */
    private Object[] args;

    /**
     * 返回結(jié)果
     */
    private Object result;

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

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

dubboServiceFilter=com.easywits.common.filter.DubboServiceFilter

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

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

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




    
    

    
    

    
    
    
    ....省略部分服務(wù)配置
驗證結(jié)果

抓一下我們業(yè)務(wù)中的部分日志信息看下效果,如下圖:

可以清楚地看到Dubbo服務(wù)接口調(diào)用的請求參數(shù)信息,以及最終的響應(yīng)結(jié)果信息,便于定位線上問題。

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

最后

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72894.html

相關(guān)文章

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

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

    dingding199389 評論0 收藏0
  • 馬蜂窩大交通業(yè)務(wù)監(jiān)控報警系統(tǒng)架構(gòu)設(shè)計與實現(xiàn)

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

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

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

    fish 評論0 收藏0
  • 聊聊Dubbo - Dubbo可擴展機制實戰(zhàn)

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

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

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

    lmxdawn 評論0 收藏0

發(fā)表評論

0條評論

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