在 Dubbo 中,隐式参数通常指的是那些不直接作为 RPC 方法参数传递,但需要在 RPC 调用过程中共享或传递的信息。这些信息可能包括用户身份、请求标识、认证令牌等。Dubbo 提供了几种方式来传递和使用这些隐式参数。
以下是使用 Dubbo 隐式参数的一些常见方法:
1. 使用 RpcContext 传递隐式参数
RpcContext
是一个上下文对象,用于在 RPC 调用中存储和获取附加信息。你可以在调用方设置隐式参数,然后在服务提供方获取这些参数。
调用方(消费者)设置隐式参数:
public class MyConsumer { |
|
@Reference |
|
private MyService myService; |
|
public void doSomething() { |
|
// 设置隐式参数 |
|
RpcContext.getContext().setAttachment("key", "value"); |
|
// 调用服务 |
|
myService.someMethod(); |
|
} |
|
} |
服务提供方获取隐式参数:
public class MyServiceImpl implements MyService { |
|
@Override |
|
public void someMethod() { |
|
// 获取隐式参数 |
|
String value = RpcContext.getContext().getAttachment("key"); |
|
// ... 处理业务逻辑 ... |
|
} |
|
} |
2. 使用请求附件(Attachments)
在 Dubbo 中,你可以通过请求的附件(Attachments)来传递额外的参数。这些附件通常会被序列化并附加到 RPC 请求中。
调用方设置附件:
public class MyConsumer { |
|
@Reference |
|
private MyService myService; |
|
public void doSomething() { |
|
// 创建 Invocation 对象 |
|
Invocation invocation = new RpcInvocation("someMethod", new Class<?>[0], new Object[0]); |
|
// 设置附件 |
|
invocation.setAttachment("key", "value"); |
|
// 调用服务 |
|
myService.$invoke(invocation); |
|
} |
|
} |
服务提供方获取附件:
public class MyServiceImpl implements MyService { |
|
@Override |
|
public Object $invoke(Invocation invocation) throws RpcException { |
|
// 获取附件 |
|
String value = invocation.getAttachment("key"); |
|
// ... 处理业务逻辑 ... |
|
return null; // 或返回结果对象 |
|
} |
|
} |
请注意,直接使用 $invoke
方法通常不推荐,除非你正在编写自定义的代理或拦截逻辑。在大多数情况下,你应该使用接口代理的方式调用服务,并通过 RpcContext
来访问附件。
3. 使用过滤器(Filter)
你还可以编写自定义的过滤器来操作隐式参数。过滤器可以在 RPC 调用的不同阶段被调用,允许你在请求发送前或响应接收后添加逻辑。
自定义过滤器示例:
public class MyFilter implements Filter { |
|
@Override |
|
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { |
|
// 在这里处理隐式参数,比如从 RpcContext 获取或设置 |
|
String value = RpcContext.getContext().getAttachment("key"); |
|
// ... 可能的其他逻辑 ... |
|
// 继续调用链 |
|
return invoker.invoke(invocation); |
|
} |
|
} |
然后,你需要在 Dubbo 配置中注册这个过滤器,以便它能在 RPC 调用过程中被调用。
注意事项
- 隐式参数不应该包含敏感信息,以防止信息泄露。
- 隐式参数的大小应该适中,以避免对 RPC 性能产生负面影响。
- 在多线程环境中使用隐式参数时,要确保线程安全。特别是当使用
ThreadLocal
或其他线程局部存储时,需要格外小心。
通过使用上述方法,你可以在 Dubbo 中灵活地传递和使用隐式参数,以满足不同的业务需求。