dubbo的調(diào)用過(guò)程如下圖所示
1:URL
定義了調(diào)用的url如協(xié)議、協(xié)議彤枢、參數(shù)等信息狰晚。還有在拓展加載中選擇對(duì)應(yīng)的拓展類如下代碼片段所示(isActive(activate, url))
public List<T> getActivateExtension(URL url, String[] values, String group) {
List<T> exts = new ArrayList<T>();
List<String> names = values == null ? new ArrayList<String>(0) : Arrays.asList(values);
if (! names.contains(Constants.REMOVE_VALUE_PREFIX + Constants.DEFAULT_KEY)) {
getExtensionClasses();
for (Map.Entry<String, Activate> entry : cachedActivates.entrySet()) {
String name = entry.getKey();
Activate activate = entry.getValue();
if (isMatchGroup(group, activate.group())) {
T ext = getExtension(name);
if (! names.contains(name)
&& ! names.contains(Constants.REMOVE_VALUE_PREFIX + name)
&& isActive(activate, url)) {
exts.add(ext);
}
}
}
dubbo已知的調(diào)用傳遞bug(dubbo.2.5.3)
服務(wù)A異步調(diào)用服務(wù)B再同步調(diào)用服務(wù)C這種情況下服務(wù)A將獲取不到結(jié)果。原因是在傳遞async參數(shù)的過(guò)程中將B同步調(diào)用C修改為異步調(diào)用缴啡。
傳遞bug導(dǎo)致具體代碼位置
如何解決傳遞問(wèn)題
添加Filter在調(diào)用前把a(bǔ)sync屬性重置為默認(rèn)值家肯。如下所示
@Activate(value = {Constants.CONSUMER,Constants.PROVIDER} ,order = -1000000)
public class RmAsync implements Filter {
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
invocation.getAttachments().put("async", "false");
return invoker.invoke(invocation);
}
}
URl中實(shí)際開(kāi)發(fā)中應(yīng)用
服務(wù)跟蹤同一筆請(qǐng)求從源頭服務(wù)開(kāi)始把日志ID傳遞到服務(wù)方,根據(jù)日志id跟蹤調(diào)用流程具體實(shí)現(xiàn)如下
public class ConsumerTrackingFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(ConsumerTrackingFilter.class);
public ConsumerTrackingFilter() {
}
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
try {
String unique = LogUniqueKeyUtil.getKeyFromLog();
if (StringUtils.isEmpty(unique)) {
LogUniqueKeyUtil.generateKeyToLog();
}
RpcContext.getContext().setAttachment(LogUniqueKeyUtil.LOG_KEY, unique);
} catch (Throwable var4) {
this.logger.warn("ConsumerTrackingFilter error", var4);
}
Result result = invoker.invoke(invocation);
return result;
}
}
2:Invoker
是實(shí)體域盟猖,它是 Dubbo 的核心模型讨衣,其它模型都向它靠擾,或轉(zhuǎn)換成它式镐,它代表一個(gè)可執(zhí)行體反镇,可向它發(fā)起 invoke 調(diào)用,它有可能是一個(gè)本地的實(shí)現(xiàn)娘汞,也可能是一個(gè)遠(yuǎn)程的實(shí)現(xiàn)歹茶,也可能一個(gè)集群實(shí)現(xiàn)。
服務(wù)提供者暴露一個(gè)服務(wù)的詳細(xì)過(guò)程
服務(wù)消費(fèi)者消費(fèi)一個(gè)服務(wù)的詳細(xì)過(guò)程
3:Invocation
是會(huì)話域你弦,它持有調(diào)用過(guò)程中的變量惊豺,比如方法名,參數(shù)等禽作。
4:Protocol
是服務(wù)域尸昧,它是 Invoker 暴露和引用的主功能入口,它負(fù)責(zé) Invoker 的生命周期管理旷偿。