Изучение и практика вызова службы Node dubbo

Node.js

1. Введение

Наша компания занимается электронной коммерцией в Ханчжоу. В компании много технических систем, и основными языками являются JAVA/PHP/Node. В 2019 году компания сформулировала план де-PHP и ускорила ответный В сервисе Java некоторые сервисы, связанные с сервисными вызовами, должны передаваться узлом, а связь с Java должна проходить через Dubbo, поэтому мы используем роль потребителя, чтобы изучить и изучить, как использовать Node для вызова Dubbo. .

调用链路


2. Введение в Даббо

2.1 Что такое даббо

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

2.2 блок-схема

调用流程图

  • Provider: поставщик услуг, предоставляющий услугу.
  • Consumer: Потребитель службы, который вызывает удаленную службу.
  • Registry: Реестр для регистрации и обнаружения служб.
  • Monitor: центр мониторинга, который подсчитывает время вызова и время вызова службы.
  • Container: служба запускает контейнер.

3. Конкретная реализация

3.1 Выбор протокола

Хотя официальный поддерживает множество видов протоколов, не так много протоколов, которые действительно подходят для нас.Например, протокол rmi в основном предназначен для вызовов между Java-проектами и не подходит для гетерогенных языковых RPC-сценариев, поэтому мы сосредоточимся только на некоторые из них.Соглашение анализируется, совмещается с нашим реальным бизнес-сценарием, и, наконец, чтобы отфильтровать соглашение, которое нам подходит.

количество подключений Способ подключения Протокол передачи способ передачи Сериализация Сфера применения Применимая сцена
dubbo одно соединение Длинное соединение TCP Асинхронная передача NIO Двоичная сериализация Гессе Входящие и исходящие пакеты параметров небольшие, количество потребителей больше, чем количество провайдеров, и один потребитель не может перегрузить провайдера. Регулярные вызовы методов удаленного обслуживания
rmi несколько соединений короткое соединение TCP изохронная передача Стандартная двоичная сериализация Java Входящие и исходящие параметры смешаны по размеру пакета, количество потребителей и поставщиков одинаково, и файлы могут быть переданы. Регулярные вызовы методов удаленного обслуживания, взаимодействующие с собственными службами RMI.
hessian несколько соединений короткое соединение HTTP изохронная передача Двоичная сериализация Гессе Входящие и исходящие пакеты данных параметров большие, количество поставщиков больше, чем потребителей, давление поставщиков велико, и файлы могут быть переданы. Передача страниц, передача файлов или совместимость с родными гессенскими службами
http несколько соединений короткое соединение HTTP изохронная передача сериализация формы Входящие и исходящие пакеты данных параметров имеют смешанный размер. Существует больше поставщиков, чем потребителей, которые могут быть просмотрены браузером. Параметры могут быть переданы по форме или URL-адресу. Служба должна использоваться как приложением, так и браузерный JS.
rest несколько соединений короткое соединение HTTP изохронная передача сериализация формы То же, что и http, подходит для сервисов, более соответствующих остальным спецификациям то же, что http

3.1.1 Выбор протокола — dubbo

С точки зрения сценариев использования протокол dubbo больше соответствует нашим реальным потребностям бизнеса.Поскольку его пакеты данных намного меньше, чем протокол Http, скорость передачи будет выше.Кроме того, мы можем установить длительное соединение с поставщика через сокет, что может уменьшить ненужные сетевые накладные расходы, вызванные повторным установлением соединения. Используя этот протокол, мы должны обратить внимание на несколько моментов:

  • Стратегия балансировки локальной нагрузки
  • Установить длинное TCP-соединение с провайдером
  • Анализ протокола Гессе

Резюме: Если вы хотите использовать этот протокол для подключения к провайдеру, вы можете воспользоваться официальной рекомендацией dubbo.dubbo2.js

3.1.2 Выбор протокола - остальное

Этот протокол основан на http, поэтому ограничений со стороны потребителя практически нет. Более того, после склеивания параметров этого протокола мы можем напрямую просматривать результаты через браузер или инструмент HTTP-запросов, что с точки зрения удобства для пользователя будет лучше, чем у dubbo. Сторона потребителя может напрямую использовать библиотеку запросов для запроса, и нет проблем с анализом протокола и поддержанием состояния сокета, а сложность реализации кода на стороне потребителя будет относительно небольшой. Используя этот протокол, нам нужно обратить внимание на несколько моментов:

  • Нужно использовать keep-alive для поддержания соединения с провайдером, иначе многократное отключение и повторное подключение по http принесет много ненужных сетевых накладных расходов
  • Стратегия балансировки локальной нагрузки
  • Этот протокол поддерживается только в dubbo 2.6.x+.

Резюме: Хотя производительность не так хороша, как даббо. Однако он относительно дружелюбен к разработчикам и может быть выбран в сочетании с собственными бизнес-сценариями.

3.1.3 Дополнение

Dubbo поддерживает регистрацию службы по нескольким протоколам, например, служба может быть зарегистрирована одновременно.dubbo://а такжеrest://, Если вы хотите использовать http, но протокол, предоставленный компанией, поддерживает только dubbo, вы можете обсудить это с одноклассниками, которые предоставляют услугу, и стоимость добавления дополнительного протокола http также может быть принята.

3.2 Как ссылаться на услуги

В настоящее время существует две схемы справочной службы:

  • прямая цитата
  • Ссылочные сервисы через реестр

3.2.1 Прямые ссылки на сервисы

Прямая ссылка на службу, как следует из названия, означает обход реестра для получения нужного поставщика услуг.Поскольку реестр обходится, обнаружение службы, естественно, невозможно, и из-за одной проблемы балансировка нагрузки и высокая доступность не могут быть достигнуто.所以生产环境不推荐使用此模式的.

Однако из-за удобства в разработке вы все же можете попробовать использовать этот режим в среде разработки/тестовой среде.

直连provider

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

直连代码片段

3.2.2 Справочные службы через реестр

Через центр регистрации, чтобы обнаружить справочную службу, обычно используемый метод справочной службы Dubbo может обеспечить автоматическое обнаружение службы и балансировку нагрузки. Формальный вызов среды в основном основан на этом шаблоне. Существует множество вариантов реализации реестра, например Zookeeper/Redis/Multicast. Официально рекомендуем Zookeeper.

通过注册中心引用服务

3.3 Определение структуры запроса на обслуживание

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

3.3.1 Состав услуг

На основе протоколов dubbo/rest мы анализируем информацию, содержащуюся при регистрации этих двух протоколов в реестре.

  • dubbo : dubbo://192.168.1.2:10880/com.service.ProductService?dubbo=2.8&methods=getById,getByName
  • rest : rest://192.168.1.2:10081/service/com.service.ProductService?dubbo=2.8&methods=getById,getByName

Давайте извлечем общие части этих двух протоколов.

  • протокол : тип протокола, напримерdubbo://.
  • Хост: адрес хоста провайдера
  • port : порт, на который провайдер предоставляет услугу
  • интерфейс : имя службы, доступной для внешнего мира.В java оно состоит из имени пакета + имени службы, напримерcom.service.ProductService
  • dubboVersion: даббо-версия
  • метод: метод, предоставляемый службой, служба будет содержать несколько методов одновременно.
  • запрос: Другой список параметров запроса, который определен в службе Java и не может быть отражен в регистрационной информации.

3.3.2 Определение тела запроса

Основываясь на анализе приведенной выше структуры службы, структура запросов службы dubbo и rest примерно одинакова, и мы можем определить запросы различных протоколов следующим образом.

// 1. dubbo协议的请求体定义
services.ProductService = (dubbo) => dubbo.proxyService({
    dubboInterface: 'com.service.ProductService',
    methods: {
        getById(id) {
            return [java.Long(id)];
        },
        getByName(name) {
            return [java.String(name)];
        }
    },
});
// rest 请求体定义
services.ProductService = (dubbo) => dubbo.proxyService({
    dubboInterface: 'com.service.ProductService',
    methods: {
        getById(id) {
            return {
                method: 'get',
                query: [parseInt(id)]
            };
        },
        getByName(name) {
            return [String(name)];
        }
    },
});

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

3.4 Сопровождение определений службы

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

维护成本

Наша первая реакция заключается в том, что каждая служба абстрагируется и становится независимым пакетом NPM.Например, MemberService можно абстрагировать в@dubbo-service/member-service, так что проблема обслуживания, вызванная разрозненными файлами в разных проектах, может быть решена.

解决维护问题

3.4.1 Дополнительные вопросы

На данный момент мы решили проблему унифицированного определения сервисов, но еще не решили проблему унифицированного управления и обслуживания. Такие как :

  • Разделение обязанностей обслуживающего персонала. Должна ли поддержка пакетов NPM быть оставлена ​​поставщику услуг или вызывающей стороне?
  • Стоимость миграции проекта. Если это связано с миграцией проекта, это может быть связано со многими существующими проблемами инициализации Java-сервисов, а ручное определение сервисов требует огромного объема работы.Как снизить затраты на миграцию — это проблема, с которой нам придется столкнуться.

4 последние

Если вы считаете, что эта статья полезна для вас, пожалуйста, поставьте ей палец вверх~ Большое спасибо

Если у вас есть какие-либо вопросы, вы можете прокомментировать и ответить напрямую или отправить мне личное сообщение, я сделаю все возможное, чтобы ответить вам~