一般來說,消費者進行遠端呼叫時,會呼叫遠端的乙個提供者。
現在可以消費者呼叫乙個方法,可以呼叫提供者多個方法再聚合結果返回。
public invokerrefer(classtype, url url) throws rpcexception
// group="a,b" or group="*"
mapqs = stringutils.parsequerystring(url.getparameteranddecoded(constants.refer_key));
string group = qs.get(constants.group_key);
//c1處
if (group != null && group.length() > 0 )
}return dorefer(cluster, registry, type, url);
}
consumer端在初始化reference時,先判斷是否有配置group屬性,如果有配置,則使用合併集群,即「c1處」,多個分組用「,」分隔。
看看合併集群mergeablecluster是怎麼呼叫分組的:
public result invoke(final invocation invocation) throws rpcexception
}return invokers.iterator().next().invoke(invocation);
}class<?> returntype;
try catch ( nosuchmethodexception e )
//m2處
map> results = new hashmap>();
for( final invokerinvoker : invokers )
} );
results.put( invoker.geturl().getservicekey(), future );
}object result = null;
listresultlist = new arraylist( results.size() );
int timeout = geturl().getmethodparameter( invocation.getmethodname(), constants.timeout_key, constants.default_timeout );
//m3處
for ( map.entry> entry : results.entryset() ) else
} catch ( exception e )
}if (resultlist.size() == 0) else if (resultlist.size() == 1)
if (returntype == void.class)
if ( merger.startswith(".") ) catch ( nosuchmethodexception e )
if ( method != null )
result = resultlist.remove( 0 ).getvalue();
try
} else
}} catch ( exception e )
} else
} else else
if (resultmerger != null)
//m5處
result = resultmerger.merge(
rets.toarray((object)array.newinstance(returntype, 0)));
} else
}return new rpcresult( result );
}
雖然reference引用標籤配置了group屬性,但如果呼叫的方法配置不使用group屬性,則也會退化為只呼叫乙個提供者的,即原始碼「m1處」;
mergeablecluster用多執行緒分別呼叫多個分組裡的提供者,即原始碼「m2處」,並將分組的返回結果聚合起來「m3處」,在「m4處」,如果沒有配置聚合器,則使用dubbo預設的聚合器,否則,「m5處」,會使用使用者配置的聚合器合併結果返回,自己定義的聚合器,實現merger介面即可。
package com.alibaba.dubbo.rpc.cluster;
public inte***ce merger
並在meta-inf/dubbo/internal目錄下配置com.alibaba.dubbo.rpc.cluster.merger自己的聚合器,配置跟dubbo的過濾器類似,比如:
#com.alibaba.dubbo.rpc.cluster.merger分組聚合結果擴充套件
mymerger = xx.xx.mymerger
自己寫了個rpc:
可以給個star,^0^.
收集面試題(十七)(分數使之有倍數關係)
將1 2 3 4 5 6 7 8 9 這九個數字分成三個百位數,每個數字用且只用一次,並且第三個數字是第乙個的3倍,第二個數字是第乙個的2倍。求三個數。說明,結果可能多於一組,例如327 654 981 public class getnumbers gets the numbers.return ...
oracle9i學習筆記之十七 分級取回資料
1.分級查詢 select level column,expr.from table where condition s start with condition s connect by prior condition s level 對每行返回乙個級別,對根行level偽列返回1 對孩子的lev...
jmeter(二十七)分布式壓測注意事項
一 壓測機 1 數量 成本 無論是從成本角度還是維護的難易方面,壓測機的數量,適量就好。舉個例子,8c16g的一台伺服器,部署jmeter後,根據我個人的測試比對資料,配置 1500個執行緒數,最好。太多了效能損耗較大,延時高 太少了又浪費。2 controller agent 模擬的併發執行緒數超...