成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Dubbo自定義日志攔截器

meteor199 / 2454人閱讀

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

前言

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

需求場(chǎng)景

在使用Dubbo搭建的分布式項(xiàng)目中,服務(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ù)位于另外一個(gè)服務(wù)進(jìn)程,由服務(wù)提供者暴露出來(lái),讓web層遠(yuǎn)程調(diào)用,需要記錄服務(wù)結(jié)果的調(diào)用過程,便于跟蹤定位bug.

自定義日志攔截器

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

簡(jiǎn)要說明:

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

用戶自定義 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));
        }
        //開始時(shí)間
        long startTime = System.currentTimeMillis();
        //執(zhí)行接口調(diào)用邏輯
        Result result = invoker.invoke(invocation);
        //調(diào)用耗時(shí)
        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)成功,返回?cái)?shù)據(jù): " + JSON.toJSONString(serviceResponse));
            }
        }
        //返回結(jié)果響應(yīng)結(jié)果
        return result;
    }
}

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

入?yún)?shí)體:

/**
 * @program: easywits
 * @description:Dubbo服務(wù)請(qǐng)求入?yún)?shí)體
 * @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)實(shí)體:

/**
 * @program: easywits
 * @description: Dubbo服務(wù)響應(yīng)結(jié)果實(shí)體
 * @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)用耗時(shí)(毫秒)
     */
    private long spendTime;
}

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

dubboServiceFilter=com.easywits.common.filter.DubboServiceFilter

鍵值對(duì)形式,鍵隨便起個(gè)名字

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

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




    
    

    
    

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

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

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

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

最后

記錄一個(gè)比較簡(jiǎn)單的具體實(shí)用場(chǎng)景,后續(xù)會(huì)不定期更新更多的實(shí)用場(chǎng)景,歡迎關(guān)注公眾號(hào)【張少林同學(xué)】!

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72894.html

相關(guān)文章

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

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

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

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

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

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

    fish 評(píng)論0 收藏0
  • 聊聊Dubbo - Dubbo可擴(kuò)展機(jī)制實(shí)戰(zhàn)

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

    techstay 評(píng)論0 收藏0
  • 聊聊Dubbo - Dubbo可擴(kuò)展機(jī)制源碼解析

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

    lmxdawn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<