《Dubbo Series》-Процесс предоставления услуги Dubbo

Java Dubbo
《Dubbo Series》-Процесс предоставления услуги Dubbo

Ставьте лайк и смотрите снова, формируйте привычку и ищите в WeChat [Третий принц Ао Бин] Подпишитесь на этого программиста, который любит писать о чувствах.

эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.

На этой неделе я ездил в Сучжоу, чтобы встретиться с боссом. Я не ожидал встретить кучу поклонниц, включая мою кузину в бане. Как только моя кузина встретила меня, я сказал Ао Бин, мне очень нравится серия даббо вы написали, вы можете следить за мной?Можете ли вы рассказать о процессе его обслуживания?

Я улыбнулся: Дурак, почему ты раньше не сказал?

Сегодня я покажу вам процесс предоставления услуг Dubbo.Этот процесс на самом деле является одним из основных процессов в Dubbo.Он связан с тем, как ваш провайдер может быть известен и назван Потребителем.

Анализ исходного кода будет проводиться и сегодня, ведь нам нужно глубоко понять, как это делает Dubbo, и только покопавшись в нем, мы сможем это понять.

Не беспокойтесь о проблеме с исходным кодом, потому что это не только анализ исходного кода, Ao Bing также поможет каждому понять через язык рисования и резюме, а при встрече с интервьюерами язык резюме является наиболее важным, потому что это может быть не так. Офицеры также понимают или помнят определенные детали.

Кстати, исходный код версии 2.6.5.

URL

Но во время обслуживания необходимо провести анализ процесса воздействия, прежде чем говорить об URL, URL и что некоторые люди говорят об этой связи Dubbo? Отношения, отличные отношения!

Обычно мы говорим, что URL-адрес относится к унифицированному локатору ресурсов, сеть обычно относится к адресу, по сути, строка — это строка, содержащая специальный формат, стандартный формат выглядит следующим образом:

protocol://username:password@host:port/path?key=value&key=value

Dubbo — это URL-адрес как согласованный тип параметра, называемый публичным контрактом, который должен взаимодействовать с URL-адресом для связи.

Если подумать, если нет принуждения,Без указания общего контракта разные интерфейсы будут передавать информацию с разными параметрами, используйте Map на некоторое время и отдельные строки на некоторое время, что делает весь беспорядок, и синтаксический анализ не может быть унифицирован.

иПосле использования единого договора код более стандартизируется и формируется единый форматКаждый может видеть параметры с первого взгляда, и нет необходимости спекулировать в формате некоторых параметров и так далее.

иИспользование URL-адреса в качестве общего ограничения позволяет в полной мере использовать наше впечатление от существующих концепций, которые легко понять и легко расширить., мы знаем, что URL нужно добавить с параметрами, просто склеить обратно и все.

Поэтому Dubbo использует URL как конфигурационную шину, проходящую через всю систему, а URL в исходном коде есть везде.

Конкретные параметры URL-адреса следующие:

  • Протокол: относится к различным протоколам в dubbo, например: dubbo thrift http
  • имя пользователя/пароль: имя пользователя/пароль
  • хост/порт: хост/порт
  • путь: имя интерфейса
  • параметры: пара ключ-значение параметра

Разбор конфигурации

Вообще для настройки Dubbo часто используется XML или аннотации.Расскажу немного о XML.На самом деле эта часть относится к Spring.Я не буду делать слишком много анализа,поэтому вкратце расскажу об общем принципе.

Dubbo использует файлы конфигурации Spring для расширения пользовательского синтаксического анализа. Например, dubbo.xsd используется для ограничения тегов и соответствующих атрибутов в конфигурации XML. Затем Spring будет искать spring.schemas и spring.handlers.

spring.schemas — указать путь к файлу ограничений, а spring.handlers — указать использование обработчика для разбора метки.Фреймворк, в отношении которого вы настроены оптимистично, зарезервирует точки расширения.Проще говоря, это поиск фиксированного имя файла фиксированного пути.Вы расширяете вещи, чтобы пользователи могли использовать их гибко.

Давайте посмотрим, что делает DubboNamespaceHandler.

Проще говоря, это связано с классом синтаксического анализа, соответствующим тегу, чтобы при анализе тега он знал, что синтаксический анализ делегирован соответствующему классу синтаксического анализа.Суть в том, чтобы сгенерировать Spring BeanDefinition, а затем использовать Spring чтобы наконец создать соответствующий объект.

Весь процесс оказания услуги

Прежде чем погрузиться в исходный код, давайте взглянем на общий процесс.Общее впечатление, что закружиться не так-то просто.

отпоток кодаЕго можно условно разделить на три шага (в этой статье по умолчанию необходимо предоставить доступ к службам реестра).

Первым шагом является обнаружение конфигурации.Если какая-то конфигурация пуста, она будет создана по умолчанию и собрана в URL.

Второй шаг — предоставление услуг, включая доступ к локальным службам и удаленным службам.

Третий шаг — регистрация службы в реестре.

отОбъект Строительство Трансформация ПерспективаВидение можно разделить на два этапа.

Первым шагом является преобразование класса реализации службы в Invoker.

Вторая часть заключается в преобразовании Invoker в Exporter через определенный протокол.

Анализ исходного кода воздействия службы

Затем мы переходим к этапу анализа исходного кода.На красном снимке экрана анализа конфигурации выше мы видим, что тег службы на самом деле является соответствующим ServiceBean.Давайте посмотрим на его определение.

Здесь также используется контент, связанный с Spring, вы можете видеть, что он реализуетApplicationListener<ContextRefreshedEvent>, это будетВызывается после завершения обновления контейнера Spring IOConApplicationEventметод, и то, что этот метод делает, является обслуживанием, которая является начальной точкой предоставления услуги.

Видно, что если это не отложенная экспозиция, и она не была экспонирована, и поддерживает экспозицию, метод экспорта будет выполнен, и экспорт в конечном итоге вызовет метод экспорта родительского класса, давайте посмотрим.

Главное — проверить конфигурацию и выставить сервис, если нужно выставить.Метод doExport очень длинный, но это процесс проверки конфигурации.Несмотря на то, что он необходим, он не находится в центре нашего внимания. Мы сосредоточимся на методе doExportUrls внутри.

Видно, что Dubbo поддерживает несколько реестров и поддерживает несколько протоколов.Если служба имеет несколько протоколов, ее необходимо выставить.Например, если и протокол dubbo, и протокол гессиана поддерживаются одновременно, то службе необходимо для распределения по нескольким протоколам с использованием двух протоколов Реестр (если их несколько) предоставляет доступ к реестру.

Я не буду анализировать метод loadRegistries, а соберу URL-адреса, относящиеся к реестру, в соответствии с конфигурацией.Я покажу вам, как выглядят сплайсированные URL-адреса.

registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&pid=7960&qos.port=22222&registry=zookeeper&timestamp=1598624821286

Следующее, на чем мы сосредоточимся, — это метод doExportUrlsFor1Protocol.Этот метод довольно длинный.Я перехватлю общую часть, чтобы показать основные шаги.

На данный момент созданный URL-адрес выглядит так, и вы можете видеть, что это протокол dubbo.

Затем нам нужно выставить сервис по URL. Давайте еще раз посмотрим на код, я сделаю скриншот этого кода, потому что он нуждается в объяснении точки останова.

местное воздействие

Давайте еще раз взглянем на метод exportLocal, которыйместное воздействиеПринимая протокол INVM, вы можете увидеть, что он устроил новый URL для изменения соглашения.

Давайте посмотрим на этот URL, и мы увидим, что протокол стал injvm.

Экспорт здесь фактически включает в себя адаптивное расширение, упомянутое в предыдущей статье.

 Exporter<?> exporter = protocol.export(
                    proxyFactory.getInvoker(ref, (Class) interfaceClass, local));

Метод экспорта протокола помечен аннотацией @ Adaptive, поэтому будет сгенерирован прокси-класс, а затем прокси-класс узнает конкретный протокол в соответствии с параметрами URL в Invoker, а затем выберет соответствующий класс реализации для экспорта через Механизм Dubbo SPI и этот метод Вызывается метод InjvmProtocol#export.

Давайте посмотрим, как выглядит преобразованный экспорт.

Как видно из рисунка, на самом деле это конкретная реализация послойной инкапсуляции.Инвокер фактически создается Javassist.Конкретный процесс создания proxyFactory.getInvoker анализироваться не будет.Студенты, интересующиеся Javassist, поймут это сами, и может написать позже.Один, почему dubbo использует javassist вместо динамического прокси jdk, этоПотому что быстрый джавасист.

Зачем инкапсулировать его как вызывающего

Что касается того, почемуИнкапсуляция в качестве вызывающего на самом деле заключается в том, чтобы скрыть детали вызова и единообразно раскрыть исполняемое тело., так что вызывающий объект просто использует его и инициирует вызов вызова, который может быть локальной реализацией, удаленной реализацией или реализацией кластера.

Зачем делать локальную экспозицию?

Потому что может быть случай, когда одна и та же внутренняя ссылка JVM их сервисы, поэтомуОткрытая локальная служба может напрямую использовать службу той же JVM, когда она вызывается внутри, избегая связи между сетями..

У некоторых студентов может немного закружиться голова, ничего, я сразу сделаю картинку, чтобы показать вам всем.

Еще одна волна анализа диаграмм последовательности для exportLocal.

дистанционное воздействие

На данный момент локальная экспозиция завершена, и следующим шагом является удаленная экспозиция, то есть следующая часть кода

А также локальное воздействие, необходимость запаковки в Invoker, но здесь относительно сложно, давайте посмотрим в реестрURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()), вставленный в то, что URL.

registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&export=dubbo://192.168.1.17:20880/com.alibaba.dubbo.demo.DemoService....

Так как он очень длинный, я не буду его вырезать, вы видите, что используется протокол реестра, а затем в параметрах есть export=dubbo://, это протокол dubbo, поэтому мы можем знать, что мы сначала найдет RegistryProtocol через протокол реестра для экспорта.И в этом методе значение будет получено в соответствии с полем экспорта, а затем будет выполнен метод экспорта DubboProtocol.

Все должны держаться, и разбор всего процесса почти закончен!

Теперь мы сосредоточимся на методе RegistryProtocol#export, давайте сначала пройдемся по всему процессу, а затем приступим к анализу doLocalExport.

Видно, что этот шаг в основном предназначен для преобразования вышеупомянутого export=dubbo://... в экспортер, а затем получения соответствующей конфигурации центра регистрации.Если требуется регистрация, зарегистрируйтесь в центре регистрации и запишите предоставление службы в таблице ProviderConsumerRegTable.На самом деле это вставка инициатора в ConcurrentHashMap, ключ — это полное имя интерфейса службы, значение — набор, и обернутый инициатор будет храниться в наборе.

Давайте сосредоточимся на внутренней стороне метода doLocalExport.

Этот метод не сложный. Он в основном выставляет экспортер в соответствии с протоколом Dubbo по URL-адресу. Далее давайте рассмотрим метод DubboProtocol#export.

Ключом к этому является открытие сервера, а RPC должен нуждаться в удаленных вызовах.Здесь мы используем NettyServer для прослушивания сервисов.

Дальше не буду следовать, резюмирую, что экспорт протокола Dubbo в основном заключается в построении ключа по URL (например, есть группы, имена интерфейсов, порты и т.д.), а потом ключ ассоциируется с вызывающей стороной.Если служба выставляется в первый раз, будет создан прослушивающий сервер, значение по умолчанию — NettyServer, и будут инициализированы различные обработчики, такие как сердцебиение, кодек и т. д.

Вроде процесс закончился? Нет, Фильтр еще не появился? Существуют скрытые меры, и те, кто внимательно читал предыдущий Dubbo SPI, знают, где он срабатывает.

Фактически, вышеуказанный протокол является прокси-классом, и конкретный класс реализации будет найден внутри через механизм SPI.

Эта картинка из предыдущей статьи, вы можете увидеть конкретную реализацию экспорта.

Ознакомьтесь с основными моментами следующей статьи.Класс в конце оболочки будет кэшироваться посредством сканирования пакетов Dubbo SPI, а затем, когда конкретный класс реализации будет загружен, класс реализации будет упакован для реализации AOP Dubbo.Мы видим, какая оболочка класс DubboProtocol есть.

Вы можете видеть, что их два, ProtocolFilterWrapper и ProtocolListenerWrapper.

Это цепочка вызовов для всех классов реализации протокола.

При экспорте ProtocolFilterWrapper инициатор будет собран с различными фильтрами.

Посмотрите на 8 из них.

Давайте посмотрим, что сейчас есть в zookeeper, и обратим внимание на директорию dubbo.

Эти две службы занимают два каталога, конфигураторы и провайдеры соответственно.Папка записывает строку URL-адресов, а значением является IP-адрес поставщика услуг.

На этом экспозиция сервисного процесса почти закончена.Вы видите, что в нем еще есть некоторый контент, и вам еще нужно освоить Dubbo SPI.В противном случае некоторые моменты, такие как самоадаптация, все еще сложны для понимания. Напоследок еще раз проведу вас по полной блок-схеме, там еще много деталей, но я не буду ее анализировать, если это не костяк, иначе статья будет немного разрозненной.

Тогда обратитесь к временной диаграмме официального сайта.

Суммировать

По-прежнему рекомендуется прервать суть и пройтись по ней самостоятельно, чтобы она была более понятной.Когда интервьюер спрашивает, это вовсе не ложь, но пока вы внимательно читаете эту статью, это почти то же самое. , а общий процесс, можно сказать, доказывает, что вы читали После прочтения исходного кода некоторые детали невозможно вспомнить.Подумайте о коде, который вы написали сами за месяц или два, вы его помните? Не говоря уже о написании других людей.

По сути, мне не надо анализировать исходники, я могу напрямую диктовать + рисовать картинки, что лучше для просмотра, но зачем мне все-таки выкладывать код?

Я хочу провести всех через процесс с уровня исходного кода, что сделает каждого более уверенным.В конце концов, одно дело понять картину.Когда вы действительно увидите исходный код, вы будете знать некоторые моменты интуитивно.Например , оригинальный кеш Просто положил его в карту, цепочка фильтров изначально была сращена вот так и тд.

Как правило, процесс предоставления услуги начинается при обновлении контейнера Spring IOC Конкретный процесс заключается в получении URL-адреса в соответствии с конфигурацией, а затем с использованием механизма Dubbo SPI для выбора соответствующего класса реализации в соответствии с параметрами URL-адреса. реализовать расширение.

Динамически инкапсулировать ref (класс реализации службы, который вы написали) через javassist, единообразно выставить Invoker, чтобы сделать вызов удобным, скрыть детали базовой реализации, а затем инкапсулировать его как экспортер, чтобы сохранить его, ожидая вызова потребителя, и зарегистрировать URL-адрес реестра, позволяющий потребителям получать информацию о поставщиках услуг.

На сегодня почти все, возможно, будет еще несколько статей в серии Dubbo, а потом будет резюме интервью, подождите!

Я Ао Бин, чем больше ты знаешь, тем больше ты не знаешь, увидимся в следующий раз!

талантнаш【Три подряд】Это самая большая движущая сила для создания Ao Bing.Если в этом блоге есть какие-либо ошибки и предложения, пожалуйста, оставьте сообщение!


Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.