Spring Cloud Alibaba | Dubbo и Spring Cloud идеально сочетаются

Spring Cloud

1 Обзор

Можно сказать, что Dubbo многим не чужд, ведь это Java RPC-фреймворк с открытым кодом с 2012 г. По разным причинам он перестал обновляться на 4 с половиной года, и только малая версия был выпущен в середине.После исправления небольшого бага все думали, что проект умер, но он возобновил обновление в сентябре 2017 года, что неудивительно.

Многие в интернете сравнивают Dubbo и Spring Cloud.Может у всех в голове эти два фреймворка можно нарисовать как знаки равенства.Потом в интернете была очень популярная таблица,в которой сравнивались Spring более подробно.Облако и Dubbo, таблица выглядит следующим образом:

Dubbo SpringCloud
Реестр услуг Работник зоопарка Spring Cloud Netfix Eureka
Метод вызова службы ПКП  REST API
сервисный мониторинг Dubbo-monitor Spring Boot Admin
предохранитель несовершенный Spring Cloud Netflix Hystrix
сервисный шлюз никто Spring Cloud Netflix Zuul
Распределенная конфигурация никто Spring Cloud Config
отслеживание услуг никто Spring Cloud Sleuth
поток данных никто Spring Cloud Stream
пакетные задачи никто Spring Cloud Task
информационная шина никто Spring Cloud Bus

Некоторые основные компоненты перечислены выше. Конечно, это необходимо указать здесь. Dubbo не означает, что компоненты, обозначенные как «нет» в приведенной выше таблице, не могут быть реализованы, но сама структура Dubbo не предоставляет их и должна быть интегрированы для достижения соответствующих функций.Действительно Dubbo является скорее подмножеством Spring Cloud.

Dubbo имеет огромную пользовательскую базу в Китае.Все надеются насладиться экологией Spring Cloud при использовании Dubbo, и появились различные интеграционные решения.Однако из-за разных сервисных центров различные интеграционные решения не так естественны.До весны Облако Alibaba появился проект, и был официально предоставлен сервисный реестр Nacos, чтобы отлично решить эту проблему. И предоставляет решение для интеграции Dubbo и Spring Cloud под названием: Dubbo Spring Cloud.

1.2 Обзор облака Dubbo Spring

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

функциональные компоненты Spring Cloud Dubbo Spring Cloud
Распределенная конфигурация Git, Zookeeper, Консул, JDBC Распределенная конфигурация Spring Cloud + центр конфигурации Dubbo
Регистрация и обнаружение службы Эврика, смотритель зоопарка, консул Spring Cloud Native Registry + собственный реестр Dubbo
Балансировки нагрузки Лента (случайные, опросные и др. алгоритмы) Встроенная реализация Dubbo (случайный, опросный и другие алгоритмы + веса и другие возможности)
Предохранители Spring Cloud Hystrix Spring Cloud Hystrix + Alibaba Sentinel и т. д.
Звонки между службами Открыть притворство, RestTemplate Вызов службы Spring Cloud + Dubbo @Reference
Отслеживание ссылок (Tracing) Spring Cloud Sleuth + Zipkin Zipkin, opentracing и т.д.

Приведенная выше сравнительная таблица взята из официальной документации Dubbo Spring Cloud.

Кроме того, Dubbo Spring Cloud разработан на основе Dubbo Spring Boot 2.7.1 и Spring Cloud 2.x.Независимо от того, являются ли разработчики пользователями Dubbo или Spring Cloud, они могут легко контролировать и переносить приложения вверх по стоимости, близкой к «нулю». Dubbo Spring Cloud стремится упростить облачные затраты на разработку, чтобы повысить эффективность исследований и разработок и производительность приложений.

1.3 Основные характеристики Dubbo Spring Cloud

  • Высокопроизводительный вызов RPC для прокси-сервера интерфейса: обеспечивает высокопроизводительные возможности удаленного вызова на основе прокси-сервера.Служба использует интерфейс в качестве элемента детализации и скрывает основные детали удаленного вызова.
  • Интеллектуальная балансировка нагрузки: встроенные несколько стратегий балансировки нагрузки, интеллектуальное определение состояния работоспособности нижестоящих узлов, значительное сокращение задержки вызовов и повышение пропускной способности системы.
  • Автоматическая регистрация и обнаружение служб: поддержка нескольких служб реестра и восприятие экземпляров служб в режиме реального времени как в сети, так и в автономном режиме.
  • Широкие возможности расширения: в соответствии с принципом проектирования микроядро + подключаемый модуль все основные возможности, такие как протокол, транспорт и сериализация, разработаны как точки расширения, и как встроенные, так и сторонние реализации обрабатываются одинаково.
  • Планирование трафика во время выполнения: встроенные условия, сценарии и другие стратегии маршрутизации, настраивая различные правила маршрутизации, позволяют легко добиться публикации в градациях серого и того же приоритета компьютерного зала.
  • Визуальное управление службами, их эксплуатация и обслуживание. Предоставляйте богатые инструменты управления службами, эксплуатации и обслуживания: запрашивайте метаданные службы, состояние службы и статистику вызовов в любое время, применяйте политики маршрутизации в режиме реального времени и настраивайте параметры конфигурации.

1.4 Зачем Spring Cloud нужен RPC

В системе микросервисов, созданной Spring Cloud, большинство разработчиков используют официально предоставленные компоненты Feign для внутренней связи службы.Этот декларативный HTTP-клиент очень прост, удобен и элегантен в использовании, но есть смысл при использовании Feign для потребления служб по сравнению для инфраструктуры RPC, такой как Dubbo, производительность вызывает беспокойство.

Хотя в микросервисной архитектуре микросервисы, разделенные по бизнесу, развертываются независимо и работают в своих собственных процессах. Связь между микросервисами больше склоняется к использованию HTTP, механизма связи с коротким ответом, и в большинстве случаев используется REST API. Этот метод связи очень прост и эффективен и не имеет ничего общего с платформой и языком разработки, однако в обычных условиях HTTP не включает функцию KeepAlive, то есть текущее соединение является коротким. Короткое соединение заключается в том, что для каждого запроса необходимо устанавливать TCP-соединение, что делает его эффективность довольно низкой.

Очень хорошо предоставлять службы REST API извне, но если внутренние вызовы также выполняются с использованием HTTP-вызовов, это будет иметь низкую производительность.Компонент Feign, используемый Spring Cloud по умолчанию для внутренних вызовов службы, представляет собой протокол HTTP. используется для вызова, В настоящее время, если мы используем вызовы RPC для внутренних служб и API REST для внешнего использования, это будет очень хороший выбор.По совпадению, Dubbo Spring Cloud предоставляет нам метод реализации этого выбора.

2. Настоящий бой

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

Установка, конфигурация развертывания и использование Nacos были представлены в предыдущих главах, и я не буду повторять их здесь.Если читатели все еще неясны, обратитесь к предыдущей серии статей Nacos:

«Предварительное исследование Spring Cloud Alibaba | Сервисный центр Nacos»

«Spring Cloud Alibaba | Регистрация и обнаружение службы Nacos»

"Spring Cloud Alibaba | Развертывание кластера Nacos"

«Spring Cloud Alibaba | Управление конфигурацией Nacos»

2.1 Создать родительский проект dubbo-spring-cloud-demo

Родительский проект зависит от pom.xml следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/pom.xml


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Уведомление:

  1. должен содержатьspring-boot-starter-actuatorpackage, иначе запуск сообщит об ошибке.

  2. spring-cloud-starter-dubboПакет должен обратить внимание на groupId, который определяется в соответствии с конкретной используемой версией весеннего облака alibaba.

    • Если вы используете версию люка, используйте GroupID AS:org.springframework.cloud
    • Если вы используете окончательную версию, используемые GroupID:com.alibaba.cloud
  3. В приведенной выше ссылке не указана версия, оператор, который будет отображаться<dependencyManagement>

2.2 Создать подпроект dubbo_api

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

Определите абстрактный интерфейс HelloService.java:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_api/src/main/java/com/springcloud/dubbo_api/service/HelloService.java


public interface HelloService {
    String hello(String name);
}

2.3 Создайте подпроект dubbo_provider, поставщик услуг Dubbo.

Зависимость проекта pom.xml выглядит следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_provider/pom.xml


<!-- API -->
<dependency>
    <groupId>com.springcloud.book</groupId>
    <artifactId>ch13_1_dubbo_api</artifactId>
    <version>${project.version}</version>
</dependency>

Здесь представлен общедоступный модуль API.

Реализовать интерфейс Dubbo, HelloServiceI.java, можно следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/service/HelloServiceI.java


@Service
public class HelloServiceI implements HelloService {
    @Override
    public String hello(String name) {
        return "Hello " + name;
    }
}

Примечание: здесь@ServiceАннотации не из Springorg.springframework.stereotype.Service, но Даббоorg.apache.dubbo.config.annotation.Service, не указывайте ошибки. здесь@ServiceВ аннотации только заявляется, что служба Java (локально) реализована как служба Dubbo.

Файл конфигурации application.yml необходим для настройки службы Java (локальной) в качестве службы Dubbo (удаленной) следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/resources/application.yml


server:
port: 8000
dubbo:
    scan:
        base-packages: com.springcloud.book.ch13_1_dubbo_provider.service
protocol:
    name: dubbo
    port: -1
registry:
    address: spring-cloud://192.168.44.129
spring:
application:
    name: dubbo-spring-cloud-provider
cloud:
    nacos:
    discovery:
        server-addr: 192.168.44.129:8848
main:
    allow-bean-definition-overriding: true

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

Dubbo Spring Cloud наследует внешние функции конфигурации Dubbo Spring Boot, а также может реализовывать контрольное сканирование пакетов, помечая @DubboComponentScan.

  • dubbo.scan.base-packages: Указывает тестовый пакет сканирования класса реализации службы Dubbo.
  • dubbo.protocol: Конфигурация протокола, предоставляемая службой Dubbo, где имя вложенного атрибута — это имя протокола, а порт — порт протокола (-1 означает автоматически увеличивающийся порт, начиная с 20880).
  • dubbo.registry: конфигурация реестра службы Dubbo, где значение адреса податрибута «spring-cloud://192.168.44.129» указывает, что он подключен к реестру Spring Cloud.
  • spring.application.name: имя приложения Spring, используемое для регистрации и обнаружения службы Spring Cloud. Это значение считается поддерживаемым значением Dubbo Spring Cloud.dubbo.application.name, так что нет необходимости явно настраиватьdubbo.application.name.
  • spring.main.allow-bean-definition-overriding: этот параметр добавлен в Spring Boot 2.1 и более поздних версиях, поскольку Spring Boot по умолчанию настраивает поведение переопределения определения bean-компонента.
  • spring.cloud.nacos.discovery: конфигурация обнаружения и регистрации службы Nacos, где подсвойство server-addr указывает хост и порт сервера Nacos.

Создайте основной класс приложения Ch131DubboProviderApplication.java:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_provider/src/main/java/com/springcloud/dubbo_provider/DubboProviderApplication.java


@SpringBootApplication
@EnableDiscoveryClient
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
    }

}

2.4 Создайте подпроект dubbo_consumer, вызывающий службу:

Зависимость проекта pom.xml выглядит следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/pom.xml


<!-- API -->
<dependency>
    <groupId>com.springcloud.book</groupId>
    <artifactId>ch13_1_dubbo_api</artifactId>
    <version>${project.version}</version>
</dependency>

Конфигурация проекта application.yml выглядит следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/resources/application.yml


server:
port: 8080
dubbo:
protocol:
    name: dubbo
    port: -1
registry:
    address: spring-cloud://192.168.44.129
cloud:
    subscribed-services: dubbo-spring-cloud-provider
spring:
application:
    name: dubbo-spring-cloud-consumer
cloud:
    nacos:
    discovery:
        server-addr: 192.168.44.129:8848
main:
    allow-bean-definition-overriding: true
  • dubbo.cloud.subscribed-services: Указывает имя службы, на которую следует подписаться, которую можно настроить.'*', представляет собой подписку на все службы, что не рекомендуется. Чтобы подписаться на несколько приложений, используйте «,» для разделения.

Тестовый интерфейс HelloController.java выглядит следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/HelloController.java


@RestController
public class HelloController {
    @Reference
    private HelloService helloService;

    @GetMapping("/hello")
    public String hello() {
        return helloService.hello("Dubbo!");
    }
}

Примечание: здесь@ReferenceАннотацияorg.apache.dubbo.config.annotation.Reference.

Запустите основной класс Ch131DubboConsumerApplication.java следующим образом:

Листинг кода: Alibaba/dubbo-spring-cloud-demo/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/DubboConsumerApplication.java


@SpringBootApplication
@EnableDiscoveryClient
public class DubboConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }

}

2.5 Тестирование

Запустите подпроект dubbo_provider и подпроект dubbo_consumer.После завершения запуска мы можем получить доступ к списку сервисов консоли Nacos и увидеть два сервиса, как показано на рисунке:

Открываем браузер для посещения:http://localhost:8080/hello, вы можете видеть, что страница отображается нормальноHello Dubbo!, проверка прошла успешно, как показано на рисунке:

3. Пример кода

Пример кода — Гитхаб

Пример кода — Gitee

4. Ссылка

Официальная документация по Dubbo Spring Cloud