发布时间:2023-09-29 13:30
RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态都会变化。
比如:A调B,B再调C,则B机器上,在B调C之前,RpcContext记录的是A调B的信息,在B调C之后,RpcContext记录的是B调C的信息。
// 远程调用之前,通过attachment传KV给提供方
RpcContext.getContext().setAttachment(\"userKey\", \"userValue\");
// 远程调用
xxxService.xxx();
// 本端是否为消费端,这里会返回true
boolean isConsumerSide = RpcContext.getContext().isConsumerSide();
// 获取最后一次调用的提供方IP地址
String serverIP = RpcContext.getContext().getRemoteHost();
// 获取当前服务配置信息,所有配置信息都将转换为URL的参数
String application = RpcContext.getContext().getUrl().getParameter(\"application\");
// 注意:每发起RPC调用,上下文状态会变化
yyyService.yyy();
// 此时 RpcContext 的状态已变化
RpcContext.getContext();
public class XxxServiceImpl implements XxxService {
public void xxx() {
// 通过RpcContext获取用户传参,这里会返回userValue
String value = RpcContext.getContext().getAttachment(\"userKey\");
// 本端是否为提供端,这里会返回true
boolean isProviderSide = RpcContext.getContext().isProviderSide();
// 获取调用方IP地址
String clientIP = RpcContext.getContext().getRemoteHost();
// 获取当前服务配置信息,所有配置信息都将转换为URL的参数
String application = RpcContext.getContext().getUrl().getParameter(\"application\");
// 注意:每发起RPC调用,上下文状态会变化
yyyService.yyy();
// 此时本端变成消费端,这里会返回false
boolean isProviderSide = RpcContext.getContext().isProviderSide();
}
}
消费端:在执行Rpc调用之前,经过Filter处理, 会将信息写入RpcContext.见ConsumerContextFilter:
服务端:在执行调用之前,也会经过Filter处理,将信息写入RpcContext. 见ContextFilter类
//配置方式
//编程方式
Future future = RpcContext.getContext().asyncCall(new Callable(){...});
//访问服务之后获取异步调用的结果,通过Future.
Future future = RpcContext.getContext().getFuture();
T t = future.get();
同步调用:ResponseFuture.get()同步等待返回结果并实时返回。
异步调用:ResponseFuture放入RpcContext,实时返回一个空的RpcResult实例,后序通过RpcContext.getContext().getFuture() .get()获取返回值。
详情见DubboInvoker
异步调用依赖传递性
异步回调返回null
解决方案:别让async参数应用到provider端。
修改ContextFilter源码,重写RpcContext时删除async参数
vscode import别名(如@)文件无法ctrl+左键跳转
Runcat 让Mac跑代码程序更Happy(Mac系统监控软件推荐)
微服务SpringCloud开弓之Zookeeper服务注册与发现《四》
香蕉派 BPI-M2 Zero 四核开源单板计算机 全志 H2+/H3 芯片 高端设计
Identity Server 4使用OpenID Connect添加用户身份验证(三)
ITOP-i.MX8M mini开发板适用于充电桩,物联网,工业控制,医疗,智能交通
Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题