1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GiteeOS-springboot-guide

Клонировать/Скачать
springboot-dubbo.md 27 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 10:20 f496caa
- [Создание простого распределенного сервиса с использованием SpringBoot+Dubbo](#создание-простого-распределенного-сервиса-с-использованием-springbootdubbo)

Создание простого распределенного сервиса с использованием SpringBoot+Dubbo

Перед практической работой, рассмотрим несколько важных концепций

Перед тем как приступить к практической работе, давайте кратко ознакомимся с несколькими концепциями: Dubbo, RPC, распределенными системами. Цель данной статьи — помочь вам использовать SpringBoot + Dubbo для создания простой распределенной системы. Поэтому я кратко объясню эти концепции, не углубляясь в детали.

Что такое распределенные системы?

Распределенные системы или SOA (Service-Oriented Architecture) важны тем, что они ориентированы на предоставление услуг. Проще говоря, распределенные системы — это когда весь функционал системы разбивается на отдельные сервисы, которые размещаются на разных серверах для снижения нагрузки на каждый отдельный сервис, увеличения параллельной обработки и улучшения производительности. Например, система электронной коммерции может быть разделена на отдельные сервисы, такие как система заказов, система товаров, система входа и т.д.

Мы можем использовать Dubbo как мост для распределенных систем, но что такое Dubbo?

Что такое Dubbo?Apache Dubbo (incubating) |ˈdʌbəʊ| — это высокопроизводительный, легковесный и открытый Java-фреймворк для удаленного вызова процедур (RPC). Dubbo предоставляет три основные возможности: удаленный вызов методов на основе интерфейсов, умное управление ошибками и балансировку нагрузки, а также автоматическую регистрацию и обнаружение сервисов. Проще говоря, Dubbo — это распределенный фреймворк для сервисов, который стремится предоставить высокопроизводительные и прозрачные решения для удаленного вызова процедур и управления SOA.Dubbo имеет около 23 000 звезд на GitHub, адрес репозитория Dubbo: https://github.com/apache/incubator-dubbo. В рамках конкурса "2018 Годовой список самых популярных китайских открытых программных обеспечений" Dubbo занял третье место, уступив только vue.js и ECharts.

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

Теперь давайте кратко рассмотрим архитектуру Dubbo, чтобы лучше понять его.

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

Теперь давайте рассмотрим архитектуру Dubbo. Мы будем использовать Zookeeper в качестве центра регистрации, что рекомендовано официальной документацией Dubbo.

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

Краткое описание узлов:- Provider — сервис, предоставляющий услуги

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

Описание взаимодействия:

  1. Сервисный контейнер отвечает за запуск, загрузку и выполнение сервисных провайдеров.
  2. Сервисные провайдеры при запуске регистрируются в центре регистрации.
  3. Сервисные потребители при запуске подписываются на необходимые им сервисы в центре регистрации.
  4. Центр регистрации возвращает список адресов сервисных провайдеров потребителю, а при изменении — отправляет обновленные данные потребителю по долгоживущему соединению.
  5. Сервисные потребители выбирают сервисный провайдер из списка адресов на основе алгоритма мягкого балансирования нагрузки и выполняют запрос к нему. Если запрос не удался, выбирается другой сервисный провайдер.
  6. Сервисные потребители и провайдеры накапливают в памяти количество запросов и время их выполнения, а затем отправляют статистику каждую минуту в центр мониторинга.Когда мы говорим о Dubbo, мы упоминаем, что Dubbo является фреймворком RPC. Но что такое RPC? Думаю, после моего объяснения вы поймете это!

Что такое RPC?

RPC (Remote Procedure Call) — удалённый вызов процедур, это протокол, который позволяет запрашивать услуги с удалённого компьютера через сеть, не заботясь о низкоуровневых сетевых технологиях. Например, два разных сервиса A и B размещены на разных машинах. Как сервис A может вызвать метод сервиса B? Можно использовать HTTP-запросы, но это может быть медленно и оптимизация может быть недостаточной. Создание RPC было направлено на решение этой проблемы.

Почему использовать Dubbo?

Если вы разрабатываете распределённые системы, вы можете использовать HTTP-интерфейсы для взаимодействия, но почему стоит использовать Dubbo?

На мой взгляд, основные причины использования Dubbo заключаются в следующих четырёх характеристиках:

  1. Балансировка нагрузки — выбор того сервисного провайдера, который следует вызвать, когда один и тот же сервис размещается на разных машинах.
  2. Создание цепочки вызовов сервисов — как сервисы взаимодействуют друг с другом.
  3. Статистика нагрузки и времени работы сервисов — где находится основная нагрузка в системе, как её расширить и оптимизировать.
  4. Деградация сервиса — вызов резервного сервиса, если основной сервис недоступен.## Начнем с практического примера 1: установка и настройка Zookeeper

Перед установкой Zookeeper убедитесь, что на вашей машине уже установлен JDK.

Я использую CentOS 7.4 на сервере Aliyun. Обратите внимание: если вы также используете сервер Aliyun, вам необходимо настроить группу безопасности, иначе ваше приложение не сможет подключиться к серверу Zookeeper. Это я упомяну в дальнейшем.

1. Скачивание

Скачайте ZooKeeper с http://mirror.bit.edu.cn/apache/zookeeper/ и загрузите на Linux. Можно использовать встроенные функции для передачи файлов, такие как Xshell.

Скачивание ZooKeeper

Или используйте команду wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz для скачивания ZooKeeper (версия 3.4.12 была самой новой стабильной версией на момент написания статьи, вы можете изменить её в зависимости от ваших нужд).

2. Распаковка

tar -zxvf zookeeper-3.4.12-alpha.tar.gz

После распаковки

После распаковки измените имя распакованной директории

mv zookeeper-3.4.12 zookeeper

Удалите архив ZooKeeper

rm -rf zookeeper-3.4.12.tar.gz

3. Войдите в директорию zookeeper и создайте директорию data.

mkdir data

Перейдите в директорию data и выполните команду pwd, чтобы скопировать текущий путь (это те слова, которые я выделил красным цветом).Переход в директорию data и выполнение команды pwd

4. Войдите в директорию /zookeeper/conf и скопируйте файл zoo_sample.cfg, переименовав его в zoo.cfg.

cp zoo_sample.cfg zoo.cfg

5. Изменение конфигурационного файла

Используйте команду vim zoo.cfg для редактирования конфигурационного файла.

vim файл ------> введите : для перехода в командный режим ------> нажмите i для перехода в режим редактирования ------> редактируйте файл ------> нажмите Esc для перехода в режим командной строки ------> введите :wq для сохранения и выхода или :q! для выхода без сохранения.

Измените атрибут dataDir в конфигурационном файле:

dataDir=/usr/local/zookeeper/data

6. Запуск и тестирование

Перейдите в директорию /zookeeper/bin и выполните следующую команду:

./zkServer.sh start

Выполните команду ./zkServer.sh status, чтобы проверить текущее состояние ZooKeeper.

Или выполните команду netstat -lntup, чтобы проверить состояние сети, и убедитесь, что порт 2181 используется ZooKeeper.

Выполнение команды netstat -lntup для проверки состояния сети


Обратите внимание на возможные проблемы, если вы не отключили брандмауэр!Если вы используете серверы от Alibaba Cloud, убедитесь, что вы правильно настроили соответствующие группы безопасности.

  1. Перейдите на страницу группы безопасности для данного экземпляра. Перейдите на страницу группы безопасности для данного экземпляра
  2. Выберите настройку правил. Выберите настройку правил
  3. Выберите добавление правила группы безопасности, затем настройте его по схеме ниже. Выберите добавление правила группы безопасности, затем настройте его по схеме нижеПеред началом практической работы рекомендуется создать новый каталог, а затем поместить проекты интерфейсов, поставщиков услуг и потребителей услуг в этот каталог. Обзор проекта

Начало практической работы 2: Реализация интерфейса сервиса dubbo-interface

Основные шаги:

  1. Создание Maven-проекта;
  2. Создание класса интерфейса;
  3. Создание jar-пакета проекта для использования другими проектами.

Структура проекта:

Структура проекта dubbo-interface

Проект dubbo-interface будет собран в jar-пакет, его основная функция — предоставление интерфейсов.

1. Создание проекта dubbo-interface

File -> New -> Module..., затем выберите проект типа Maven, далее следуйте инструкциям.

Первый шаг

Второй шаг

2. Создание класса интерфейса

package top.snailclimb.service;

public interface HelloService {

    public String sayHello(String name);
}

3. Создание jar-пакета проекта для использования другими проектами

Щелкните по Maven Projects, затем выберите install, чтобы создать jar-пакет.

Начало практической работы 3: Реализация поставщика услуг dubbo-provider

Основные шаги:1. Создание проекта Spring Boot; 2. Добавление зависимостей jar-пакетов для Dubbo, Zookeeper и интерфейсов; 3. Настройка параметров Dubbo в файле application.properties; 4. Реализация класса интерфейса; 5. Создание запускающего класса поставщика услуг.Структура проекта:

Структура проекта dubbo-provider

1. Создание проекта dubbo-provider

Создайте проект SpringBoot, убедитесь, что выбран модуль web. Если вы не знаете, как это сделать, обратитесь к следующей статье, она очень подробная.Обратите внимание, что выбран модуль web

2. Введение зависимостей в файл pom

Необходимо включить зависимости для Dubbo, Zookeeper и интерфейсов. Обратите внимание, что groupId и artifactId для этого проекта и проекта dubbo-interface должны быть изменены на свои собственные. Jar-файл для интеграции Dubbo с Spring Boot можно найти здесь. Jar-файл для Zookeeper можно найти на Maven репозиториях поиска zkclient.

        <dependency>
            <groupId>top.snailclimb</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- Введение зависимости для Dubbo -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- Введение зависимости для Zookeeper -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

3. Конфигурация параметров Dubbo в файле application.properties

Конфигурация проста, благодаря специальному аннотированию @EnableDubboConfiguration, которое обеспечивает автоматическую конфигурацию Dubbo.```properties

Конфигурация порта

server.port=8333

spring.dubbo.application.name=dubbo-provider spring.dubbo.application.registry=zookeeper://ip-адрес:2181


### 4. Реализация интерфейсов

Обратите внимание: аннотация `@Service` используется Dubbo, а не Spring. Кроме того, после добавления аннотации `@Service` от Dubbo, необходимо добавить

```java
package top.snailclimb.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import top.snailclimb.service.HelloService;

@Component
@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Привет " + name;
    }
}

5. Класс запуска сервиса-потребителя Dubbo

Убедитесь, что добавлено аннотирование @EnableDubboConfiguration для включения автоматической конфигурации Dubbo.

package top.snailclimb.dubboconsumer;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// Включение автоматической конфигурации Dubbo
@EnableDubboConfiguration
public class DubboConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboConsumerApplication.class, args);
    }
}

Начало实战 4: Реализация сервиса-потребителя Dubbo

Основные шаги:

  1. Создание проекта Spring Boot;
  2. Добавление зависимостей Dubbo, Zookeeper и интерфейсов;
  3. Конфигурация Dubbo в файле application.properties;
  4. Написание тестового класса;
  5. Класс запуска сервиса-потребителя;
  6. Тестирование работы.

Структура проекта:

Структура проекта dubbo-consumer Шаги 1, 2 и 3 совпадают с шагами для сервиса-поставщика, поэтому начнем с шага 4.

4. Написание простого контроллера для вызова удаленного сервиса

package top.snailclimb.dubboconsumer;

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.snailclimb.service.HelloService;

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

    @RequestMapping("/hello")
    public String hello() {
        String hello = helloService.sayHello("мир");
        System.out.println(helloService.sayHello("SnailClimb"));
        return hello;
    }
}

6. Тестирование

Посетите страницу http://localhost:8330/hello через браузер. В ответе должно быть отображено "Привет, мир". В консоли должно появиться сообщение "Привет, SnailClimb", что соответствует ожиданиям. Эксперимент по созданию первого простого распределенного сервиса с использованием SpringBoot и Dubbo завершен успешно!

Код доступен по адресу: https://github.com/Snailclimb/springboot-guide/tree/master/source-code/advanced/springboot-dubbo


Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/GiteeOS-springboot-guide.git
git@api.gitlife.ru:oschina-mirror/GiteeOS-springboot-guide.git
oschina-mirror
GiteeOS-springboot-guide
GiteeOS-springboot-guide
master