二. 原始碼分析
三. 使用
原始碼說明:該類表示提供端服務介面(包括介面中所有服務方法)、消費端服務介面(包括介面中所有服務方法)的當前呼叫次數、總數、失敗數、呼叫間隔等狀態資訊
**中有詳細注釋,重點關注begincount方法、endcount方法
service_statistics/method_statistics是靜態變數,相當於快取
package org.apache.dubbo.rpc;
public
class
rpcstatus
/** * 根據 url 返回介面中服務方法的 rpcstatus 狀態
*/public
static rpcstatus getstatus
(url url, string methodname)
/** * 服務方法執行前判斷是否滿足併發控制要求
** @param url
* @param methodname 服務方法
* @param max 併發控制的數量
* @return false:併發數已達到,掛起當前執行緒,等待喚醒
* @return true: 併發數未達到,可以執行
*/public
static
boolean
begincount
(url url, string methodname,
int max)
for(
int i;;)
// 併發數未達到,返回true
if(methodstatus.active.
compareandset
(i, i +1)
)}// 介面所有服務方法正在執行中的數量加1
incrementandget()
;return
true;}
/** * 服務方法執行後減少相關引數值(包括併發控制次數)
** @param url
* @param methodname
* @param elapsed
* @param succeeded
*/public
static
void
endcount
(url url, string methodname,
long elapsed,
boolean succeeded)
private
static
void
endcount
(rpcstatus status,
long elapsed,
boolean succeeded)
if(succeeded)
}else}}
}
原始碼說明:是消費端並且url有指定key(actives) filter才生效(@activate(group = consumer, value = actives_key))
invoke:呼叫 rpcstatus.begincount 判斷是否滿足併發控制條件
rpcstatus.begincount返回false:則讓當前執行緒掛起,之後會在timeout時間後被喚醒,並丟擲rpcexception異常。
也可能在其它消費端正常執行完或異常後呼叫 notifyfinish() 方法喚醒。
如果超過timeout時間還沒被喚醒,則當前執行緒會自動被喚醒,然後丟擲rpcexception異常。
onresponse/onerror:方法執行完成或異常呼叫rpcstatus.endcount減去相應數量
onresponse/onerror:會呼叫notifyfinish通知掛起的消費者
package org.apache.dubbo.rpc.filter;
@activate
(group = consumer, value = actives_key)
public
class
activelimitfilter
implements
filter
, filter.listener
catch
(interruptedexception e)
long elapsed = system.
currenttimemillis()
- start;
remain = timeout - elapsed;
if(remain <=0)
}}} invocation.
put(activelimit_filter_start_time, system.
currenttimemillis()
);return invoker.
invoke
(invocation);}
/** * 服務方法正常返回
* @param invoker
* @param invocation
*/@override
public
void
onresponse
?> invoker, invocation invocation)
/** * 服務方法異常
* @param t
* @param invoker
* @param invocation
*/@override
public
void
onerror
(throwable t, invoker<
?> invoker, invocation invocation)
} rpcstatus.
endcount
(url, methodname,
getelapsed
(invocation)
,false);
notifyfinish
(rpcstatus.
getstatus
(url, methodname)
, max);}
private
long
getelapsed
(invocation invocation)
/** * 服務方法正常返回或異常後:會呼叫 notifyall 通知掛起的消費者
* @param rpcstatus
* @param max
*/private
void
notifyfinish
(final rpcstatus rpcstatus,
int max)}}
}
public
static
void
main
(string[
] args)
Dubbo 服務提供方併發控制
二.原始碼分析 三.使用 原始碼說明 該類表示提供端服務介面 包括介面中所有服務方法 消費端服務介面 包括介面中所有服務方法 的當前呼叫次數 總數 失敗數 呼叫間隔等狀態資訊 中有詳細注釋,重點關注begincount方法 endcount方法 service statistics method s...
Dubbo 服務提供方併發控制
目錄二.原始碼分析 三.使用 原始碼說明 該類表示提供端服務介面 包括介面中所有服務方法 消費端服務介面 包括介面中所有服務方法 的當前呼叫次數 總數 失敗數 呼叫間隔等狀態資訊 中有詳細注釋,重點關注begincount方法 endcount方法 service statistics method...
Dubbo併發控制和連線控制
限制com.foo.barservice的每個方法,伺服器端併發執行 或占用執行緒池執行緒數 不能超過10個 限制com.foo.barservice的sayhello方法,伺服器端併發執行 或占用執行緒池執行緒數 不能超過10個 1.2.1.控制到介面所有方法 限制com.foo.barservi...