소스 입구
ConfigFactory.createConfigService
ConfigService configService = NacosFactory. createConfigService ( 등록);
문자열 내용 = configService. getConfig ( dataId, 의 groupId, 3000);
ConfigService에 의한 공장 건설
장식 MetricsHttpAgent 패키지 HTTP 요청, 모니터링을 증가
에 나타나 에이전트> HTTP 요청 clientWorker을 시작하는 프록시 방법 -> 특정 업무 관련
NacosConfigService.NacosConfigService
이. 에이전트 = 새로운 MetricsHttpAgent ( 새로운 ServerHttpAgent ( 등록));
이. 에이전트. 스타트();
이. 작업자 = 새로운 ClientWorker ( .이 에이전트 .이 configFilterChainManager, 등록);
-
시작> HTTP 요청 - 기관은 httpAgent를 생성
-
우리는 clientWorker-> 비동기 스레드 (cron 작업)을 생성
이. 집행자. scheduleWithFixedDelay ( 새 의 Runnable은 () {
공공 무효 실행 () {
{시도
. ClientWorker을 이. checkConfigInfo ();
} 캐치 ( Throwable를 VAR2를) {
. ClientWorker . LOGGER 오류 ( "[" + . 에이전트 getName () + "] [서브 -check] 체크 에러 "회전 VAR2를);
} } } 1L, 10L, TimeUnit와. MILLISECONDS);
얼마나 많은 요청 롱 폴링을 할까?
일괄 처리
공공 무효 checkConfigInfo () {
//分任务
INT listenerSize = (( 지도) 이. cacheMap. 수 ()). 크기();
//向上取整
INT longingTaskCount = ( int)를 수학. CEIL (( 더블) listenerSize / ParamUtil. getPerTaskConfigSize ());
경우 (( 더블) longingTaskCount > .이 currentLongingTaskCount) {
위해 ( int로 I = ( int)를 이. currentLongingTaskCount; I < longingTaskCount; ++내가) {
// 변화의 무질서한 과정이 문제가 될 수 있습니다 지금이 작업을 수행 할 작업 목록에 대해 생각해야 할 것인지 여부를 파악합니다
. 다음은이 . ExecutorService를 실행] ( 새 새 . ClientWorker LongPollingRunnable ( 내가))
} . 다음은이 currentLongingTaskCount = ( 더블) longingTaskCount; } }
로컬 구성 확인 모니터 ->
캐시 MD5 확인
업데이트 된 파일을 확인
ClientWorker.this.checkLocalConfig (cacheData);
경우 (cacheData.isUseLocalConfigInfo ()) {
cacheData.checkListenerMd5 ();
}
원격 확인
목록 < 문자열 > changedGroupKeys = ClientWorker. 이. checkUpdateDataIds ( cacheDatas, inInitializingCacheList);
반복자 var16 = changedGroupKeys. 반복자 ();
의 groupId + dataId + 세입자 원격으로 확인
ClientWorker. 이. getServerConfig ( dataId, 기, 거주, 3000L);
무효화 checkListenerMd5 () {
반복자 VAR1를 = 이. 청취자. 반복자 () 동안 ( . VAR1 hasNext ()) { ManagerListenerWrap 랩 = ( ManagerListenerWrap) VAR1. 다음 것(); 만약 ( ! 이. MD5. 등호 ( 랩. lastCallMd5)) { 이. safeNotifyListener ( .이 dataId, 이. 닐기, 이. 함량 이. MD5, 랩); } } }
구성 가져 오기
원격 구성을로 이동하지 않을 경우, 현지에 가서 받기
내용 = LocalConfigInfoProcessor. getFailover ( .이 . 제 getName () dataId, 그룹 세입자);
(만약 내용 ! = NULL) {
CR. 의 setContent ( 콘텐츠);
} 다른 {
내용 = 이. 노동자. getServerConfig ( dataId, 그룹 세입자 timeoutMs);
}