Всем привет! На связи Максим Чудновский и Александр Козлов, мы занимаемся развитием интеграционной платформы Synapse. Это сloud-native децентрализованная платформа для интеграции и оркестрации микросервисов, которая разрабатывается в СберТехе.

Сегодня есть множество протоколов, обеспечивающих эффективную коммуникацию между различными компонентами приложений и систем. Два ярких представителя таких технологий — Dubbo и gRPC, которые, по мнению некоторых экспертов, имеют поразительное сходство. Но действительно ли они так уж похожи?

Мы подготовили два материала на тему интеграционных фреймворков. В этой статье познакомим вас с Dubbo, вспомним про базовое устройство Service Mesh и покажем, как мы на Java обычно решаем вопросы интеграции в наших системах. Во второй статье соберём демоприложение на основе фреймворка Dubbo.

Что такое Service Mesh

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

Istio — это одно из самых популярных Service Mesh-решений, разработанное компанией Google. Оно предлагает широкий спектр возможностей для управления, мониторинга и безопасности микросервисов, включая поддержку различных протоколов, интеграцию с внешними системами и многое другое. Благодаря гибкости, простоте использования и высокой производительности, Istio становится выбором номер один для многих разработчиков и организаций. Давайте разберёмся, как устроено решение.

Control plane

Control Plane — ключевая часть service mesh-архитектуры, которая отвечает за управление и координацию работы микросервисов. В контексте Istio, control plane представлена компонентом под названием «Istiod», который обеспечивает централизованное управление, маршрутизацию трафика, авторизацию и мониторинг всех сервисов в mesh-сети.

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

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

Data plane

Data Plane в Istio — это слой, который отвечает за обработку и передачу данных между микросервисами. Состоит из компонентов, которые обеспечивают маршрутизацию и проксирование запросов, а также функции безопасности TLS termination и authentication. Один из таких компонентов — Envoy, о котором расскажем ниже.

Работа Data Plane основана на конфигурации, которую предоставляет Control Plane. Когда новый сервис добавляется в Istio mesh, Control Plane автоматически настраивает Envoy на этом сервисе, чтобы тот мог взаимодействовать с другими сервисами в mesh.

Data Plane также обрабатывает запросы от клиентов и направляет их на соответствующие сервисы, а затем возвращает ответы обратно клиентам. Он также обеспечивает мониторинг и сбор статистики о работе сервисов, что помогает управлять и оптимизировать работу mesh-сети.

Протоколы и их поддержка в Istio

Протокол HTTP

HTTP (Hypertext Transfer Protocol) — основной протокол, используемый для обмена данными в Интернете. В Istio поддержка HTTP реализована через Envoy — прокси-сервер, который обрабатывает входящие и исходящие запросы между сервисами. Envoy поддерживает различные методы аутентификации, шифрование TLS и другие функции, необходимые для безопасной передачи данных.

Протокол gRPC

gRPC (Google Remote Procedure Call) — это открытый протокол, который обеспечивает удалённый вызов процедур и обмен структурированными данными между приложениями. В Istio gRPC интегрирован с Envoy и позволяет сервисам взаимодействовать на основе этого протокола. gRPC в Istio поддерживает шифрование, аутентификацию и другие необходимые функции для безопасности обмена данными.

Протоколы MQTT и AMQP

MQTT (Message Queuing Telemetry Transport) и AMQP (Advanced Message Queuing Protocol) — протоколы для обмена сообщениями между устройствами и серверами. В Istio они интегрированы с помощью стороннего проекта — Envoy-Proxy-MQTT. Это позволяет использовать MQTT и AMQP для взаимодействия между сервисами и обеспечивает шифрование и аутентификацию сообщений.

Интеграция с внешними системами

Istio предоставляет возможность интеграции с различными внешними системами, такими как облачные платформы (например, Google Cloud), сторонние API и другие. Интеграция осуществляется через Envoy, который может обрабатывать запросы, поступающие из внешних систем, и передавать их между сервисами в Istio Mesh.

Немного о gRPC

gRPC — современный протокол удалённых вызовов процедур для быстрой и удобной работы с микросервисами. gRPC позволяет вызывать удалённые процедуры, получать результаты и передавать данные в оба направления.

Вот как это работает:

  • Клиент отправляет запрос на сервер, указывая в нём имя процедуры и аргументы.

  • Сервер принимает запрос, выполняет указанную процедуру и возвращает результат клиенту.

  • Клиент получает результат и продолжает работу.

gRPC использует HTTP/2 для передачи данных, что обеспечивает высокую скорость работы и надёжность. Кроме того, протокол поддерживает аутентификацию, сжатие данных и шифрование для обеспечения безопасности.

gRPC разработан компанией Google, но поддерживается многими языками программирования, включая Java, Python, Go. Благодаря своей простоте и эффективности, gRPC становится всё более популярным среди разработчиков микросервисов.

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

Apache Dubbo

Apache Dubbo — популярный фреймворк для разработки распределённых приложений. Он используется многими компаниями и организациями по всему миру, в том числе крупнейшими китайскими корпорациями вроде Alibaba, Tencent, Baidu, JD.com, Huawei. Dubbo подходит для разработки различных типов приложений, включая микросервисы, RESTful API, SOAP-сервисы, и RPC-сервисы.

Envoy и Dubbo

Протокол Dubbo, разработанный компанией Alibaba, — это высокопроизводительный интерфейс удалённых процедур, который использует gRPC для передачи данных. Envoy полностью поддерживает gRPC, что позволяет ему работать с протоколом Dubbo без дополнительных настроек.

В результате разработчики микросервисов, использующие Dubbo, могут получить преимущества Envoy. Например, улучшить производительность своих приложений, используя функции Envoy для оптимизации трафика и управления ресурсами. А ещё без дополнительных инструментов обеспечить безопасную коммуникацию между микросервисами благодаря встроенной поддержке TLS.

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

Github и Dubbo

На GitHub есть несколько проектов, связанных с Dubbo, но они не очень популярны. Например, у официального репозитория Dubbo всего 1460 звезд и около 250 форков. Также есть несколько других проектов, которые используют Dubbo, но их популярность не очень высока.

Сообщество Dubbo

Dubbo используют в основном азиатские компании, и среди них есть большие игроки:

  • Alibaba. Один из основателей консорциума Dubbo и один из основных разработчиков. Использует эту технологию для своих внутренних сервисов.

  • Tencent. Ещё один основатель консорциума и разработчик Dubbo. Использует его для своих мобильных игр и социальных сетей.

  • Huawei также является членом консорциума и использует Dubbo в своих продуктах.

  • Baidu использует Dubbo в своем поисковом движке.

  • Twitter использует Dubbo для своего API.

  • Netflix использует Dubbo для управления своими кластерами.

  • Uber использует Dubbo для своей платформы обмена сообщениями.

  • Amazon использует Dubbo для некоторых своих сервисов.

Архитектура Dubbo3

Dubbo3 — это современная архитектура для построения микросервисных распределённых систем. Она предоставляет набор инструментов и протоколов для взаимодействия между различными компонентами системы.

Один из основных компонентов Dubbo3 — протокол gRPC. Он позволяет обмениваться данными в режиме реального времени, обеспечивая высокую производительность и надёжность. Кроме того, gRPC поддерживает различные типы данных, включая структуры, массивы и коллекции.

Ещё одним важным компонентом Dubbo3 является механизм маршрутизации. Он позволяет определять правила для обработки запросов и направлять их на соответствующие сервисы. Маршрутизация может быть основана на различных критериях, таких как IP-адрес клиента, URL запроса и т. д.

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

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

Возможности Dubbo3

  • Поддержка различных языков программирования, включая Java, Python, C++, C# и Go.

  • Поддержка различных протоколов, таких как HTTP, RMI, Hessian и Thrift, в то время как gRPC поддерживает только HTTP/2.

  • Поддержка различных типов данных, включая примитивные типы, коллекции, массивы и объекты, в то время как gRPC поддерживает только примитивные типы данных.

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

  • Поддержка различных типов транзакций, включая атомарные, распределённые и параллельные, в то время как gRPC не поддерживает транзакции.

  • Поддержка различных типов конфигурации, включая XML, YAML и JSON, в то время как gRPC поддерживает только JSON.

  • Поддержка различных типов серверов, включая HTTP, RMI, Hessian и Thrift, в то время как gRPC поддерживает только HTTP/2.

  • Поддержка различных типов клиентов, включая HTTP, RMI, Hessian и Thrift, в то время как gRPC поддерживает только HTTP/2.

  • Поддержка различных типов сервисов, включая REST, SOAP и RPC, в то время как gRPC поддерживает только RPC.

Довольно интересно выходит. Давайте посмотрим, как это можно использовать в Java.

Dubbo в Java

Dubbo поддерживает Java 8 и выше. В Dubbo3 это реализовано через библиотеку Spring Cloud Dubbo. Она предоставляет инструменты для регистрации сервисов, маршрутизации запросов и управления транзакциями.

Вот пример использования Spring Cloud Dubbo для создания сервиса:

@Service
public class HelloService {

	public String sayHello(String name) {
		return "Hello, " + name + "!";
	}
}

Для регистрации сервиса необходимо создать конфигурацию:

@EnableDubbo // Enable Dubbo support
@ComponentScan("com.mycompany") // Scan for components in this package
public class DubboConfig {

	// Register the HelloService bean as a Dubbo service
	@Bean("helloService")
	public HelloService helloService() {
		return new HelloService();
	}
}

Теперь сервис будет доступен для вызова через Dubbo.

Заключение

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

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

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

В следующей статье посмотрим на Dubbo в «полевых условиях», соберем на его основе демоприложение и оценим, насколько это «зрелый» фреймворк. А пока благодарим за внимание и приглашаем вас в комментарии!

Комментарии (3)


  1. phikus
    16.08.2024 14:57
    +1

    Сложна, сложна, непонятна.

    Цепочка складывается такая:

    gRPC использует HTTP/2 как транспорт

    Dubbo использует gRPC как транспорт

    При этом Dubbo поддерживает различные протоколы, такие как HTTP, RMI, Hessian и Thrift, в то время как gRPC поддерживает только HTTP/2.


  1. ivvi
    16.08.2024 14:57

    В статье присутствует одновременно два вот таких предложения:

    "Кроме того, gRPC поддерживает различные типы данных, включая структуры, массивы и коллекции."

    И немного ниже:

    "в то время как gRPC поддерживает только примитивные типы данных."

    Невольно возникает вопрос: автор точно разбирается в том, о чём пишет?


    1. keekkenen
      16.08.2024 14:57

      чотко.. стоит найти такое и дальше можно не читать, ибо неизвестно, какого бреда там написали..