Dubbo 过滤器使用总结

Dubbo 过滤器简单使用

通过过滤器我们可以对请求进行统一处理,比如请求链路id 生成 ,参数验证等等。 Dubbo中过滤器分服务端和消费端,通过group 指定,比如下面例子就是服务消费端过滤器例子。

本文主要内容

  • 通过参数校验例子,展示过滤器使用。

  • 过滤器源码简单分析

@Activate(group = CONSUMER, order = -10000)
public class CustomerTokenFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        String token = RpcUtil.getSign("1234567");
        RpcContext.getContext().getObjectAttachments().put("accessToken",token);
        return invoker.invoke(invocation);
    }
}

使用过滤器对请求校验

本文给的例子 校验流程:

  • 消费端:将请求所有参数 按顺序拼接成字符串,最后拼接上消费端密钥,计算出md5; 并通过隐藏参数传递。

  • 服务端:将请求所有参数 按顺序拼接成字符串,最后拼接上服务端密钥,计算出md5; 如果服务端计算出md5值  与 消费端传来的md5值一致 说明 消费端密钥与服务端密钥一致。 则请求合法,否则报错。

服务端过滤器代码

假设服务端与消费端约定的秘钥是123456;

@Activate(group = PROVIDER, order = -10000)
public class CustomerTokenValidFilter implements Filter {

    private String ak = "123456";

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        String token = RpcContext.getContext().getAttachment("accessToken");
        String expireToken = RpcUtil.getSign(ak);

        if(!expireToken.equals(token)){
            throw new RuntimeException("参数检验失败,请求不合法");
        }

        return invoker.invoke(invocation);
    }
}

服务端过滤器配置

    <dubbo:service interface="com.codetonight.service.HelloService" ref="helloServiceImpl" retries="0" filter="customertokenvalidfilter" >
    </dubbo:service>

消费端过滤器

@Activate(group = CONSUMER, order = -10000)
public class CustomerTokenFilter implements Filter {
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {

        String token = RpcUtil.getSign("1234567");
        RpcContext.getContext().getObjectAttachments().put("accessToken",token);
        return invoker.invoke(invocation);
    }
}

消费端过滤器配置

    <dubbo:reference  id="helloService" interface="com.codetonight.service.HelloService"  filter="customertokenfilter">
    </dubbo:reference>

过滤器相关部分源码

我们看看这个类 ProtocolFilterWrapper看过之前文章Dubbo SPI 使用总结就很容易理解, ProtocolFilterWrapper对Protocol 进行 AOP 增强。

  • export方法 里调用buildInvokerChain 构建filter 责任链实现服务端过滤器够级

  • refer 方法同样调用buildInvokerChain 构建filter 责任链实现消费端过滤器够级

过滤器也是SPI接口,服务端加载group是provider,消费端加载的是consumer。

最终责任链末端就是需要执行业务的invoker。

图片

图片

内置的过滤器

echo=org.apache.dubbo.rpc.filter.EchoFilter
generic=org.apache.dubbo.rpc.filter.GenericFilter
genericimpl=org.apache.dubbo.rpc.filter.GenericImplFilter
token=org.apache.dubbo.rpc.filter.TokenFilter
accesslog=org.apache.dubbo.rpc.filter.AccessLogFilter
activelimit=org.apache.dubbo.rpc.filter.ActiveLimitFilter
classloader=org.apache.dubbo.rpc.filter.ClassLoaderFilter
context=org.apache.dubbo.rpc.filter.ContextFilter
consumercontext=org.apache.dubbo.rpc.filter.ConsumerContextFilter
exception=org.apache.dubbo.rpc.filter.ExceptionFilter
executelimit=org.apache.dubbo.rpc.filter.ExecuteLimitFilter
deprecated=org.apache.dubbo.rpc.filter.DeprecatedFilter
compatible=org.apache.dubbo.rpc.filter.CompatibleFilter
timeout=org.apache.dubbo.rpc.filter.TimeoutFilter
tps=org.apache.dubbo.rpc.filter.TpsLimitFilter

总结

过滤器适用于一些全局统一的处理,比如参数校验、权限控制、统一异常处理等等。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
Dubbo中加载拦截器有几种方式。首先,可以在提供者端和消费者端都生效的默认方式是通过在Dubbo的配置中开启校验。在提供者端,可以在@Service注解中指定validation属性为true,例如:@Service(version = "1.0.0", protocol = "dubbo", validation = "true")。在消费者端,可以在@Reference注解中指定validation属性为true,例如:@Reference(version = "1.0.0", protocol = "dubbo", validation = "true")。这样就会使用ValidationFilter来实现校验。 另外,还可以通过全局配置来指定消费者验证。在Dubbo的配置文件(比如yml文件)中,可以设置dubbo.consumer.validation为true,例如:dubbo: consumer: validation: true。这样就会对所有的消费者进行验证。 此外,还可以通过在META-INF/dubbo/org.apache.dubbo.rpc.Filter文件中配置拦截器。比如,可以配置一个RPCExceptionFilter,将其添加到提供者的过滤器链中,可以在dubbo:provider:filter中指定,例如:dubbo: provider: filter: default,-exception,rpcExceptionFilter。同样地,也可以配置一个CustomValidationFilter,将其添加到过滤器链中,可以在META-INF/dubbo/org.apache.dubbo.rpc.Filter文件中指定,例如:dubbo: provider: filter: customValidationFilter。 总结起来,Dubbo加载拦截器的方式包括在注解中指定validation属性、在全局配置中设置消费者验证、以及在META-INF/dubbo/org.apache.dubbo.rpc.Filter文件中配置过滤器。 #### 引用[.reference_title] - *1* *2* *3* [Dubbo实战-自定义拦截器](https://blog.csdn.net/qq_37436172/article/details/131341141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值