软件编程
位置:首页>> 软件编程>> java编程>> DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

作者:小目标青年  发布时间:2023-10-19 22:53:54 

标签:DUBBO,过滤器,接口

Dubbo过滤器概述

Dubbo中的过滤器和Web应用中的过滤器的概念是一样的,提供了在服务调用前后插入自定义逻辑的途径。过滤器是整个Dubbo框架中非常重要的组成部分,Dubbo中很多功能都是基于过滤器扩展而来的。过滤器提供了服务提供者和消费者调用过程的拦截,即每次都执行RPC调用的时候,对应的过滤器都会生效。虽然过滤器的功能强大,但由于每次调用时都会执行,因此在使用的时候需要注意它对性能的影响。

过滤器的使用

  • 一种方式是使用@Active注解默认启用;

  • 一种方式是在配置文件中配置;

<!-- 消费方调用过程拦截 -->
<dubbo:reference filter="xxx, yyy" />

<!-- 消费方调用过程默认 * ,将拦截所有reference -->
<dubbo:consumer filter="xxx, yyy" />

<!-- 服务提供方调用过程拦截 -->
<dubbo:service filter="xxx, yyy" />

<!-- 服务提供方调用过程默认 * ,将拦截所有service -->
<dubbo:provider filter="xxx, yyy" />

下面看下DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息

①自定义一个过滤器 DubboLoggerFilter.java

import org.apache.dubbo.rpc.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;

/**
* @Author: JCccc
* @Description: dubbo请求和响应拦截(记录请求参数和响应结果和时长)
* @Date: Create in 19:03 2021/1/26
*/
public class DubboLoggerFilter implements Filter {
   protected Logger logger = LoggerFactory.getLogger(getClass());
   /**
    * rpc日志最长字符串
    */
   private final static Integer MAX_LOG_LENGTH=5000;
   /**
    * rpc日志超过长度截取长度
    */
   private final static Integer REMAINING_LOG_LENGTH=1000;
   @Override
   public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

String methodName = invocation.getMethodName();
       Object[] arguments = invocation.getArguments();
       String className = invoker.getInterface().getName();
       String callMethod = className + "." + methodName;
       String argsJson = JSON.toJSONString(arguments);
       logger.info("rpc接口callMethod:{}>>入参:{}", callMethod, argsJson);
       long start = System.currentTimeMillis();
       AsyncRpcResult result = (AsyncRpcResult)invoker.invoke(invocation);
       if(result.hasException()){
           logger.info("rpc接口callMethod:{},接口耗时:{},异常:{},", callMethod,  System.currentTimeMillis() - start,result.getException().getMessage());
       } else {
           Object resultString = JSON.toJSON(result.getAppResponse().getValue());
           if(resultString!=null&&resultString.toString().length()>MAX_LOG_LENGTH){
               resultString=resultString.toString().substring(0,REMAINING_LOG_LENGTH)+"...";
           }
           logger.info("rpc接口callMethod:{},出参:{},接口耗时:{}", callMethod,resultString , System.currentTimeMillis() - start);
       }
       return result;

}
}

② 加上配置

DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

来源:https://blog.csdn.net/qq_35387940/article/details/128338614

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com