предисловие
Кто-то спрашивал в сообществе раньше, почемуprovider
конечное применениеnetty4
в видеtransport
свойства, ноconsumer
Терминал не запустился, не тоprovider
конфигурация перезаписываетсяconsumer
конец?
Это требование на самом деле очень нормальное.Если мы хотим обновить кластер dubbo для использованияnetty4
В качестве метода передачи, если вы можете настроить наложение, просто изменитеprovider
Вот так, удобнее. Но на самом деле прозрачная передача не будет настроена.
Конфигурации, которые можно передавать прозрачно, перечислены в руководстве пользователя dubbo, например:timeout
иretries
Подождите, причина прозрачной передачи также указана в документе: возьмем в качестве примера тайм-аут, сторона провайдера знает время выполнения лучше, чем сторона потребителя. В основном, некоторые параметры используются на уровне метода. должны знать о том,protocol
Это также будет прозрачным.consumer
Терминал может принимать только пассивно, в отличие от других элементов конфигурации,protocol
будет охватыватьconsumer
конечная конфигурацияprotocol
из.
Debug
Давайте взглянем на конкретный метод реализации.Хотя я ранее не отлаживал его подробно, я, вероятно, догадываюсь, что это достигается путем передачи его из zk через url.
Прежде чем смотреть на код + отладку, сначала проясните концепцию, хотя даббо рекомендуетprovider
настроить тайм-аут, ноprovider
Если оба иconsumer
настроитьtimeout
, то будет использоватьconsumer
Настроил, вот вычитаю картинку из документа для поясненияtimeout
Приоритет конфигурации:
В документации четко указано, что еслиconsumer
конец настроенtimeout
, то он будет использоватьconsumer
настроен на терминале, если нет, перейдите кprovider
конец найти.
Давайте сначала проверим это и посмотрим на внутренний приоритет,Consumer
Конфигурация:
Здесь я обвел триtimeout
Конфигурация.
Если следовать порядку на схеме, следует использовать элемент конфигурации 1500. Давайте посмотрим на фактический эффект, здесь я использую протокол dubbo, вызов rpc будет отправлен наDubboInvoker#doInvoke
, то есть здесь задается таймаут.
Давайте посмотрим на эффект отладки:
Действительно, как мы видели раньше,timeout
за1500
.
видишь ли, еслиProvider
иConsumer
сосуществоватьtimeout
обстоятельства ситуации.
C (далее CConsumer
, Р означаетProvider
)Конфигурация:
<dubbo:reference timeout="2000" id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
Конфигурация П:
<dubbo:service timeout="2500" interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
Эффект:
Это действительно конфигурация C, которая имеет приоритет над конфигурацией P.
Давайте посмотрим, настроен ли Cprotocol
заrmi
протокол, в то время как P настроенprotocol
заdubbo
Что случается:
Точка останова все еще сработалаDubboInvoker
внутри. Это показывает, что наш протокол RMI не вступил в силу, и C может только принудительно принять конфигурацию P.protocol
.
Код
ПосмотримDubbo
Как добиться охвата конфигурации. На самом деле, я сказал это в своей предыдущей статье,Inovker
фактически поддерживается вDirectory
в структуре.DubboInvoker
Например,timeout
вынесено в код:int timeout = getUrl().getMethodParameter(methodName, Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
,Constants.DEFAULT_TIMEOUT
равно 1000, то есть если нигде ничего не настроеноtimeout
, составляет 1 с.
getUrl
просто верни этоDubboInvoker
соответствующий URL-адрес. этоUrl
Когда он был установлен?Мы уже догадались,и он прозрачно передается через zk. Здесь мы можем примерно определить, т.Consumer
Создается при запускеInvoker
, URL-адрес (время ожидания) установлен. посмотриDirectory#refreshInvoker
метод, который основан наProvider
изUrl
генерироватьInvoker
из. Среди них есть эта фраза:Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);
Продолжайте преследовать:
// sth...
for (URL providerUrl : urls) {
// sth...
// 合并url
URL url = mergeUrl(providerUrl);
// sth...
if (invoker == null) {
try {
boolean enabled = true;
// 这里根据上面的那个合并之后的url创建invoker
if (enabled) {
invoker = new InvokerDelegate<T>(protocol.refer(serviceType, url), url, providerUrl);
}
} catch (Throwable t) {
//sth ...
}
}
}
// sth...
return newUrlInvokerMap;
Здесь мы можем увидеть это первымmergeUrl
Метод, глядя на название, вероятно, знает, что локальный url и удаленный url объединены, что и должно быть выполнено здесь.timeout
крышка, потому чтоconsumer
иprovider
в конфигурации с двумяtimeout
.
Затем он генерируется в соответствии с синтезированным URL-адресом.Invoker
, здесь будетmerge
После размещения URLInvoker
В будущем, когда вызов rpc действительно будет выполнен,timeout
из этогоurl
получен из.
посмотриmergeUrl
метод, первая строкаmerge
работать:
providerUrl = ClusterUtils.mergeUrl(providerUrl, queryMap);
здесьqueryMap
,Да:this.queryMap = StringUtils.parseQueryString(url.getParameterAndDecoded(Constants.REFER_KEY));
Полученный, который содержит некоторые локально заданные свойства, такие какtimeout
, даю каштан, конфигурация С:<dubbo:reference timeout="2000" id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
когда,queryMap
Содержание:
Мы видим, что на стороне C настроено время ожидания.
Тогда слияние фактически объединяет эти параметры на стороне P (такие какtimeout
) и параметры стороны C объединяются для создания окончательного URL-адреса.
ПосмотримClusterUtils#mergeUrl
метод:
Map<String, String> map = new HashMap<String, String>();
Map<String, String> remoteMap = remoteUrl.getParameters();
// map中先放remoteMap
if (remoteMap != null && remoteMap.size() > 0) {
map.putAll(remoteMap);
// do sth...
}
// sth...
if (localMap != null && localMap.size() > 0) {
map.putAll(localMap);
}
// sth...
return remoteUrl.clearParameters().addParameters(map);
map
будущееUrl
некоторые параметры конфигурацииtimeout
прямо внутри.remoteMap
Это параметр, настраиваемый на стороне P. localMap — это локально настраиваемый параметр, который настраивается на стороне C.
В коде поставить первымremoteMap
, поставить послеlocalMap
, та же самая клавиша закрыта, поэтому появится сторона Ctimeout
будет покрывать сторону Ptimeout
явление ~ но еслиlocalMap
нетtimeout
, буду использоватьremoteMap
изtimeout
и настроен с помощью Ptimeout
.
постскриптум
Dubbo возобновил техническое обслуживание, и будет добавлено много новых функций.Я надеюсь, что все будут участвовать в построении сообщества dubbo, активно задавать вопросы на github и предлагать новые идеи~
# настроить Компиляция заметок OPENJDK