dubbo在消费者和提供者之间传递参数
背景:
在分布式系统中,消费者和提供者中都有记录请求日志的需要,但是又不在一个应用程序中。如何让请求参数自动的从消费者传递到提供者上是接下来要解决的问题。
1.消费者代码
@Activate(group = "CONSUMER")
public class ConsumerContextFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Result result = null;
setAttachment(invoker,invocation);
try {
//执行业务逻辑
result = invoker.invoke(invocation);
}catch(RpcException e) {
throw e;
}finally {
//清理
RpcContext.getContext().clearAttachments();
}
return result;
}
private void setAttachment(Invoker<?> invoker,Invocation invocation) {
try {
RpcContext.getContext()
.setInvoker(invoker)
.setInvocation(invocation)
.setAttachment("key","value");
}catch(Exception e) {
e.printStackTrace();
}
}
}
2.提供者代码
@Activate(group = "PROVIDER")
public class ProviderContextFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Result result = null;
getAttachment(invoker,invocation);
try {
//执行业务逻辑
result = invoker.invoke(invocation);
}
return result;
}
private void getAttachment(Invoker<?> invoker, Invocation invocation) {
try {
Map<String,String> attachments = RpcContext.getContext().
setInvoker(invoker).setInvocation(invocation).getAttachments();
String value = attachments.get("key");
}catch(Exception e) {
e.printStackTrace();
}
}
}