Идеальное сочетание Spring Cloud и Dubbo «Spring Cloud Alibaba»

Java Spring Cloud

Давным-давно, когда я впервые начал базовый курс Spring Cloud, я написал такую ​​статью:Выбор базовой платформы для микросервисной архитектуры: Spring Cloud или Dubbo? 》, и наверняка многие читатели тоже его видели. С тех пор были вопросы о том, как выбрать эти два фреймворка.На самом деле, я четко упомянул в статье, что сравнение между Spring Cloud и самим Dubbo несправедливо, в основном первый представляет собой относительно полный набор архитектурных решений, в то время как Dubbo Это просто схема управления службами и реализации RPC.

Поскольку у Dubbo очень большая группа пользователей в Китае, окружающие его объекты и компоненты относительно несовершенны. Многие разработчики и пользователи также хотят насладиться экологией Spring Cloud, поэтому будут некоторые случаи и методы совместного использования Spring Cloud и Dubbo, но большинство решений по использованию Spring Cloud, интегрирующих Dubbo, всегда были неудобными. В основном это связано с тем, что реестр Dubbod использует ZooKeeper, а реестр в системе Spring Cloud вначале не поддерживает ZooKeeper, поэтому во многих решениях есть два разных реестра.После этого, хотя Spring Cloud поддерживает ZooKeeper, из-за сервис Детализация информации также несовместима с хранением. Поэтому в течение долгого времени на уровне управления услугами всегда существовала идеальная схема интеграции.

Только с появлением Spring Cloud Alibaba такая проблема могла быть решена. В предыдущем руководстве мы представили использование Nacos в Spring Cloud Alibaba в качестве реестра сервисов, и в рамках этого Ribbon или Feign можно использовать для обеспечения потребления сервисов, как в традиционных приложениях Spring Cloud. В этой статье продолжим рассказывать о дополнительно поддерживаемом решении RPC в рамках Spring Cloud Alibaba: Dubbo.

Начиная

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

Построить сервисный интерфейс

Создайте простой проект Java и определите абстрактный интерфейс ниже, например:

public interface HelloService {

    String hello(String name);

}

Создание поставщиков интерфейсов сервисов

первый шаг: Создайте проект Spring Boot вpom.xmlПредставьте пакет API, созданный на первом этапе, и зависимость Spring Cloud Alibaba от Nacos и Dubbo, например:

    <dependencies>
        <!-- 第一步中构建的API包 -->
        <dependency>
            <groupId>com.didispace</groupId>
            <artifactId>alibaba-dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <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>
        <dependency>        
            <!--<groupId>com.alibaba.cloud</groupId>-->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        //...
    </dependencies>

Здесь следует отметить две вещи:

  1. Должен содержатьspring-boot-starter-actuatorПакет, в противном случае запуск будет сообщать об ошибке.
  2. spring-cloud-starter-dubboупаковка требует вниманияgroupId, который определяется в соответствии с конкретным использованием зависимостей версии весеннего облака alibaba.
    • Используется во время инкубацииgroupIdза:org.springframework.cloud;
    • После инкубации проектаgroupIdЧтобы изменитьcom.alibaba.cloud, поэтому пользователю нужно обратить внимание на то, правильно ли он используется. Избегайте проблемы, связанной с тем, что соответствующий пакет JAR не может быть загружен.

второй шаг: Dubbo реализует интерфейсы

@Service
public class HelloServiceImpl implements HelloService {

    @Override
    public String hello(String name) {
        return "hello " + name;
    }

}

Примечание: здесь@ServiceЗаметка не весна, аorg.apache.dubbo.config.annotation.Serviceаннотация.

третий шаг: настройка информации, связанной со службами Dubbo, например:

spring.application.name=alibaba-dubbo-server
server.port=8001

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

# 指定 Dubbo 服务实现类的扫描基准包
dubbo.scan.base-packages=com.didispace.alibaba.dubbo.server
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost

Инструкции по настройке следующие:

  • dubbo.scan.base-packages: Определяет сканирующее тестовое пакет класса реализации службы DUBBO
  • dubbo.protocol: Конфигурация протокола, предоставляемая службой Dubbo, где имя вложенного атрибута — это имя протокола, а порт — порт протокола (-1 означает автоматически увеличивающийся порт, начиная с 20880).
  • dubbo.registry: конфигурация реестра службы Dubbo, где значением адреса подсвойства является «spring-cloud://localhost», что указывает на то, что он подключен к реестру Spring Cloud.

Примечание. Если вы используете Spring Boot 2.1 и более поздние версии, вам необходимо добавить конфигурациюspring.main.allow-bean-definition-overriding=true

четвертый шаг: Создайте основной класс приложения, например:

@EnableDiscoveryClient
@SpringBootApplication
public class DubboServerApplication {

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

}

Построить потребителя интерфейса службы

первый шаг: Создайте проект Spring Boot вpom.xmlПакет API, созданный на первом этапе, и зависимость Spring Cloud Alibaba от Nacos и Dubbo представлены в , конкретный контент такой же, как у поставщика услуг:

    <dependencies>
        <!-- 第一步中构建的API包 -->
        <dependency>
            <groupId>com.didispace</groupId>
            <artifactId>alibaba-dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <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>
        <dependency>        
            <!--<groupId>com.alibaba.cloud</groupId>-->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        //...
    </dependencies>

второй шаг: настройка информации, связанной со службами Dubbo, например:

spring.application.name=alibaba-dubbo-client
server.port=8002

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost
dubbo.cloud.subscribed-services=alibaba-dubbo-server

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

  1. Подробнее здесьdubbo.cloud.subscribed-servicesЗдесь настраивается параметр, указывающий имя службы, на которую нужно подписаться.alibaba-dubbo-serverСоответствующий является предыдущим поставщиком услугspring.application.nameЗначение , которое является именем приложения поставщика услуг.
  2. Если вы используете Spring Boot 2.1 и более поздние версии, вам необходимо добавить конфигурациюspring.main.allow-bean-definition-overriding=true.

третий шаг: Создайте основной класс приложения и реализуйте интерфейс, в котором вызывается служба Dubbo, например:

@EnableDiscoveryClient
@SpringBootApplication
public class DubboClientApplication {

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

    @Slf4j
    @RestController
    static class TestController {

        @Reference
        HelloService helloService;

        @GetMapping("/test")
        public String test() {
            return helloService.hello("didispace.com");
        }
    }

}

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

Тестовая проверка

После завершения всей вышеописанной разработки мы можем последовательно запускать Naco, поставщиков услуг и потребителей услуг. После завершения запуска мы можем увидеть две службы, определенные выше, в списке служб консоли Nacos, например:

file

Затем мы можем вызвать потребителя службы, определенного в/testИнтерфейс запускает потребительские сервисы dubbo. Если все пройдет гладко, вы сможете получить следующие результаты:

$ curl localhost:8002/test
hello didispace.com

резюме

В приведенном выше примере, если вы когда-либо играли в Spring Cloud и Dubbo одновременно, вы определенно глубоко почувствуете это. Вам не нужно одновременно беспокоиться о настройке Eureka и Zookeeper, и вам не нужно одновременно обращать внимание на работоспособность этих двух промежуточных программ, вам нужно только уделять внимание и поддерживать Nacos . Для настройки и использования Dubbo конфигурация довольно проста, а написание кода мало чем отличается от предыдущего Dubbo. Благодаря интеграции Spring Cloud Alibaba пользователи Dubbo могут не только пользоваться преимуществами производительности, обеспечиваемыми исходным RPC, но и лучше пользоваться различными преимуществами Spring Cloud, а пользователи Spring Cloud на уровне управления услугами могут вариант. Можно сказать, что интеграция этой части действительно сделала две основные группы пользователей хорошо интегрированными и сыграла роль во взаимных достижениях. Доступны дополнительные руководства по Spring Cloud и Spring Cloud Alibaba.Нажмите, чтобы просмотреть.

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

пример кода

Клиентский код контента, представленный в этой статье, читатели примера могут проверить код на следующем складе.alibaba-dubbo-api,alibaba-dubbo-server,alibaba-dubbo-clientпроект:

Если вы заинтересованы в них, добро пожаловать, пометьте, подпишитесь, добавьте в избранное и вперед, чтобы поддержать!

Добро пожаловать, чтобы обратить внимание на мой общедоступный номер: Programmer DD, получить эксклюзивные учебные ресурсы и ежедневный толчок галантерейных товаров. Если вас интересует мой рекомендуемый контент, вы также можете подписаться на мой блог:didispace.com