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

OSCHINA-MIRROR/chunanyong-springrain

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 9.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 14.03.2025 22:37 3312049

Описание

  • SpringRain — это пример разработки на основе Spring/SpringBoot. Реализован с использованием K8S + Apisix/Istio для создания облачной микросервисной архитектуры.
  • SpringRain включает в себя генератор кода, который может создавать логический код для операций CRUD над таблицами баз данных.
  • SpringRain представляет собой стандартный Maven проект, зависящий только от SpringBoot, без Hibernate, Struts, iBatis. Для оптимизации запросов к базе данных можно использовать Druid для вывода медленных SQL-запросов, что более наглядно, чем анализ XML-файлов. Все SQL-запросы в SpringRain управляются через Finder.

Разделение фронтенда и бэкенда

Разделение фронтенда и бэкенда, использование JWT для аутентификации. Проект фронта front-springrain.

Микросервисы

Основной проект микросервиса springrain-system-web, реализованный с использованием K8S + Apisix/Istio для создания облачной микросервисной архитектуры.

Что реализовано?* Возможность разработки распределённых микросервисов так же просто, как при работе с монолитными системами.

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

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

  • Поддержка независимого запуска фронтендов и бэкендов каждого модуля, а также возможность их бесшовной интеграции для создания пакетов по требованию.## Как это работает?

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

  • Используется Seata для управления распределёнными транзакциями. Поддерживается использование аннотаций и без них (разработчики этого не замечают, теоретически существует риск потери синхронизации, но если правильно организовать логирование, этот риск минимальен).

  • Используются Services K8S для регистрации и обнаружения сервисов, ConfigMaps для конфигурационного центра. Разработчики этого не замечают.

  • Используются Apisix/Istio для обнаружения, мониторинга, размыкания и ограничения доступа к микросервисам. Разработчики этого не замечают.

Подробное описание архитектурного решения доступно по ссылке: https://www.jiagou.com/web/58-cloud-native-service-mesh/* Названия интерфейсов и реализаций должны соответствовать строгому соглашению.

  • Каждый RPC-интерфейс может иметь только одну реализацию.
  • В случае использования распределённых транзакций важно избегать ситуации, когда один сервис обновляет таблицу t, затем вызывает другой сервис, который также обновляет ту же таблицу t. Это приведёт к состоянию deadlock.
  • Распределённые транзакции без аннотаций проще в использовании, но теоретически могут содержать риск потери синхронизации. Однако, если правильно организовать логирование, этот риск минимальен.
  • Серверный слой не должен использовать Servlet API, такие как HttpRequest.
  • Рекомендуется каждому модулю фронтенда и бэкенда иметь уникальный префикс для удобства анализа путей Nginx.
  • Если версия зависимостей модулей конфликтует с версией корневого проекта, модуль не сможет быть интегрирован без особых знаний, и временно будет работать автономно.

Переход от монолита к слоёванной архитектуре* Измените зависимость springrain-system-web на springrain-system-service, прекратив использовать springrain-system-serviceimpl.

  • В springrain-system-serviceimpl добавьте зависимость springrain-grpc-server, активируйте аннотацию @SpringBootApplication для org.springrain.SystemServiceImplApplication.
  • Запустите сервер seata-server. Конфигурация клиента Seata находится в файле resources/file.conf проекта, по умолчанию default.grouplist = "127.0.0.1:8091".
  • Запустите springrain-system-serviceimpl.
  • Запустите springrain-system-web.
  • Пройдите по адресу http://127.0.0.1:8080/system/api/checkHealth.

Документация

https://gitee.com/chunanyong/springrain/tree/master/springrain-system/springrain-system-web/doc

Генератор кода

https://gitee.com/chunanyong/springrain/tree/master/springrain-gencode

SQL скрипты

https://gitee.com/chunanyong/springrain/tree/master/springrain-system/springrain-system-web/sql

Тестовые случаи

// Для простого примера достаточно одного сервиса для управления любой таблицей базы данных
//@Test  Получение объекта
public void testObject() throws Exception {
    // Finder finder = new Finder("select id from t_user where 1=1 ");
    Finder finder = Finder.getSelectFinder(User.class, "id").append(" WHERE 1=1 ");
    finder.append(" AND id=:userId ").setParam("userId", "admin");
    String id = baseDemoService.queryForObject(finder, String.class);
    System.out.println(id);
}

//@Test Получение объекта пользователя
public void testObjectUser() throws Exception {
    // Finder finder = new Finder("select * from t_user where id=:userId order by id");
    Finder finder = Finder.getSelectFinder(User.class).append(" WHERE id=:userId ORDER BY id DESC ");
    finder.setParam("userId", "admin");
    User u = baseDemoService.queryForObject(finder, User.class);
    System.out.println(u.getName());
}
``````markdown
//@Test Получение пагинированного списка
public void testMsSql() throws Exception {
    // Finder finder = new Finder("select * from t_user order by id");
    Finder finder = Finder.getSelectFinder(User.class).append(" order by id desc ");
    List<User> list = baseDemoService.queryForList(finder, User.class, new Page(2));
    System.out.println(list.size());
    for (User s : list) {
        System.out.println(s.getName());
    }
}

//@Test Вызов хранимой процедуры базы данных
public void testProc() throws Exception {
    Finder finder = new Finder();
    finder.setParam("unitId", 0);
    finder.setProcName("proc_up");
    Map queryObjectByProc = (Map) baseDemoService.queryObjectByProc(finder);
    System.out.println(queryObjectByProc.get("#update-count-10"));
}

//@Test Вызов базовой функции базы данных public void testFunction() throws Exception { Finder finder = new Finder(); finder.setFunName("fun_userId"); finder.setParam("userId", "admin"); String userName = baseDemoService.queryForObjectByFunction(finder, String.class); System.out.println(userName); }


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

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

1
https://api.gitlife.ru/oschina-mirror/chunanyong-springrain.git
git@api.gitlife.ru:oschina-mirror/chunanyong-springrain.git
oschina-mirror
chunanyong-springrain
chunanyong-springrain
master