Dubbo自定义日记拦截器_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

媒介

上一篇文章 Spring aop 自定义注解一致纪录用户行动日记 纪录了 web层中经由历程自定义注解合营Spring aop自动纪录用户行动日记的历程。那末依照分布式架构中Dubbo效劳层的挪用历程是不是也能够完成一致纪录日记?自定义日记拦截器能够完成这个需求。

需求场景

在运用Dubbo搭建的分布式项目中,效劳层代码挪用是如许的:

1     @GetMapping(value = "/info")
22    public BaseResult userInfo() {
33        //rpc长途挪用用户效劳
44        BaseResult result = mUserService.userInfo();
56        return result;
67    }

这里的用户效劳位于别的一个效劳历程,由效劳提供者袒露出来,让web层长途挪用,须要纪录效劳结果的挪用历程,便于跟踪定位bug.

自定义日记拦截器

翻看下Dubbo官方文档,能够看到以下内容:

扼要申明:

  • Dubbo 中所有的拦截器悉数继续自org.apache.dubbo.rpc.Filter接口,我们本身也能够自行扩大,只需继续该接口便可.
  • 用户自定义 filter 默许在内置 filter 以后实行

新增 DubboServiceFilter 拦截器以下:

 1public class DubboServiceFilter implements Filter {
2
3    private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceFilter.class);
4
5    @Override
6    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
7        //外部日记开关默许封闭
8        String logSwitch = StringUtils.equals(RedisUtil.get(BaseConstants.CACHE_SERVICE_LOG_SWITCH), BaseConstants.YES) ? BaseConstants.YES : BaseConstants.NO;
9        if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
10            //打印入参日记
11            DubboServiceRequest serviceRequest = new DubboServiceRequest();
12            serviceRequest.setInterfaceName(invocation.getInvoker().getInterface().getName());
13            serviceRequest.setMethodName(invocation.getMethodName());
14            serviceRequest.setArgs(invocation.getArguments());
15            LOGGER.info("dubbo效劳接口入参: "   JSON.toJSONString(serviceRequest));
16        }
17        //最先时候
18        long startTime = System.currentTimeMillis();
19        //实行接口挪用逻辑
20        Result result = invoker.invoke(invocation);
21        //挪用耗时
22        long elapsed = System.currentTimeMillis() - startTime;
23        //若是发作非常 则打印非常日记
24        if (result.hasException() && invoker.getInterface() != GenericService.class) {
25            LOGGER.error("dubbo实行非常: ", result.getException());
26        } else {
27            if (StringUtils.equals(BaseConstants.YES, logSwitch)) {
28                //打印相应日记
29                DubboServiceResponse serviceResponse = new DubboServiceResponse();
30                serviceResponse.setMethodName(invocation.getMethodName());
31                serviceResponse.setInterfaceName(invocation.getInvoker().getInterface().getName());
32                serviceResponse.setArgs(invocation.getArguments());
33                serviceResponse.setResult(new Object[]{result.getValue()});
34                serviceResponse.setSpendTime(elapsed);
35                LOGGER.info("dubbo效劳相应胜利,返回数据: "   JSON.toJSONString(serviceResponse));
36            }
37        }
38        //返回结果相应结果
39        return result;
40    }
41}

代码中对应的实体bean以下:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

入参实体:

 1/**
2 * @program: easywits
3 * @description:Dubbo效劳要求入参实体
4 * @author: zhangshaolin
5 * @create: 2019-01-08 20:35
6 **/

7@Data
8public class DubboServiceRequest implements Serializable{
9    private static final long serialVersionUID = 7127824956842786618L;
10
11    /**
12     * 接口名
13     */

14    private String interfaceName;
15
16    /**
17     * 方法名
18     */

19    private String methodName;
20
21    /**
22     * 参数
23     */

24    private Object[] args;
25}

相应实体:

 1/**
2 * @program: easywits
3 * @description: Dubbo效劳相应结果实体
4 * @author: zhangshaolin
5 * @create: 2019-01-08 20:36
6 **/

7@Data
8public class DubboServiceResponse implements Serializable{
9    private static final long serialVersionUID = -2531169660859647737L;
10
11    /**
12     * 接口名
13     */

14    private String interfaceName;
15
16    /**
17     * 方法名
18     */

19    private String methodName;
20
21    /**
22     * 参数
23     */

24    private Object[] args;
25
26    /**
27     * 返回结果
28     */

29    private Object result;
30
31    /**
32     * 挪用耗时(毫秒)
33     */

34    private long spendTime;
35}

/src/main/resources/META-INF/dubbo目录下新增纯文本文件org.apache.dubbo.rpc.Filter 内容为:

1dubboServiceFilter=com.easywits.common.filter.DubboServiceFilter
  • 键值对情势,键随意起个名字
  • 值为DubboServiceFilter拦截器的完整包名.

末了在效劳提供者设置装备摆设文件中增加设置装备摆设使拦截器见效:

 1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3      ...省略局部代码">
4
5    <!--效劳提供方运用信息,用于盘算依靠干系-->
6    <dubbo:application name="
easywits-upms-rpc-service"/>
7
8    <!--用dubbo协定在20881端口袒露效劳-->
9    <dubbo:protocol name="
dubbo" port="20881" payload="52428800"/>
10
11    <!--自定义效劳层过滤器,值为上述步调文本文件中的键-->
12    <dubbo:provider filter="
dubboServiceFilter"/>
13
14    ....省略局部效劳设置装备摆设
15</beans>
16

考证结果

抓一下我们营业中的局部日记信息看下结果,以下图:

能够清楚地看到Dubbo效劳接口挪用的要求参数信息,和终究的相应结果信息,便于定位线上题目。

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

末了

纪录一个比较简单的详细有用场景,后续会不定期更新更多的有用场景,迎接存眷民众号【张少林同砚】!

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。