在spring boot框架下开发dubbo filter

1.实现一个Filter,注意要写上注解。

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Throwables;

@Activate
public class DubboLogFilter implements Filter {
    

    protected final static Logger logger = LoggerFactory.getLogger(DubboLogFilter.class);
    
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        InvokeLog invokeLog = new InvokeLog();
    
        //设置请求时间
        invokeLog.setStartTime(new Date());
        //设置请求报文
        setRequest(invocation, invokeLog);
        //接口调用开始时间
        Result result = null;
        try {
            result = invoker.invoke(invocation);
            if(result.hasException()) {
                //如果有异常
                invokeLog.setFlag("failure");
                invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException()));
            } else {
                //如果成功
                if(result.getValue() != null){
                    String returnStr = JSON.toJSONString(result.getValue());
                    invokeLog.setResponseData(returnStr);
                }
                //TODO DUBBO接口如果无返回值暂未处理
            }
        } catch (RuntimeException e) {
            invokeLog.setFlag("failure");
            invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException()));
        } catch (Exception e) {
            invokeLog.setFlag("failure");
            invokeLog.setResponseData(Throwables.getStackTraceAsString(result.getException()));
        } finally {
            //接口调用时长
            invokeLog.setEndTime(new Date());
            invokeLog.setResponseTime(invokeLog.getEndTime().getTime()
                    - invokeLog.getStartTime().getTime());
            //SpringHelper.getBean("invokeLogService", InvokeLogService.class).insert(invokeLog);
        }
        System.out.println(JSON.toJSONString(invokeLog));
        return result;
    }
    
    /**
     * 设置接口调用参数
     * 
    */
    protected void setRequest(Invocation invocation, InvokeLog invokeLog) {
        try {
            Object[] arguments = invocation.getArguments();
            if (arguments != null && arguments.length > 0) {
                
                String requestStr = JSON.toJSONString(invocation.getArguments()); 
                invokeLog.setRequestData(requestStr);
            }
        } catch (Exception e) {
            // 不能影响dubbo的接口运行
            invokeLog.setRequestData(Throwables.getStackTraceAsString(e));
        }
    }
}

2.resources文件夹下新建目录META-INF\dubbo,在该目录下增加文件com.alibaba.dubbo.rpc.Filter,文件内容为:

dubboLogFilter=com.example.dubboTest.base.DubboLogFilter

3.在application.properties文件夹下增加配置spring.dubbo.provider.filter=dubboLogFilter

 

4.以上配置后,dubbo的Filter就会生效,当有消费者调用服务时,该Filter就会被触发

 

dubbo的filter在微服务中应用场景比较多,如日志,追踪,黑白名单等。

5.源码地址:

https://gitee.com/zhuyuehua/springboot2_dubbo.git

转载于:https://www.cnblogs.com/zhuyuehua/p/9412990.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值