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

OSCHINA-MIRROR/Wind_Jerry-AZAZ

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
AZAZ音视频项目架构文档.md 45 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 03.06.2025 00:05 bc35c59

Архитектурный документ проекта AZAZ

Обзор:

В данном проекте используется архитектура с разделением на фронтенд и бэкенд. Фронтенд разработан с использованием фреймворка Vue, а бэкенд — с использованием фреймворков SpringBoot и SpringCloudAlibaba. Промежуточные технологии, используемые в проекте, включают MySQL, MongoDB, Redis, ElasticSearch, Nacos и RocketMQ.

Фреймворки

Для бэкенда в проекте используется набор фреймворков Spring, версии которых следующие: jdk17 - springboot2.6.11 - springcloud2021.0.4 - springcloudalibaba2021.0.4.0.

Технологические решения

Технологические решения для фронтенда

Фронтенд разработан с использованием стека технологий js + html + css, а фреймворк выбран Vue.

Технологические решения для бэкенда

Контрольный и сервисный уровни выбраны следующими версиями: jdk17 - springboot2.6.11 - springcloud2021.0.4 - springcloudalibaba2021.0.4.0.

Для баз данных выбраны следующие технологии: облачное хранилище Qiniu, реляционная база данных MySQL, не реляционная база данных Redis, документная база данных MongoDB, промежуточное сообщение RocketMQ и индексный поиск ElasticSearch.

Верхнеуровневые технические решения для AZAZ аудио-видео

Верхнеуровневые модули

Архитектура проекта AZAZ аудио-видео

Архитектура проекта AZAZ аудио-видео## Модули

Обзор

Основная структура проекта представлена следующим образом:

├── .idea
├── azaz-common # Общий пакет, включающий константы, общие утилиты, модели исключений и т.д.
├── azaz-feign-api # OpenFeign удаленные вызовы
├── azaz-gateway # SpringCloud Gateway
├── azaz-model # Модели, включающие dto, vo, pojo и т.д.
├── azaz-page # Фронтенд страницы
├── azaz-service # Пакеты реальных бизнес-услуг
│   ├── azaz-interact # Социальные услуги
│   ├── azaz-search # Услуги поиска
│   ├── azaz-user # Услуги пользователя
│   └── azaz-video # Услуги видео
├── pom.xml # Файл pom зависимостей
├── project-log # Логи logback
└── resource # Проектные ресурсы, включая sql для запуска и т.д.

В данном проекте бизнес-услуги разделены вертикально в соответствии с бизнес-логикой. Учитывая степень взаимосвязи бизнес-процессов, услуги разделены на четыре части: услуги пользователя, услуги видео, социальные услуги, услуги поиска. Такой подход обеспечивает автономность и расширяемость, каждая услуга соответствует своей базе данных, что позволяет достичь высокой степени интеграции и низкой степени взаимозависимости.

Пользовательский модуль

1. Структура проекта```shell

├── azaz-user # User module │   ├── controller # Controllers │   ├── service # Services │   ├── dao # DAO │   ├── mapper # Mappers │   ├── entity # Entities │   ├── config # Configurations │   ├── exception # Exceptions │   ├── util # Utilities │   └── vo # VO


```shell
 ├── pom.xml # файл зависимостей pom
 └── src # исходные файлы проекта
     └── main
         ├── java
         │   └── com
         │       └── azaz
         │           ├── UserApplication.java # класс запуска сервиса пользователей
         │           ├── config # пакет конфигураций
         │           │   ├── MybatisConfig.java # конфигурация MybatisPlus
         │           │   ├── RedissonConfig.java # конфигурация Redisson
         │           │   └── WebMvcConfiguration.java # конфигурация SpringMVC
         │           ├── controller # пакет контроллеров
         │           │   ├── UserInfoController.java # контроллер информации пользователя
         │           │   └── UserLoginController.java # контроллер входа и регистрации пользователя
         │           ├── interceptor # пакет интерцепторов
         │           │   └── TokenInterceptor.java # интерцептор токенов
         │           ├── mapper # пакет мапперов
         │           │   ├── UserLoginMapper.java
         │           │   └── UserMapper.java
         │           └── service # пакет сервисов
         │               ├── UserInfoService.java # интерфейс сервиса информации пользователя
         │               ├── UserLoginService.java # интерфейс сервиса входа и регистрации пользователя
         │               └── impl
         │                   ├── UserInfoServiceImpl.java
```java # реализация интерфейса сервиса информации пользователя
         │                   └── UserLoginServiceImpl. java # реализация интерфейса сервиса входа и регистрации пользователя
         └── resources
             ├── application. yml # конфигурация middleware и логов
             ├── bootstrap. yaml # конфигурация nacos
             ├── logback. xml # конфигурация логов
             └── mapper # xml файлы Mybatis

```#### 2. Сущностное проектирование```Проектирование сущности пользователя представлено ниже:

```java
@TableName("tb_user")
public class User {
    /**
     * Идентификатор пользователя, использует автоматическое увеличение базы данных
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * Номер телефона, уникальный
     */
    @TableField("phone")
    private String phone;
    /**
     * Имя пользователя
     */
    @TableField("username")
    private String username;

    /**
     * Пароль
     */
    @TableField("password")
    private String password;
    /**
     * Соль
     */
    @TableField("salt")
    private String salt;

    /**
     * URL аватара пользователя
     */
    @TableField("image")
    private String image;

    /**
     * Персональная подпись пользователя
     */
    @TableField("signature")
    private String signature;

    /**
     * Статус пользователя, 0 - нормальный, 1 - заблокированный
     */
    @TableField("status")
    private Integer status;

    /**
     * Количество подписок пользователя
     */
    @TableField("attention")
    private Integer attention;

    /**
     * Количество подписчиков пользователя
     */
    @TableField("followers")
    private Integer followers;

    /**
     * Количество работ пользователя
     */
    @TableField("works")
    private Integer works;

    /**
     * Количество лайков пользователя
     */
    @TableField("likes")
    private Integer likes;

    /**
     * Время создания
     */
    @TableField("create_time")
    private LocalDateTime createTime;

    /**
     * Время обновления
     */
    @TableField("update_time")
    private LocalDateTime updateTime;
}

3. Основные функциональные возможности

Модуль пользователя отвечает за функциональные возможности, ориентированные на пользователя, включая регистрацию пользователя, вход пользователя, запрос информации пользователя и т.д.Регистрация пользователя

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

Параллельная регистрация пользователя

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

Изменение информации пользователя В данном проекте изменение пользовательской информации не только затрагивает базу данных и кэш, но также влияет на индексный каталог поиска, так как имя пользователя должно быть доступно для поиска. Поэтому после того, как пользователь изменяет данные своего аккаунта, необходимо обновить и индексный каталог. Учитывая производительность и опыт пользователя, система использует асинхронную коммуникацию с помощью RocketMQ для уведомления службы ES о необходимости обновления индексного каталога.Изменение пользовательской информации

Поиск пользовательской информации

В видео-сценарии данной системы поиск пользовательской информации происходит довольно часто. В системе пользовательская информация разделена на два типа:

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

Второй тип — это данные, которые запрашиваются при просмотре домашней страницы пользователя. Эти данные включают не только краткую информацию, но также количество подписчиков, количество фанатов, количество работ и другие подробные данные. Такие данные запрашиваются только при переходе на домашнюю страницу пользователя и являются менее частыми запросами. Для получения данных этого типа требуется выполнить удаленный вызов соответствующего сервиса, объединить полученные данные с базовой информацией и вернуть результат пользователю.Разделение данных на два типа позволяет избежать избыточных запросов и передачи данных, что значительно уменьшает сетевые операции ввода-вывода и уменьшает время запроса для первого типа данных, что улучшает опыт пользователя.### Видео-модуль

1. Структура проекта

├── pom.xml # файл зависимостей pom
└── src # исходные файлы проекта
    └── main
        ├── java
        │   └── com
        │       └── azaz
        │           ├── VideoApplication.java # класс запуска видео-сервиса
        │           ├── config # пакет конфигураций
        │           │   ├── MybatisConfig.java # конфигурация Mybatis
        │           │   ├── RedissonConfig.java # конфигурация Redisson
        │           │   └── WebMvcConfiguration.java # конфигурация Web MVC
        │           ├── controller # пакет контроллеров
        │           │   └── VideoController.java # контроллер видео
        │           ├── interceptor # пакет интерцепторов
        │           │   └── TokenInterceptor.java # интерцептор токена
        │           ├── mapper # пакет мапперов
        │           │   ├── CommentMapper.java # маппер комментариев
        │           │   └── VideoMapper.java # маппер видео
        │           └── service # пакет сервисов
        │               ├── DbOpsService.java # сервис операций с MongoDB
        │               ├── VideoDoLikeService.java # сервис лайков и закреплений
        │               ├── VideoUploadService.java # сервис загрузки видео
        │               └── impl
        │                   ├── DbOpsServiceImpl.java # реализация сервиса операций с MongoDB
        │                   ├── VideoDoLikeServiceImpl.java # реализация сервиса лайков и закреплений
        │                   └── VideoUploadServiceImpl.java # реализация сервиса загрузки видео
        └── resources
            ├── application.yml # конфигурации middleware и логов
            ├── bootstrap.yaml # конфигурации Nacos
            ├── logback.xml # конфигурация логов
            └── mapper # xml-файлы Mybatis

2. Энтити-дизайнДизайн энтити видео представлен ниже:

public class Video {
    /**
     * Идентификатор видео
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * Идентификатор автора видео
     */
    @TableField("author_id")
    private Long authorId;

    /**
     * Название видео
     */
    @TableField("title")
    private String title;

    /**
     * Раздел, 0 - популярное, остальное - неопределено
     */
    @TableField("section")
    private Integer section;

    /**
     * URL обложки видео
     */
    @TableField("cover_url")
    private String coverUrl;

    /**
     * URL видео
     */
    @TableField("video_url")
    private String videoUrl;

    /**
     * Статус видео. 0 - нормальный, 1 - удалено
     */
    @TableField("status")
    private Integer status;

    /**
     * Время создания
     */
    @TableField("create_time")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * Время обновления
     */
    @TableField("update_time")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * Количество лайков
     */
    @TableField("likes")
    private Long likes;

    /**
     * Количество добавлений в избранное
     */
    @TableField("collects")
    private Long collects;

    /**
     * Количество комментариев
     */
    @TableField("comments")
    private Long comments;
}

Дизайн энтити комментария представлен ниже:

public class Comment {
    /**
     * Идентификатор комментария
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * Идентификатор видео
     */
    @TableField("video_id")
    private Long videoId;

    /**
     * Идентификатор пользователя
     */
    @TableField("user_id")
    private Long userId;

    /**
     * Имя пользователя
     */
    @TableField("user_name")
    private String userName;
}
``````java
    /**
     * URL аватара пользователя
     */
    @TableField("image")
    private String image;

    /**
     * Идентификатор родительского комментария
     */
    @TableField("parent_id")
    private Long parentId;

    /**
     * Содержимое комментария
     */
    @TableField("content")
    private String content;

    /**
     * Статус комментария
     */
    @TableField("status")
    private Integer status;

    /**
     * Время создания
     */
    @TableField("create_time")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
``````markdown
#### 3. Основные функции дизайна

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

**Дизайн функции лайков**

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

Учитывая потребности данного проекта:

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

Для реализации этих функций используется следующий дизайн:

+ Хранение данных о лайках в базе данных для быстрого доступа и обработки запросов.
+ Использование кэширования для ускорения отклика на запросы о лайках.
+ Реализация механизма обработки множественных лайков для предотвращения конкуренции и обеспечения стабильной работы системы.
```> 1. При получении запроса на лайк, фронтенд передает videoId, а userId текущего пользователя получается с помощью threadlocal.
> 2. Сет лайков видео сохраняется в Redis, где ключ имеет префикс + videoId, а значение представляет собой сет userId (уникальность элементов сета предотвращает повторные лайки).
> 3. Данные сета передаются асинхронно в MongoDB для долгосрочного хранения.
> 4. Общее количество лайков видео сохраняется в Redis в виде ключ-значение, где ключ имеет префикс + videoId, а значение представляет собой общее количество лайков + 1 (для этой операции используется Redisson для добавления распределенного блокировочного механизма).
> 5. Данные о количестве лайков передаются асинхронно через RocketMQ в MySQL для долгосрочного хранения.
> 6. Сохранение связи между пользователем и лайкнутым видео в таблице MySQL для удобства поиска списка лайков пользователя.+ Запросы

      1. Получение общей суммы лайков видео, извлечение данных из Redis (если ключ истек, данные извлекаются из MySQL).
    
      2. Получение списка лайков пользователя, извлечение данных из таблицы MySQL.
    
      3. Проверка, поставлен ли лайк текущим пользователем (проверка наличия userId в Redis), сначала извлечение сета лайкнутых пользователей из Redis, затем проверка наличия текущего userId в этом сете. Если Redis не работает, данные извлекаются из MongoDB и обновляются в Redis.

> 1. Получение общей суммы лайков видео, извлечение данных из Redis (если ключ истек, данные извлекаются из MySQL).
> 2. Получение списка лайков пользователя, извлечение данных из таблицы MySQL.
> 3. Проверка, поставлен ли лайк текущим пользователем (проверка наличия userId в Redis), сначала извлечение сета лайкнутых пользователей из Redis, затем проверка наличия текущего userId в этом сете. Если Redis не работает, данные извлекаются из MongoDB и обновляются в Redis.
```![](../resource/imgs/video1.png)

+ **Почему выбран MongoDB**

В ходе хранения ID пользователей, которые поставили лайк каждому видео, было выбрано использование MongoDB вместо традиционного MySQL по следующим причинам:> 1. Хранение данных в формате, удобном для хранения объектных типов данных. При хранении коллекции ID лайков пользователей, традиционный MySQL имеет ограниченную структуру данных, что затрудняет выполнение задачи, в то время как MongoDB с его свободной формой хранения предоставляет идеальное решение.
>
> 2. Врожденная высокая доступность и способность к горизонтальному масштабированию делают его идеальным для работы с большими объемами данных и высокой пропускной способностью. Для популярных видео количество лайков может достигать сотен тысяч или даже миллионов, что идеально соответствует высокой производительности MongoDB.
>
> 3. Структура JSON и объектные модели близки, что позволяет сократить объем кода. Динамическая модель JSON означает, что она легче адаптируется к новым бизнес-требованиям.
>
> 4. Данные лайков не требуют строгой согласованности и безопасности, поэтому допускается некоторая степень несогласованности.+ **Дизайн комментариев к видео**

Функция комментариев к видео должна учитывать возможность наличия вложенных комментариев.

1. Основные поля в таблице хранения

    > ID родительского комментария: отслеживает, к какому комментарию относится этот комментарий; если это прямой комментарий к видео, то значение этого поля равно 0.
    >
    > ID видео: отслеживает, к какому видео относится этот комментарий.
    >
    > Объединенный индекс ID родительского комментария и ID видео для удобства поиска.

2. Операции поиска

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

**Дизайн получения потока видео**

При получении видео используется самый простой модель: видео отправляются в хронологическом порядке.> 1. Если значение lastId, переданное фронтендом в первый раз, равно 0, то начинается поиск с самого нового видео. В противном случае используется переданный фронтендом идентификатор.
>
> 2. При публикации видео оно сериализуется в JSON-строку и сохраняется в Redis.
>
> 3. По ID последнего видео, переданного фронтендом, из Redis извлекаются 10 видео, которые затем десериализуются в объекты видео и проходят фильтрацию по разделам.
>
> 4. По ID видео и ID пользователя в Redis проверяется наличие лайков или добавлений в избранное.
>
> 5. Используя Feign, осуществляется удаленный вызов метода модуля пользователей для получения информации о пользователе и видео, которая затем упаковывается вместе.### Социальный модуль#### 1. Структура проекта по уровням```shell
 ├── pom.xml # файл зависимостей pom
 └── src # исходные файлы проекта
     └── main
         ├── java
         │   └── com
         │       └── azaz
         │           ├── InteractApplication.java # класс запуска социальной службы
         │           ├── config # пакет конфигураций
         │           │   ├── MybatisConfig.java # конфигурация MybatisPlus
         │           │   ├── RedissonConfig.java # конфигурация Redisson
         │           │   └── WebMvcConfiguration.java # конфигурация SpringMVC
         │           ├── controller # пакет контроллеров
         │           │   ├── PrivateMessageController.java # контроллер для личных сообщений
         │           │   └── UserFollowController.java # контроллер для подписок
         │           ├── interceptor # пакет интерцепторов
         │           │   └── TokenInterceptor.java # интерцептор для токенов
         │           ├── mapper # пакет мапперов
         │           │   ├── FollowMapper.java
         │           │   └── PrivateMessageMapper.java
         │           ├── mq # пакет для очередей сообщений RocketMQ
         │           │   └── PrivateMessageListener.java # слушатель для отправки личных сообщений
         │           └── service # пакет сервисов
         │               ├── PrivateMessageService.java # сервис для личных сообщений
         │               ├── UserFollowService.java # сервис для подписок
         │               └── impl 
         │                   ├── PrivateMessageServiceImpl.java # реализация сервиса для личных сообщений
         │                   └── UserFollowServiceImpl.java # реализация сервиса для подписок
         └── resources
             ├── application.yml # конфигурации middleware и логов
             ├── bootstrap.yml # конфигурации Nacos
             ├── logback.xml # конфигурация логов
             └── mapper # xml файлы для Mybatis

2. Энтити-дизайнПриватные сообщения имеют следующий энтити-дизайн:

@TableName("tb_private_message")
public class PrivateMessage {
    /**
     * Идентификатор приватного сообщения
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * Идентификатор отправителя
     */
    @TableField("sender_id")
    private Long senderId;

    /**
     * Идентификатор получателя
     */
    @TableField("receiver_id")
    private Long receiverId;

    /**
     * Тип сообщения, 0 - по умолчанию, 1 - видео от друга, 2 - системное сообщение
     */
    @TableField("message_type")
    private Integer messageType;

    /**
     * Содержимое сообщения
     */
    @TableField("message_content")
    private String messageContent;

    /**
     * Статус сообщения, 0 - активно, 1 - удалено
     */
    @TableField("status")
    private Integer status;

    /**
     * Время создания
     */
    @TableField("create_time")
    private LocalDateTime createTime;
}

3. Основные функции

Подписка

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

  • Дизайн базы данных

Чтобы избежать потери данных, при выполнении пользователем действий по подписке или отписке, система немедленно сохраняет данные в базу данных MySQL на диске. Это возможно, так как действия по подписке и отписке обычно предваряются размышлениями и не являются столь частыми, как, например, лайки. Поэтому новые данные о подписке для одного пользователя в день обычно не слишком многочисленны, и их можно немедленно сохранять на диске, используя кэширование при чтении.На уровне данных, данные о подписке между пользователями хранятся в таблице подписок, которая содержит три важных поля: идентификатор записи id, идентификатор пользователя userId, идентификатор пользователя, на которого подписан followId. Создание индексов для этих полей значительно повышает скорость выполнения запросов.

  • Дизайн кэширования

Когда пользователь просматривает свою страницу или страницу другого пользователя, отображаются количество подписчиков и подписок, а также кнопка подписки в различных состояниях в зависимости от того, подписан ли пользователь на другого пользователя.Для реализации отображения количества подписчиков и подписок, данные о количестве подписчиков и подписок пользователя сохраняются в Redis с ключом, состоящим из префикса и идентификатора пользователя, и значением, представляющим количество подписчиков или подписок. Это повышает эффективность добавления, изменения и запроса данных. Время жизни ключа можно установить на бесконечное значение, так как данные представляют собой только одно число и занимают небольшое место. Второй параметр проверяет функцию другого пользователя, анализируя пару userId и followId в базе данных. Поскольку переход на страницу другого пользователя является довольно частым действием, такая операция не должна выполняться в базе данных. Учитывая различные факторы, система использует структуру данных Set в Redis для хранения всех пользователей, на которых подписан определённый пользователь: уникальность элементов в структуре Set гарантирует, что не будет повторных подписок на одного и того же пользователя, а использование функции isMember() позволяет быстро проверить, находится ли пользователь в списке подписок. Сохранение списка подписок пользователя, а не списка подписчиков, обусловлено тем, что крупные пользователи могут иметь множество подписчиков, тогда как количество подписок одного пользователя будет ограничено.Сохранение списка подписок пользователя позволяет эффективно распределить данные по разным ключам, что повышает производительность.+ Уникальность

Чтобы предотвратить ситуацию, когда пользователь часто нажимает на кнопку подписки и отписки или параллельно отправляет запросы на подписку, блок кода, отвечающий за подписку, использует распределённый блокировщик Redisson для блокировки пользователя по его ID.

  • Восстановление после сбоя

Так как новые и обновленные данные о лайках немедленно сохраняются в базе данных, даже если Redis выйдет из строя, данные можно восстановить из базы данных.

Приватные сообщения

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

  • Процесс отправки приватных сообщений
  1. Установка другого пользователя в качестве первого в списке чатов в Redis, где сохраняются недавно общавшиеся пользователи.
  2. Вставка сообщения в базу данных и получение идентификатора сообщения.
  3. Кэширование данных в Redis, где ключ для истории сообщений двух пользователей имеет вид: префикс + Min(myId, otherId) + "-" + Max(myId, otherId), структура данных — список, так как leftPush обеспечивает последовательность сообщений в порядке добавления. Сообщения сохраняются в Redis в течение 30 дней.+ Процесс запроса приватных сообщений
  1. При первом запросе система проверяет последнее сообщение, получая его из списка в Redis. Если сообщение найдено, оно возвращается, если нет, то сообщение считается устаревшим, и данные загружаются из базы данных.
  2. При каждом последующем запросе сервер передаёт идентификатор последнего сообщения, используя метод с использованием курсора для повышения производительности запросов.

Поиск#### 1.Структура проекта

├── pom.xml # файл зависимостей pom
└── src # исходные файлы проекта
    └── main
        ├── java
        │   └── com
        │       └── azaz
        │           ├── SearchApplication.java # класс запуска сервиса поиска
        │           ├── config # пакет конфигураций
        │           │   ├── ElasticSearchConfig.java # конфигурация ElasticSearch
        │           │   ├── MybatisConfig.java # конфигурация MybatisPlus
        │           │   └── WebMvcConfiguration.java # конфигурация SpringMVC
        │           ├── controller # пакет контроллеров
        │           │   └── SearchController.java # контроллер поиска
        │           ├── interceptor # пакет фильтров
        │           │   └── TokenInterceptor.java # фильтр токенов
        │           ├── mq # пакет потребителей RocketMQ
        │           │   ├── UserInfoListener.java # слушатель изменений пользовательской информации
        │           │   └── VideoPublishListener.java # слушатель изменений информации о видео
        │           └── service # пакет сервисов
        │               ├── SearchService.java # интерфейс сервиса поиска
        │               └── impl
        │                   └── SearchServiceImpl.java # реализация интерфейса сервиса поиска
        └── resources
            ├── application.yml # конфигурации middleware и логов
            ├── bootstrap.yaml # конфигурации nacos
            ├── logback.xml # конфигурация логов
            └── mapper # xml файлы Mybatis

2. Основные функции дизайнаФункция поиска

Функция поиска использует индексный каталог Elasticsearch, который разделён на индексный каталог для имен пользователей и индексный каталог для заголовков видео. Поэтому добавление, обновление и удаление индексного каталога зависят от сервиса пользователей и сервиса видео. В данной системе обмен данными между этими сервисами и сервисом поиска осуществляется с помощью асинхронных сообщений RocketMQ.

Функция поиска

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

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

1
https://api.gitlife.ru/oschina-mirror/Wind_Jerry-AZAZ.git
git@api.gitlife.ru:oschina-mirror/Wind_Jerry-AZAZ.git
oschina-mirror
Wind_Jerry-AZAZ
Wind_Jerry-AZAZ
master