Содержание серии статей #Про Spring Cloud
В данной серии статей будем реализовывать базовое приложение с использованием микросервисной архитектуры. Для этого будем использовать придуманную мной техническую схему:
Система имеет 2 основных компонента: BackupService (отвечает за бекап данных) и CleanupService (отвечает за периодическую подчистку устаревших версих для копий данных).
На схеме присутствуют еще два вспомагательных сервиса: ClientInfo (получение данных по пользователю) и Storage (непосредственно сервис для хранения информации)
Структура проекта
Создание структуры исходного кода проекта. Системой управления сборкой мы будем использовать Gradle, для которой мы создадим мультимодульный проект.
Пойдем по шагам:
- Создадим директория проекта:
mkdir ac-backup cd ac-backup
- Создадим новый проект gradle
gradle init
Результатом выполнения команды будет следующая структура
. ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle
Как мы видим были созданы все необходимые файлы и директороии Gradle проекта. Детальнее прочитать про струтуру проекта можно на официальном сайте системы сборки Gradle. Остается только заменить содержимое файла build.gradle на
allprojects { repositories { jcenter() } }
- Добавление модуля для аггрегации кода бекенд части проекта.
mkdir backend cd backend
Создадим build.gradle, для группы наших бекенд проектов, в которую будут входить проекты управления микросервисной архитектурой и бизнес сервисы. По аналогии создадим проекты frontend, infrastructure
Итоговая структура проекта:
.
├── backend
│ └── build.gradle
├── frontend
│ └── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── infrastructure
│ └── build.gradle
├── build.gradle
├── gradlew
├── gradlew.bat
└── settings.gradle
Создание сервиса бекапа
Следующим шагом мы приступим к созданию основного сервиса для бекапа данных, его создадим по аналогии с другими проектами в директории backend. Также не забываем добавлять проект в файл settings.gradle. Для сервиса выбрано имя backup-service.
Теперь начнем разработку непосредственно самого сервиса. Для начала необходимо подключить зависимости для создания проекта Spring Boot. Для этого в build.gradle необходимо добавить:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${bootGradlePlugin}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
baseName = 'gs-spring-boot'
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("junit:junit")
}
Я рекомендую выносить управление версиями компонентов (если они будут встречаться в нескольких похожих проектов) на уровень выше. В нашем случае я добавил в build.gradle в каталоге backend:
subprojects {
// ... ... ...
ext {
bootGradlePlugin = '2.0.3.RELEASE'
}
// ... ... ...
}
Теперь создадим наш первый контроллер (заглушка для первого этапа) для бекапа сознания мафа. Первым шагом будет объявление точки входа приложения, для этого создадим класс BackupApplication в пакете com.balynsky.ac.backup со следующим содержимым:
package com.balynsky.ac.backup;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BackupApplication {
public static void main(String[] args) {
SpringApplication.run(BackupApplication.class, args);
}
}
Вот так просто мы объявили наше Spring Boot приложение, теперь оно готово для старта и мы можем его запустить. Но перед его запуском давайте добавим наш первый контроллер. Для этого создадим класс BackupController, который на первом этапе будет выводить в консоль параметр, пришедший в теле запроса и отправлять ответ.
package com.balynsky.ac.backup.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BackupController {
@PostMapping(path = "/backup-service/backup")
public ResponseEntity backupSoul(String soul) {
System.out.println("New Soul " + soul);
return new ResponseEntity(HttpStatus.CREATED);
}
}
Теперь нам остается запустить приложение и проверить работу нашего контроллера.
curl -i -X POST -d "soul=newSoul" http://localhost:8080/backup-service/backup
HTTP/1.1 201
Content-Length: 0
Date: Sat, 25 Aug 2018 18:01:05 GMT
Как видим, наш сервис вернул 201 код, который мы задали в контроллере.
P.S. Написание тестов для SpringBoot приложения я вынес в отдельную статью, поэтому для проверки работы сервиса используется CURL.
Итоги:
На первом шаге мы создали базовую структуру проекта, подключили SpringBoot и написали наш первый контроллер.
Проект опубликован в репозитории на GitHub