Dubbo服务治理篇——Dubbo Filter实战-阿里云开发者社区

开发者社区> -技术小助手-> 正文

Dubbo服务治理篇——Dubbo Filter实战

简介: 熟悉Dubbo的同学或朋友,都会知道,一般dubbo的service层都是一些通用的,无状态的服务。但是在某些特殊的需求下,我们又需要传递一些上下文环境,打个不恰当的比方,例如需要在每次调用dubbo的服务的时候,记录一下用户名或者需要知道sessionid等。
+关注继续查看

熟悉Dubbo的同学或朋友,都会知道,一般dubbo的service层都是一些通用的,无状态的服务。但是在某些特殊的需求下,我们又需要传递一些上下文环境,打个不恰当的比方,例如需要在每次调用dubbo的服务的时候,记录一下用户名或者需要知道sessionid等。



解决办法1


如果是在项目设计的时候就意识到这一点的话,就好办,把所有的dubbo服务请求的参数都封装一个公共的父类,把一些上下文环境在放在父类的属性中。


a.jpg


这样做的好处就是,dubbo接口的参数都统一的,在Dubbo中可以做一些统一的处理(例如把上下文环境取出来,放在ThreadLocal中)。


解决办法2


但是并不是所有的项目一开始就有这个需求的,但是突然有一天他猝不及防的出现了(比如本人就接到要使用多数据,每次前端请求的时候根据参数选择使用的数据库),如果项目已经基本定型的情况下,再改造成上面的解决办法,改动量太大(不怕麻烦的也可以,但是本人就比较懒)。


改造方案


aa.jpg


只需要在调用方加一个切面,在服务方加一个filter切面

代码如下



/**
 * 在调用service的接口之前,加入一些dubbo的隐式参数
 * Created by binghe
 */
@Aspect
@Component
public class DubboServiceContextAop {
 
    @Pointcut("execution(* com.打码.打码..service.api.*.*(..))")
    public void serviceApi() {
    }
 
    @Before("serviceApi()")
    public void dubboContext(JoinPoint jp) {
        Map<String, String> context = new HashMap<>();
        // todo you want do
        RpcContext.getContext().setAttachments(context);
    } 
}


本项目service的package命名都是 com.打码.打码.模块名.service.api  因此只需要一个execution就行了,这也是养成统一的包命名的好处

Dubbo Filter

代码如下,很简单



public class DubboContextFilter implements Filter {
 
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        String var= RpcContext.getContext().getAttachment(从Aop中放入的);
        //todo 其他相关处理
        return invoker.invoke(invocation);
    }


怎么写Dubbo Filter


第一步:创建一个类实现Filter接口


如上面的DubboContextFilter


注意是com.alibaba.dubbo.rpc.Filter

第二步:在resources中创建文件


META-INF/dubbo/com.alibaba.dubbo.rpc.Filter


注意是 META-INF文件下的dubbo文件夹下的"com.alibaba.dubbo.rpc.Filter"文件


g.jpg


并在里面加入,也就是第一步中创建的类的路径



dubboContextFilter=com.打码.打码.打码.打码.打码.DubboContextFilter


第三步:在配置文件中加入


<dubbo:provider filter="dubboContextFilter" />


小结


其实dubbo内置了一些filter,我们可以自定义自己的filter来完成一些和业务流程无关的逻辑,例如可以写IP白名单等等

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Dubbo服务消费者调用过程
上图是服务消费的主过程: 首先通过ReferenceConfig类的private void init()方法会先检查初始化所有的配置信息后,调用private T createProxy(Map map)创建代理,消费者最终得到的是服务的代理, 在createProxy接着调用Protocol接口实现的 Invoker refer(Class type, URL url)方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。
957 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2919 0
基于 Spring + Dubbo 开发分布式REST服务实战
课程中详细演示了一个应用从单块架构到垂直应用架构再到分布式服务架构的演进过程。讲解了如何在前后端分离的架构下设计RESTful API。最终的系统对外提供REST风格的http服务,内部各个垂直应用通过dubbo共享无状态的Java服务。整个系统在Web层和服务层都可以无缝的横向扩展。
2784 0
阿里云服务网格ASM之扩展能力(1):在ASM中通过EnvoyFilter添加HTTP请求头
前面的系列文档中介绍了如何创建服务网格ASM实例,并介绍了如何将一个应用示例部署到 ASM 实例中,本文在此基础上介绍如何通过定义EnvoyFilter来添加HTTP请求头,以满足一些场景下的要求,例如使用安全请求头保护应用程序的安全等。
826 0
如何压测SAE产品托管的DUBBO服务
SAE、DUBBO服务、性能压测
151 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10828 0
源码分析Dubbo服务消费端启动流程
通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生命周期接口:InitializingBean,接下来应该看一下其afterPropertiesSet方法的实现。
1466 0
分布式--Dubbo 分布式服务
1. Dubbo官网 Dubbo下载地址 1). 发展历史 随着互联网的不断发展,网站的应用规模越来越大,常规的垂直架构已经无法应对,尤其是类似电商的项目,所以分布式架构和流动计算架构已经势在必行。
901 0
k8s容器云架构之dubbo微服务—k8s(07)交付实战-架构说明并准备zk集群 目录
博客地址:https://www.cnblogs.com/sseban 哔哩哔哩:https://space.bilibili.com/394449264
16 0
1633
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载