Анализ исходного кода Dubbo (1) Привет, Dubbo

Dubbo

Hello,Dubbo

Привет даббо, первая встреча, хочу с тобой подружиться.

Даббо ты что такое?

Сначала дайте официальное заявление: Apache Dubbo — это высокопроизводительная и легкая платформа RPC с открытым исходным кодом на основе Java.

Так что же такое РПК?

Документация:Хироши Ватанабэ.apache.org/this-capable/docs/…

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

Полное название RPC на английском языке — удаленный вызов процедур, также известный как удаленный вызов процедур.На самом деле это протокол компьютерной связи.Это протокол, который запрашивает услуги из удаленной компьютерной программы через сеть, не зная базовой сетевой технологии. Существует множество протоколов компьютерной связи. Для разработки многие знакомы с протоколом HTTP. Здесь я проведу простое сравнение. Протокол HTTP относится к прикладному уровню, а RPC охватывает транспортный уровень и прикладной уровень. Сам протокол трехстороннего рукопожатия HTTP, каждый раз, когда отправляется запрос, будет происходить процесс установления соединения, что приведет к определенной задержке, и само сообщение HTTP огромно, и RPC может подключаться по запросу, и он будет отключен после завершения вызова.Это также может быть длинная ссылка.Несколько удаленных вызовов процедур используют одну и ту же ссылку.Видно, что эффективность RPC выше, чем у HTTP, но по сравнению с развитием простые и быстрые службы HTTP, службы RPC окажутся более сложными.

​ Возвращаясь к исходной теме, продолжаем говорить о даббо. Характеристики dubbo — возможность подключения, надежность, масштабируемость и возможность обновления до будущих архитектур. Для подробного ознакомления с функциями вы также можете обратиться к официальной документации, указанной выше. Я не буду здесь подробно останавливаться на содержании официальной документации.

Поскольку далее необходимо проанализировать исходный код и принципы работы каждого модуля dubbo, позвольте мне представить библиотеку исходного кода dubbo.Среда dubbo была передана Apache Foundation для инкубации и находится в открытом доступе на github.

адрес гитхаба:GitHub.com/Apache/Inc U…

Затем поговорим о стратегии версий dubbo: две основные версии разрабатываются параллельно, 2.5.x — стабильная версия, а 2.6.x — экспериментальная версия новых функций. После того, как эксперименты с версией 2.6 станут стабильными, она будет перенесена на версию 2.5, поэтому, если вы хотите узнать о последних возможностях dubbo, выберите версию 2.6, в противном случае используйте версию 2.5. Следующие введения основаны на версии 2.6.x.

Знакомство с дизайном рамы Dubbo

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

Давайте сначала посмотрим на структуру после клонирования исходного кода:

dubbo工程结构

Вы можете видеть, что Dubbo был разделен на множество проектов Maven (я не вырезал весь проект справа).

Если вы читали официальную документацию dubbo, то наверняка видели следующую картинку

dubbo-modules

Из приведенного выше рисунка мы можем ясно видеть зависимости между различными модулями.На самом деле, приведенный выше рисунок показывает только зависимости ключевых модулей, а также некоторые модули, такие как модуль очистки dubbo-bootstrap.Я сделаю следующее для каждый модуль.Простое введение, по крайней мере понять роль каждого модуля.

Давайте поговорим о модулях выше:

(1) dubbo-registry — модуль реестра

Объяснение официального документа: метод кластеризации на основе адреса, выданного реестром, и абстракция различных реестров.

Насколько я понимаю, центр регистрации Dubbo реализует центр регистрации Multicast, центр регистрации Zookeeper, центр регистрации Redis и центр простой регистрации (я расскажу, как это реализовать в следующей статье).Этот модуль инкапсулирует центр регистрации, поддерживаемый реализацией dubbo.

Взгляните на структуру каталогов реестра:

注册中心的目录

  1. dubbo-registry-api: абстрагирует регистрацию и обнаружение реестра, реализует некоторые общие методы и позволяет подклассам сосредоточиться только на некоторых ключевых методах.
  2. Следующие четыре пакета представляют собой инкапсуляцию четырех методов реализации реестра, среди которых dubbo-registry-default — простой реестр в официальном документе.
(2) dubbo-cluster — кластерный модуль

Пояснение к официальному документу: Замаскировать несколько провайдеров услуг под одного провайдера, включая: балансировку нагрузки, отказоустойчивость, маршрутизацию и т. д. Список адресов кластера может быть статически настроен или выдан реестром.

cluster

Мое понимание: это стратегия, используемая для решения ошибочной ситуации.Этот модуль инкапсулирует методы реализации различных стратегий, а также поддерживает собственное расширение стратегии отказоустойчивости кластера.Кластер маскирует несколько Инвокеров под один Инвокер, и в процессе маскировки Добавлена ​​логика отказоустойчивости, если не получается, пробуем следующую.

Взгляните на структуру каталогов кластера:

cluster目录

  1. configurator package: пакет конфигурации. Основной принцип разработки dubbo заключается в использовании URL-адреса в качестве унифицированного формата для информации о конфигурации. Все точки расширения передают информацию о конфигурации, передавая URL-адрес. Этот пакет используется для создания информации о конфигурации в соответствии с едиными правилами конфигурации.
  2. Пакет каталога: инкапсулирует метод маскировки Invoker как Invoker, а Directory представляет несколько Invoker. Вот введение в Invoker.Invoker — это абстракция Provider для вызова службы.Invoker инкапсулирует адрес провайдера и информацию об интерфейсе службы.
  3. Пакет loadbalance: инкапсулирует реализацию балансировки нагрузки и отвечает за использование алгоритма балансировки нагрузки для выбора определенного Invoker из нескольких Invoker для этого вызова.Если вызов завершается неудачей, его необходимо выбрать повторно.
  4. пакет слияния: инкапсулирует объединенные возвращаемые результаты, сгруппированные и объединенные в методы, и поддерживает несколько типов структур данных.
  5. пакет маршрутизатора: инкапсулирует реализацию правил маршрутизации.Правила маршрутизации определяют целевой сервер для вызова службы dubbo.Существует два типа правил маршрутизации: правила условной маршрутизации и правила маршрутизации сценария, и поддерживает масштабируемость.
  6. пакет поддержки: инкапсулирует различные типы Invokers и кластеров, включая отказоустойчивый режим кластера и сгруппированные кластеры агрегации и связанные Invokers.
(3) dubbo-common — общедоступный логический модуль

Объяснение официальной документации: включая класс Util и общую модель.

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

Взгляните на общий каталог:

common目录

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

(4) dubbo-config — модуль конфигурации

Объяснение официального документа: Это внешний API Dubbo.Пользователи используют Dubbo через Config, скрывая все детали Dubbo.

Насколько я понимаю: пользователи используют конфигурацию для использования dubbo. Dubbo также предоставляет четыре метода настройки, включая настройку XML, настройку атрибутов, настройку API и настройку аннотаций. Модуль конфигурации реализует функции этих четырех конфигураций.

Взгляните на каталог конфигурации:

config目录

  1. dubbo-config-api: реализует функции настройки API и настройки свойств.
  2. dubbo-config-spring: Реализует функции настройки XML и настройки аннотаций.
(5) dubbo-rpc — модуль удаленного вызова

Пояснение к официальному документу: абстрагирование различных протоколов, а также динамических агентов, включает только вызовы one-to-one и не заботится об управлении кластером.

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

Адрес отчета о проверке производительности:Хироши Ватанабэ.apache.org/this-capable/docs/…

Этот модуль зависит от модуля dubbo-remoting, который абстрагирует различные протоколы.

Взгляните на каталог rpc:

rpc目录

  1. dubbo-rpc-api: абстрагирует динамические прокси и различные протоколы для выполнения вызовов один на один.
  2. Остальные пакеты являются реализациями каждого протокола.
(6) dubbo-remoting — удаленный коммуникационный модуль

Пояснение к официальному документу: Это эквивалент реализации протокола Dubbo.Если RPC использует протокол RMI, вам не нужно использовать этот пакет.

Насколько я понимаю: Предоставляет различные функции связи между клиентом и сервером, например, на основе Grizzly, Netty, Tomcat и т. д., RPC использует этот модуль, за исключением протоколов RMI.

Взгляните на удаленный каталог:

remoting目录

  1. dubbo-remoting-api: определяет интерфейс между клиентом и сервером.
  2. dubbo-remoting-grizzly: клиент и сервер на основе Grizzly.
  3. dubbo-remoting-http: клиент и сервер на базе Jetty или Tomcat.
  4. dubbo-remoting-mina: клиент и сервер на базе Mina.
  5. dubbo-remoting-netty: клиент и сервер на основе Netty3.
  6. Dubbo-remoting-netty4: клиент и сервер на основе Netty4.
  7. dubbo-remoting-p2p: P2P-сервер, этот сервер будет использоваться в многоадресной рассылке центра регистрации.
  8. dubbo-remoting-zookeeper: инкапсулирует клиент Zookeeper и взаимодействует с сервером Zookeeper.
(7) dubbo-container — контейнерный модуль

Объяснение из официальной документации: это автономный контейнер, который загружает Spring с помощью простого основного, потому что службам обычно не нужны функции веб-контейнеров, таких как Tomcat/JBoss, и нет необходимости использовать веб-контейнер для загрузки служб.

Мое понимание: поскольку фоновой службе не нужны функции веб-контейнеров, таких как Tomcat/JBoss, нет необходимости использовать эти толстые контейнеры для загрузки поставщика услуг, что тратит ресурсы и увеличивает сложность. Контейнер службы — это простой метод Main, который загружает некоторые встроенные контейнеры, а также поддерживает расширяемые контейнеры.

Взгляните на каталог контейнера:

container目录

  1. dubbo-container-api: определяет интерфейс Container и реализует метод Main для загрузки службы.
  2. Остальные три предоставляют соответствующие контейнеры для загрузки метода Main.
(8) dubbo-monitor - модуль мониторинга

Пояснение к официальному документу: подсчитайте количество обращений в службу поддержки, время обращения и службы отслеживания цепочки обращений.

Мое понимание: Этот модуль очень понятный, то есть мониторинг услуг.

Взгляните на каталог монитора:

monitor目录

  1. dubbo-monitor-api: определяет интерфейсы, связанные с монитором, и реализует фильтры, необходимые для мониторинга.
  2. dubbo-monitor-default: Реализует функции, связанные с мониторингом dubbo.
(9) dubbo-bootstrap — модуль очистки

Этот модуль имеет только один класс, который действует как класс начальной загрузки для dubbo и очищает ресурсы во время остановки. Конкретное введение будет объяснено в следующей статье.

(10) dubbo-demo - пример модуля

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

Пример вводного адреса:Хироши Ватанабэ.apache.org/this-capable/docs/…

(11) dubbo-filter - фильтрующий модуль

Этот модуль предоставляет несколько встроенных фильтров.

Взгляните на каталог фильтров:

filter目录

  1. dubbo-filter-cache: Предоставляет фильтры кеша.
  2. dubbo-filter-validation: Предоставляет фильтры проверки параметров.
(12) dubbo-plugin — подключаемый модуль

Этот модуль предоставляет встроенные плагины.

Взгляните на каталог плагина:

plugin目录

  1. dubbo-qos: Предоставляет команды для оперативной работы и обслуживания.
(13) dubbo-serialization — модуль сериализации

Этот модуль инкапсулирует реализацию поддержки различных платформ сериализации.

Взгляните на каталог сериализации:

serialization目录

  1. dubbo-serialization-api: определяет интерфейс сериализации и интерфейс ввода и вывода данных.
  2. Все остальные пакеты реализуют методы соответствующей инфраструктуры сериализации. Эти типы платформ сериализации встроены в dubbo, и сериализация также поддерживает расширения.
(14) dubbo-test - тестовый модуль

Этот модуль инкапсулирует такие функции, как тестирование производительности и тестирование совместимости для dubbo.

Взгляните на тестовый каталог:

test目录

  1. dubbo-test-benchmark: тест производительности.
  2. dubbo-test-compatibility: тест на совместимость, тест на совместимость с spring3.
  3. dubbo-test-examples: примеры, используемые для тестирования.
  4. dubbo-test-integration: для тестирования требуется файл pom

Позвольте мне рассказать о pom-файлах, связанных с Maven, в dubbo.

  1. dubbo-bom/pom.xml использует спецификацию Maven для единообразного определения номера версии dubbo. Dubbo-bom/pom.xml будет указан в pom-файлах dubbo-test и dubbo-demo.В качестве примера возьмем dubbo-demo:

    dubbo-demo引入bom

  2. dubbo-dependencies-bom/pom.xml: Спецификация Maven используется для унифицированного определения номера версии сторонней библиотеки, от которой зависит dubbo. dubbo-parent импортирует БОМ:

    dubbo-parent依赖第三方库

  3. all/pow.xml: определяет сценарий упаковки dubbo.При использовании библиотеки dubbo вам необходимо импортировать и изменить файл pom.

  4. dubbo-parent: это родительский pom dubbo, и модуль maven dubbo импортирует файл pom.