在不改变消费者代码的前提下,生产者怎样获取消费者的applicationName,ip?
原提问者GitHub用户panhongliang
思路:provider端的filter中扩展获取
途径:
1、IP可以通过RemoteHost直接获取 应用名是无法直接获取的,需要consumer传入,所2、以consumer也需要扩展一个filter。 以下是一个完整可用的,记录ip,appName,耗时的一对filter,请自行取用
@Activate(group = Constants.CONSUMER) public class LogTraceConsumerFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(LogTraceConsumerFilter.class);
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
//手动设置consumer的应用名进attachment
String application = invoker.getUrl().getParameter(Constants.APPLICATION_KEY);
if (application != null) {
RpcContext.getContext().setAttachment("dubboApplication", application);
}
Result result = null;
String serverIp = null;
long startTime = System.currentTimeMillis();
try {
result = invoker.invoke(invocation);
serverIp = RpcContext.getContext().getRemoteHost();//这次返回结果是哪个ip
return result;
} finally {
Throwable throwable = (result == null) ? null : result.getException();
Object resultObj = (result == null) ? null : result.getValue();
long costTime = System.currentTimeMillis() - startTime;
LOG.info("[TRACE] Call {}, {}.{}() param:{}, return:{}, exception:{}, cost:{} ms!", serverIp, invoker.getInterface(), invocation.getMethodName(), invocation.getArguments(), resultObj, throwable, costTime);
}
}
}
@Activate(group = Constants.PROVIDER) public class LogTraceProviderFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(LogTraceProviderFilter.class);
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
//上游如果手动设置了consumer的应用名进attachment,则取出来打印
String clientIp = RpcContext.getContext().getRemoteHost();//这次请求来自哪个ip
String application = RpcContext.getContext().getAttachment("dubboApplication");
String from = clientIp;
if (!StringUtils.isEmpty(application)) {
from = application+"("+clientIp+")";
}
LOG.info("[Trace]From {}, {}.{}() param:{}", from, invoker.getInterface(), invocation.getMethodName(), invocation.getArguments());
return invoker.invoke(invocation);
}
}
关于更多详情我写了一个博客:http://jaskey.github.io/blog/2020/05/18/dubbo-filter-trace-consumer/
原回答者GitHub用户Jaskey
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。