dubbo SPI扩展Filter隐式传参 含 ThreadLocal

普通传参

一、新增Filter文件

1、消费者过滤器:ConsumerFilter.java

package com.demo.Filter;

import com.alibaba.dubbo.rpc.*;
import com.demo.common.Filter.UserParameter;

import java.util.Map;
import java.util.UUID;

public class ConsumerFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Map<String, String> stringStringMap = invocation.getAttachments();
        // 设置参数
        stringStringMap.put("patentId","0");
        stringStringMap.put("traceId",UUID.randomUUID().toString());
        System.out.println("生成tradeId:"+stringStringMap.get("traceId"));
        
        return invoker.invoke(invocation);
    }
}

2、生产者过滤器:ProviderFilter.java

package com.demo.Filter;

import com.alibaba.dubbo.rpc.*;
import com.demo.common.Filter.UserParameter;

import java.util.Map;

public class ProviderFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        Map<String, String> stringStringMap = invocation.getAttachments();
        // 接收参数
        System.out.println("收到:patentId:"+stringStringMap.get("patentId"));
        System.out.println("收到:tradeId:"+stringStringMap.get("traceId"));
        
        return invoker.invoke(invocation);

    }

二、配置SPI Filter扩展文件

1、生产者配置
在目录:resources/META-INF/dubbo/ 创建com.alibaba.dubbo.rpc.Filter 文件

内容:

providerFilter=com.demo.Filter.ProviderFilter

2、消费者配置
在目录:resources/META-INF/dubbo/ 创建com.alibaba.dubbo.rpc.Filter

内容:

consumerFilter=com.demo.Filter.ConsumerFilter

注:META-INF/dubbo 必须转成目录,如果出现META-INF。dubbo样式,右键Mark Directory As=>Exclusion处理

三、配置dubbo文件

1、生产者

<dubbo:provider filter=“providerFilter” />

2、消费者

<!--过滤器配置-->
<dubbo:consumer filter="consumerFilter" />

运行,输出结果

消费者:

生成tradeId:0d89320e-b023-44e8-ace6-c077f7e59f69

提供者:

收到:patentId:0
收到:tradeId:5212f9e0-a4d8-455d-9d6d-7ffb66ab4873

ThreadLocal传参

一、新增ThreadLocal数据对象

public class UserParameter {

    // 创建线程局部变量,并初始化值
    private static ThreadLocal<String> userIdThreadLocal = new ThreadLocal<String>()
    {
        @Override
        protected String initialValue()
        {
            return "";
        }
    };

    // 提供线程局部变量set方法
    public static void setUserId(String userId) {
        userIdThreadLocal.set(userId);
    }

    // 提供线程局部变量get方法
    public static String getUserId() {
        return userIdThreadLocal.get();
    }
}

二、消费者Controller调用方法写入数据‘

UserParameter.setUserId("黑白独行");
System.out.println("写入 UserId:" + UserParameter.getUserId());

三、消费者ConsumerFilter传入参数‘

invocation.getAttachments().put("userId", UserParameter.getUserId());
System.out.println("传入 UserId:" + UserParameter.getUserId());

四、提供者ProviderFilter接收参数‘

String userId = invocation.getAttachments().get("userId");
UserParameter.setUserId(userId);
 System.out.println("收到 UserId:" + UserParameter.getUserId());

五、提供者Service实现方法获取参数‘

String userId = UserParameter.getUserId();
System.out.println("读取 UserId:" + UserParameter.getUserId());

运行,查看结果

消费者:

写入 UserId:黑白独行
传入 UserId:黑白独行

提供者:

收到 UserId:黑白独行
读取 UserId:黑白独行

猜你喜欢

转载自blog.csdn.net/weixin_41003771/article/details/114420883
今日推荐