在spring boot框架下开发dubbo filter

Posted 水墨江南110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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-INFdubbo,在该目录下增加文件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在微服务中应用场景比较多,如日志,追踪,黑白名单等。

以上是关于在spring boot框架下开发dubbo filter的主要内容,如果未能解决你的问题,请参考以下文章

rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

Spring Boot Dubbo 应用启停源码分析

Spring Dubbo 开发笔记

阿里云的消息服务怎么集成spring boot

适合初学者的一个分布式环境搭建过程(spring boot + zookeeper + dubbo + mybatis + mysql)

Spring Boot 2 整合 Dubbo 框架 ,实现 RPC 服务远程调用