Ставьте лайк и смотрите снова, формируйте привычку и ищите в WeChat [Третий принц Ао Бин] Подпишитесь на этого программиста, который любит писать о чувствах.
эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.
В прошлой статье мы уже поняли весь процесс предоставления услуги Dubbo.В этой статье я покажу вам весь процесс внедрения службы Dubbo.После написания следующей статьи о введении этой услуги будет полная ссылка Посмотрим, у всех ли возникнет ощущение, что две вены Рен и Ду были открыты.
В процессе написания статьи C также нашел кое-что об официальном сайтеКусок пирога, будет упомянуто ниже.
Без лишних слов, давайте сразу к делу.
Общий процесс обращения за услугой
мы узналиProvider
Выставляйте свои собственные службы, регистрируйтесь в реестре иConsumer
Это не что иное, как получение информации о провайдере из центра регистрации с помощью волны операций, а затем инкапсуляция вызывающего класса для более глубокого взаимодействия с провайдером.
Я уже упоминал в предыдущих статьяхDubbo
Один из исполняемых файловInvoker
, все вызовы должны перемещаться ближе к Invoker, поэтому можно сделать вывод, что Invoker должен быть сгенерирован первым, а затем, поскольку фреймворк должен развиваться в направлении не вторжения в бизнес-код, тогда нашему потребителю необходимо незаметно вызывать удаленный интерфейс. , поэтому нам нужно создать класс Proxy, обернув его, чтобы скрыть основные детали.
Общий общий процесс выглядит следующим образом:
Сроки введения услуги
Внедрение сервисов — это то же самое, что и экспонирование сервисов, и соответствующие bean-компоненты генерируются путем синтаксического анализа механизма пользовательских меток Spring.Provider Service соответствует ServiceBean, а Consumer Reference соответствует ReferenceBean..
Мы проанализировали время предоставления сервиса в предыдущей статье.После того, как контейнер Spring будет обновлен, он будет раскрыт.Существует два вида времени внедрения сервиса.Первый голоден, а второй ленив.
Голодный китайский реализован SpringInitializingBean
в интерфейсеafterPropertiesSet
метод, контейнер вызываетReferenceBean
изafterPropertiesSet
метод при внедрении услуг.
Ленивый стиль заключается в том, чтобы начать процесс импорта только тогда, когда служба внедряется в другие классы, то есть введение службы начнется, когда она будет использоваться.
По умолчанию Dubbo использует службы ленивого импорта., если вам нужно использовать голодный китайский стиль, вы можете настроитьdubbo:referenceСвойство init включено.
Мы видим, чтоReferenceBean
также понялFactoryBean
Интерфейс, вот точка интервью о Spring, я возьму вас, чтобы проанализировать волну.
BeanFactory, FactoryBean, ObjectFactory
Вот эти три вещи, я возьму их и расскажу о них Буквально, мы можем знать, что BeanFactory
,ObjectFactory
это фабрикаFactoryBean
это фасоль.
BeanFactory
По сути, это IOC-контейнер, я не буду разбирать различные классы реализации, короче, бины в Spring все находятся под его управлением, иFactoryBean
Это также компонент Bean, поэтому им также управляет BeanFactory.
ТотFactoryBean
Что это за бин? Он на самом деле инкапсулирует Бин, который вам действительно нужен.Когда вы действительно хотите получить Бин, контейнер вызовет метод FactoryBean#getObject(), и вы можете выполнять некоторые сложные операции сборки в этом методе.
Этот метод инкапсулирует фактический желаемый объектсложный процесс создания.
На самом деле здесь все очень ясно, то есть, когда создание реального желаемого bean-компонента более сложное, или некоторые сторонние bean-компоненты трудно модифицировать, FactoryBean используется для инкапсуляции слоя, который скрывает детали базовое создание, которое удобно для создания bean-компонента.
ObjectFactory — это сценарий отложенного поиска. Это обычная фабрика. Когда объект ObjectFactory получен, это эквивалентно тому, что Bean не был создан. Только когда используется метод getObject(), экземпляр Bean и другие жизненные циклы будет запущен.
Он в основном используется для временного получения объекта Bean Holder. Если он загружается слишком рано, это может вызвать некоторые непредвиденные ситуации. Например, когда Bean A зависит от Bean B, если A инициализируется преждевременно, состояние B может быть In промежуточное состояние, использование A в это время может легко привести к некоторым ошибкам.
подводить итогиBeanFactory — это контейнер IOC, FactoryBean — это специальный компонент Bean, используемый для инкапсуляции и создания более сложных объектов, а ObjectFactory в основном используется для отложенных сценариев поиска, отложенного создания экземпляров объектов..
Три способа внедрения услуги
Внедрение услуг делится на три типа: первое — локальное введение, второе — прямое подключение для внедрения удаленного обслуживания, а третье — введение удаленного обслуживания через центр регистрации.
местный импортНе знаю, осталось ли у вас впечатление.В предыдущем процессе экспонирования сервисов каждый сервис будет экспонироваться локально через протокол injvm (разумеется, если у вас scope=remote, локальной ссылки не будет), т.к.Бывает ситуация, когда сервер является и Провайдером, и Потребителем, и тогда он может сам вызвать свой сервис, поэтому выполняется локальный импорт, что позволяет избежать накладных расходов на удаленные сетевые вызовы.
такВведение службы сначала пойдет в локальный кеш, чтобы узнать, есть ли какая-либо локальная служба..
Прямое подключение к сервису удаленного импорта, это реально используется в случае тестирования буднего дня.Нет необходимости запускать регистрационный центр.Потребитель напрямую настраивает адрес жестко запрограммированного провайдера, а затем подключается напрямую.
Реестр представляет удаленные службы,это ключевой момент.Потребитель узнаёт актуальную информацию о Провайдере через центр регистрации,а затем вводит услугу.Также включает в себя несколько центров регистрации и несколько поставщиков одной и той же услуги.Как выбрать как инкапсулировать,как выполнять балансировку нагрузки, Допускать сбои и делать пользователей незаметными — техническая задача.
В этой статье используется единый реестр для внедрения удаленных служб., давайте посмотрим, как это делает Dubbo.
Анализ процесса внедрения услуги
По умолчанию используется ленивый, поэтому запись, представленная службой, представляет собой метод getObject класса ReferenceBean.
Видно, что вызвать метод get очень просто, а если ссылка в данный момент не существует, выполнить метод init.
Небольшая проблема с официальным сайтом
проблема вif (ref == null)
Эта строка на самом деле является братом, который обнаружил, что этот REF не равен NULL при отладке, поэтому я не мог ввести метод инициализации. Позже он обнаружил, что это связано с тем, что идея предназначена для отображения информации об объекте. Информация.
toString вызывает AbstractConfig#toString, а этот метод вызывает метод getObject ReferenceBean посредством отражения, вызывая введение действия службы, поэтому, когда дело доходит до точек остановаref != null
.
Видно, что вызов отражения осуществляется через имя метода, а getObject начинается с get, поэтому он и будет вызываться.
Итак, этот приятель выдвинул PR, но он сначала не был принят. Член подумал, что это не ошибка. Идея заключалась в том, чтобы настроить его так, чтобы toString не вызывался.
Однако другой участник посчитал, что этот PR был очень хорошим, и глава проекта Dubbo во втором поколении, Beiwei 30, также выступил, поэтому этот PR был принят.
До сих пор мы знали об этой небольшой проблеме, а потом на официальном сайте написано очень четко.
Но здесь возникает небольшая проблема, о которой я упоминал в статье ранее, что моя версия исходного кода2.6.5, это было загружено в выпусках github. Я действительно знал об этой проблеме с тострингом довольно давно. Я думал о стабильной партии моей 2.6.5. Кто знал, что она перевернется.
Когда я занимался отладкой, я не вошел в метод init, потому что ref не был равен нулю, поэтому я был удивлен, я заглянул внутрь метода toString,2.6.5Версия не менялась? getObject не фильтруется, поэтому он все равно вызывается.
я открыл его снова2.7.5Версия кода, признанная измененным суждением.
я специально пошел2.6.6версии кода, было обнаружено, что он также был модифицирован, поэтому эта модификация не сопровождается2.6.5выпуск версии, но2.6.6, если только я не получил поддельную сумку, что я и сказал о небольшой проблеме, но это не имеет большого значения.
На самом деле, то, о чем я хочу рассказать в этом абзаце, это PR. Как экспортер программного обеспечения с открытым исходным кодом, многие детали также очень важны. Эта проблема фактически влияет на отладку исходного кода. Потому что вы не знакомы с кодом. , вы точно запутаетесь.Кто знает, какой фоновый поток был введен асинхронно.
Парень, который упомянул этот пиарПотребовалось два часа, чтобы выяснить настоящую причину, так что, хотя это не ошибка, это затронет тех студентов, которые хотят понять внутреннюю структуру Dubbo. Это решение изменения конфигурации для адаптации не рекомендуется. К счастью, окончательное решение - изменить код.
Что ж, вернемся к сегодняшней теме, следующий разбор — метод init, который меня не пускает.
Анализ исходного кода
Метод init очень длинный, но большая часть его заключается в проверке конфигурации и последующем построении конфигурации в карту, я не буду разбирать этот большой раздел, давайте просто посмотрим, как выглядит построенная карта.
Затем введите ключ методом createProxy, который можно получить из названия создаваемого прокси, т.к. код очень длинный, будуанализ по частям.
Если он локальный, то напрямую создайте URL, который использует локальный протокол, а затем введите сервис, то есть refprotocol.refer, Этот метод будет проанализирован позже, и локальное введение не будет углубленным, просто перейдите к exporterMap, предоставленный предыдущей службой, чтобы заставить ее служить.
Если он не локальный, то должен быть удаленным.Следующий шаг – определить, идет ли речь о прямом подключении точка-точка к провайдеру или получить информацию о провайдере через центр регистрации и затем подключиться к провайдеру.Разберем ситуация, когда URL-адрес настроен.Если URL-адрес настроен, он не подключен напрямую.Адрес является адресом реестра.
Тогда нет настройки URL.Путь здесь заключается в том, чтобы ввести удаленные службы из реестра.
Окончательный объединенный URL выглядит так.
Видно, что эта часть фактически собирает URL по разным параметрам, потому что наше адаптивное расширение нужно проводить по параметрам URL.
Пока что сначала нарисую картинку, чтобы можно было вас обвести.
Вот собственно и весь процесс.Если кратко описать, то сначала проверьте конфигурацию, постройте карту через конфигурацию, затем используйте карту для построения URL, а затем используйте механизм адаптивного расширения для вызова соответствующего протокола. по URL-адресу, чтобы получить соответствующий инициатор.
При наличии нескольких URL-адресов сначала пройдите и создайте инициатор, затем инкапсулируйте его с помощью StaticDirectory, а затем объедините его с помощью кластера, предоставив только один инициатор.
Затем создайте прокси, инкапсулируйте инициатора, чтобы он возвращал ссылку на службу, а затем потребитель вызывает этот прокси-класс.
Я полагаю, что общий процесс внедрения службы был известен благодаря диаграмме и приведенному выше резюме, но остается еще много деталей, например, как получить адрес провайдера из реестра и что внутри вызывающего? Не волнуйтесь, продолжим смотреть.
На предыдущем снимке экрана мы видим, что в настоящее время протоколом является реестр, поэтому это RegistryProtocol#refer, давайте взглянем на этот метод.
Главное получить инстанс реестра, а потом вызвать doRefer для реального реферала.
Этот метод очень критичен, вы можете видеть, что сгенерированный RegistryDirectory
Этот каталог набит экземпляром реестра, который сам реализует NotifyListener
интерфейс, такМониторингом реестра на самом деле занимается этот парень.
Затем зарегистрируйте свою собственную информацию в реестре и подпишитесь на узел провайдера реестра, узел конфигураторов и узел маршрутизаторов,После подписки RegistryDirectory получит информацию об этих узлах, что вызовет генерацию DubboInvoker, то есть Invoker, используемого для удаленных вызовов..
Затем оберните его через кластер, чтобы получить Invoker, чтобы у службы могло быть несколько поставщиков, и, наконец, запишите информацию в ProviderConsumerRegTable, а затем верните Invoker.
так что мы знаем Conusmer
Это необходимо для регистрации вашей собственной информации в реестре в RegistryProtocol#refer и подписки на некоторую связанную информацию о провайдере и конфигурации.Давайте посмотрим, какая информация возвращается подпиской.
понятноProvider
После получения информации вы можете активировать DubboProtocol#, ссылаясь на мониторинг (конкретный протокол для вызова зависит от протокола URL-адреса, здесь мы протокол dubbo), я не буду отслеживать весь процесс запуска один за другим.
Наконец-то мы получили пульт от реестра Provider
информацию, а затем представить услугу.
Дело в том, чтоgetClients
, потому что в конце концов необходимо совершать сетевые вызовы с удаленными службами, а для получения экземпляров клиентов используется getClients.Тип экземпляра — ExchangeClient, а нижний уровень полагается на Netty для сетевого взаимодействия, и вы можете видеть, что по умолчанию используется общее соединение.
getSharedClient
Разбирать не буду, а найду клиента через удалённый адрес.В этом клиенте тоже есть функция подсчёта ссылок.Если на удалённом адресе нет клиента, вызываем initClient.Посмотрим на метод initClient.
и этоconnect
окончательное возвращениеHeaderExchangeClient
Внутри инкапсулирован NettyClient
.
и, наконец, получитьInvoker
Вот как это выглядит, вы можете увидеть много записанной информации, в основном все, что должно быть там, то, что я здесь, это случай, когда соответствующий сервис имеет только один URL-адрес, а несколько URL-адресов не более чем использованиеdirectory
иcluster
Еще один слой упаковки.
в конце концов позвонитreturn (T) proxyFactory.getProxy(invoker);
Возвращает прокси-объект, который не будет анализироваться.
На этом этапе весь процесс анализируется, интересно, всем ли понятно? Дополню предыдущую картинку, и приду к полному процессу, чтобы все прошли заново.
резюме
Я думаю, что проанализировать весь процесс несложно, если подытожить, то это не что иное, как формирование URL-адреса через конфигурацию, а затем получение соответствующего класса реализации для внедрения службы через самоадаптацию.Если это реестр, то это зарегистрирует свою информацию в реестре, а затем подпишется на реестр.provider
ip и прочая информация, а потом пройтиnetty
клиент для подключения.
и через directory
иcluster
Выполните экранирование, отказоустойчивость и балансировку нагрузки нескольких базовых поставщиков услуг и т. д. После этой статьи будет проведен подробный анализ, и, наконец, получите упакованный пакетinvoker
Затем прокси-класс получается посредством динамической инкапсуляции прокси, так что вызывающий интерфейс может вызвать метод без восприятия.
Наконец
Прочитав эту статью сегодня, я считаю, что у всех должно быть четкое представление о внедрении сервисов.На самом деле, есть еще много деталей, которые я не проанализировал, такие как сборка некоторых цепочек фильтров.Об этом собственно и упоминается в статья о сервисном воздействии.Тот же сервис.Также есть цепочки фильтров для цитирований,но они не будут расширяться из-за ограниченного места.Важно уловить основную нить.
До сих пор я провел вас через это первымDubbo
Общая концепция и общий процесс, представленныйDubbo SPI
механизм и анализирует暴露流程
и服务引入
Процесс, конкретные детали еще предстоит изучить самому, и общий процесс почти такой же.
Серия даббо тоже подходит к концу.Хотя я знаю,что каждый раз когда пишу о хардкорных технологиях друзей намного меньше,но я все равно хочу закончить эту серию.Спасибо за поддержку.
Я Ао Бин, чем больше ты знаешь, тем больше ты не знаешь, увидимся в следующий раз!
талантнаш【Три подряд】Это самая большая движущая сила для создания Ao Bing.Если в этом блоге есть какие-либо ошибки и предложения, пожалуйста, оставьте сообщение!
Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.