发布时间: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参数
rust php 扩展,在PHP程序中使用Rust扩展的方法
php配置redis哨兵模式,Redis-sentinel哨兵模式集群方案配置
SpringBoot整合Redis使用@Cacheable和RedisTemplate
jsPDF + html2canvas A4分页截断 完美解决方案(含代码 + 案例)
Pycharm中SQL语句提示SQL Dialect is Not Configured的解决
【LeetCode每日一题】——83.删除排序链表中的重复元素
高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏