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白名单等等

相关文章
|
4月前
|
Dubbo Java 应用服务中间件
实战指南:如何在Spring Boot中无缝整合Dubbo【四】
实战指南:如何在Spring Boot中无缝整合Dubbo【四】
76 0
|
16天前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
68 17
微服务框架Dubbo环境部署实战
|
1月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
52 0
|
3月前
|
Dubbo Java 应用服务中间件
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
Spring Boot 调用 Dubbo 接口与编写 Dubbo 接口实战
304 1
|
4月前
|
XML Cloud Native Dubbo
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(一)
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南
253 1
|
4月前
|
Dubbo Cloud Native 应用服务中间件
【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心、注册中心的原理及开发实战(中)
【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心、注册中心的原理及开发实战(中)
137 1
|
4月前
|
Cloud Native Dubbo 应用服务中间件
【Dubbo3高级特性】「微服务云原生架构」带你从零基础认识搭建公司内部服务用户中心体系(实战指南-序章)
【Dubbo3高级特性】「微服务云原生架构」带你从零基础认识搭建公司内部服务用户中心体系(实战指南-序章)
178 0
|
4月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
139 0
|
4月前
|
XML Dubbo Java
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(二)
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南
271 0
|
4月前
|
存储 Dubbo 应用服务中间件
SpringCloud | Dubbo 微服务实战——注册中心详解
SpringCloud | Dubbo 微服务实战——注册中心详解