2

Dubbo秘密传递:让你的代码行云流水

 8 months ago
source link: https://www.51cto.com/article/777292.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Dubbo秘密传递:让你的代码行云流水

作者:了不起 2023-12-22 08:19:33
经过以上简单的几步,我们在对业务代码无侵入的情况下,通过Filter实现了Dubbo远程调用中的隐式传参。这可以方便地在服务调用链中传递一些公共的上下文信息,如登录信息、请求ID等。

哈喽,大家好,我是了不起。

在Dubbo使用过程中,有一些通用参数如果显式的在接口参数中传递,使用起来会有一些不方便。

比如:经常使用的用户信息、token等上下文信息,如果都放入参数中传递,这样会耦合到业务逻辑中了,这时隐式传参就是一种比较好的处理方式了。

Dubbo提供了RpcContext隐式传参的方式:

//消费侧传入参数
RpcContext.getContext().setAttachment(String key, String value);

//服务提供侧接收参数
RpcContext.getContext().getAttachment(String key);

通过上面两个方法,我们可以在消费端传入参数,然后在提供侧就可以接收到参数了,类似于线程变量ThreadLocal

为了更好的兼顾Dubbo多重调用导致隐式传参丢失的问题,我们可以在每个Dubbo服务程序中加入两个filter可解决问题

创建Filter

import java.util.HashMap;
import java.util.Map;

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.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.fastjson.JSONObject;

@Activate(group = {Constants.CONSUMER})
public class DubboConsumerContextFilter implements Filter {
 
 @Override
 public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
  RpcContext.getContext().setAttachment("token", "tokenvalue");
  return invoker.invoke(invocation);
 }
}

服务提供侧:

import java.util.Map;

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.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.fastjson.JSONObject;

@Activate(group = {Constants.PROVIDER})
public class DubboProviderContextFilter implements Filter {
 @Override
 public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
  // 处理token
  String token = RpcContext.getContext().getAttachment("token");
        //TODO 处理代码
  return invoker.invoke(invocation);
 }
}

其中@Activate注解指定了这个Filter是在消费端生效还是服务端生效。

配置filter到META-INF中

在/src/main/resources/META-INF/dubbo/下新建文件,文件名为com.alibaba.dubbo.rpc.Filter,没错,这就是文件的名称,而不是包路径。

文件内容:

dubboProviderContextFilter=com.xxx.DubboProviderContextFilter
dubboConsumerContextFilter=com.xxx.DubboConsumerContextFilter

经过以上简单的几步,我们在对业务代码无侵入的情况下,通过Filter实现了Dubbo远程调用中的隐式传参。这可以方便地在服务调用链中传递一些公共的上下文信息,如登录信息、请求ID等。

责任编辑:武晓燕 来源: Java技术指北

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK