От монолита к микросервисам: создайте свое первое приложение для микросервисов с помощью Spring Boot
7 марта 2022 г.Прочитав заголовок, вы, вероятно, задаетесь вопросом, что такое микросервис и чем он отличается от монолитной Java-программы. Если мы посмотрим на определение микросервисов. По сути, микросервис — это архитектура.
Микросервисы (или архитектура микросервисов) — это подход к облачной архитектуре, в котором одно приложение состоит из множества слабо связанных и независимо развертываемых более мелких компонентов или сервисов
Так почему микросервисы, а не монолитные программы?
- Проще создавать и поддерживать приложения — ключевой принцип микросервисов — простота. Приложения становятся проще создавать и поддерживать, когда они разбиты на набор более мелких компонуемых фрагментов. Управление кодом также становится менее болезненным, поскольку каждый микросервис фактически представляет собой отдельный фрагмент кода. Услуги могут быть реализованы с использованием различных языков программирования, баз данных и программных сред. Это позволяет независимо развертывать, перестраивать, повторно развертывать и управлять каждой службой.
- Повышение производительности и скорости — Благодаря микросервисам каждая команда разработчиков может смотреть только на конкретный сервис, который они создают, не беспокоясь обо всем исходном коде. Это повысит производительность команды вместе со скоростью доставки.
- Микросервисы масштабируются независимо — По мере роста спроса на приложение его легче масштабировать с помощью микросервисов. Вы можете увеличить ресурсы для наиболее необходимых микросервисов, а не масштабировать все приложение. Это также означает, что масштабирование выполняется быстрее и зачастую более рентабельно.
- Микросервисы сокращают время простоя за счет изоляции сбоев — В случае сбоя определенного микросервиса вы можете изолировать этот сбой для этого единственного сервиса и предотвратить каскадные сбои, которые могут привести к сбою приложения. Эта изоляция сбоев означает, что ваше критическое приложение может оставаться в рабочем состоянии даже в случае сбоя одного из его модулей.
Итак, теперь мы знаем, почему обычно все крупные организации предпочитают микросервисы поддержке большого комбинированного исходного кода. Давайте попробуем разработать микросервис с помощью Spring Boot — очень популярной платформы Java, используемой для разработки корпоративных приложений.
Описание Проекта
Мы собираемся разработать микросервис для создания RESTful API для приложения Tour в Калифорнии 🗻. Давайте начнем,
Создать проект
В экосистеме Spring можно найти множество зависимостей. Для этого нам понадобятся зависимости для
- Веб, который включает Tomcat и Spring MVC
- Репозитории Rest для доступа к репозиториям Spring Data через REST API.
- API сохраняемости Java
- База данных H2 в памяти
Вы можете легко создать проект Spring с помощью Spring Initializer. Перейдите на веб-страницу Spring Initializer и выберите проект в качестве проекта Maven, для язык выберите Java, заполните метаданные проекта, выберите упаковку как JAR и выберите версию Java, которую вы разрабатываете. Затем добавьте зависимости,
- Весенний МВК
- Репозитории REST
- Весенние данные JPA
- База данных H2
И, наконец, нажмите «Создать», он загрузит zip-файл, который создал структуру вашего проекта с указанными зависимостями в вашем файле pom.xml
.
Структура проекта
Как вы можете видеть на картинке выше, есть несколько файлов, и если мы проверим файл pom.xml
, мы увидим, что здесь представлены зависимости, которые мы добавили в инициализаторе Spring.
Давайте посмотрим на файл CaliforniaApplication.java
.
https://gist.github.com/maneeshaindrachapa/f0d9fc4cb4c06216abc94a0d8885731c
Этот файл CaliforniaApplication.java
содержит метод main, а также аннотацию @SpringBootApplication
. Добавление этой аннотации означает, что мы сообщаем JVM, что это место, где запускается микросервис, и main
метод там, поэтому он не похож на упакованные файлы войны, поэтому мы можем фактически контролировать запуск и остановку веб-приложения.
@SpringBootApplication
аннотация используется для обозначения класса конфигурации, который объявляет один или несколько @Bean
методов, а также запускает автоконфигурацию
и сканирование компонентов. Это то же самое, что объявить класс с @Configuration, @EnableAutoConfiguration и @ComponentScan
аннотациями.
Запуск Spring Boot Server
Когда вы запускаете основной метод, вы видите, что приложение Spring запускается. Чтобы изменить порт, с которого запускается сервер, вы можете перейти в файл application.properties
и добавить новое свойство server.port=8081
Чтобы проверить, работает ли сервер, перейдите на http://localhost:8081/profile и вы увидите примерно следующее:
Разработка проекта
Теперь мы готовы разработать спокойный веб-сервис Tour California. Во-первых, давайте проверим диаграмму классов спокойного веб-сервиса, который мы собираемся создать.
1. Создание моделей
Сначала создайте новый пакет и назовите его модель и создайте в нем эти бизнес-объекты.
https://gist.github.com/maneeshaindrachapa/58ec8c3924b2044dcc0468e1026cb429
https://gist.github.com/maneeshaindrachapa/dab4d0be4308ff21d545c33188ce8119
https://gist.github.com/maneeshaindrachapa/9c1c7570931c43dd781d30f2d184348d
https://gist.github.com/maneeshaindrachapa/64ad22989db443dc1996881cff5e5249
Как вы можете видеть в файлах Tour.java и TourPackage.java, были использованы некоторые аннотации. Давайте посмотрим, что они означают. Эти аннотации используются в Java Persistent API. В качестве спецификации;
:::Информация
- Java Persistence API связан с сохранением, что в общих чертах означает любой механизм, с помощью которого объекты Java переживают процесс приложения, создавший их. *
- @Entity — Аннотируйте все компоненты управления данными с помощью @Entity.
- @Column — укажите сопоставление столбцов с помощью аннотации @Column.
- @Id — аннотируйте столбец идентификатора с помощью @Id.
- @GeneratedValue — позволяет базе данных сгенерировать (автоматически увеличить) столбец идентификатора.
- @OneToOne — Для объектов, использующих один и тот же первичный ключ, мы можем связать их с помощью @OneToOne.
- @ManyToOne — Для сущностей, которые имеют много отношений с одной сущностью, например, в нашем проекте, один TourPacakge состоит из множества Tours.
- @Enumerated — Таким образом, мы можем указать поставщику JPA преобразовать перечисление в его порядковое или строковое значение.
2. Создание репозиториев
Создайте новое имя пакета repository и создайте репозитории, необходимые для проекта.
https://gist.github.com/maneeshaindrachapa/7cff46d5fa9eb49330c7f5a99947d2ab
https://gist.github.com/maneeshaindrachapa/638b0cf86a76bf4ed18958c202eb5ae0
- Мы создаем репозитории для двух имеющихся у нас объектов, а также расширяем * интерфейс CrudRepository, который представляет собой интерфейс Spring Data для общих операций CRUD в репозитории определенного типа. Он предоставляет несколько готовых методов для взаимодействия с базой данных. При расширении
CrudRepository<T, ID>
вам необходимо определитьT-entity, ID-тип вашего столбца ID в Entity
.
В приведенном выше коде использовались некоторые аннотации. Давайте посмотрим, какие они,
- @RepositoryRestResource — используется для установки параметров в общедоступном интерфейсе репозитория — он автоматически создает конечные точки в зависимости от типа расширяемого репозитория (CrudRepository/PagingAndSortingRepository и т. д.)
- @Repository — специализация аннотации @Component , которая используется для указания того, что класс предоставляет механизм для хранения, извлечения, обновления, удаления и операции поиска объектов.
3. Создание сервисов
Создайте новое имя пакета service и создайте в нем службы, необходимые для проекта.
https://gist.github.com/maneeshaindrachapa/61ca2e4a380135eff34e9ab261c5b5a8
https://gist.github.com/maneeshaindrachapa/f6e61d5623268fd12d1b90e68714111e
В приведенном выше коде использовались некоторые аннотации. Давайте посмотрим, какие они,
- @Service — используется с классами, предоставляющими некоторые бизнес-функции. Контекст Spring автоматически обнаружит эти классы, когда используется конфигурация на основе аннотаций и сканирование путей к классам.
- @Autowired — эта аннотация обеспечивает более детальный контроль над тем, где и как должна выполняться автоматическая проводка. Аннотацию @Autowired можно использовать для автопривязки bean-компонента к методу установки точно так же, как аннотацию @Required , конструктор, свойство или методы с произвольными именами и/или несколькими аргументами.
Как вы можете видеть в приведенном выше коде, мы используем интерфейсы репозитория, которые мы создали до этого, чтобы использовать методы, уже разработанные в CrudRepository, такой интерфейс, как findById(), findAll()` . По сути, мы используем сервисы, чтобы маскировать репозитории от внешних сторон и использовать логику, которую мы хотим, на бизнес-уровне.
4. Настройка базы данных
В нашем проекте, чтобы увидеть, что API работают, нам нужно иметь некоторые данные в нашей базе данных. Здесь мы используем базу данных h2 в памяти. Итак, давайте сначала добавим некоторые конфигурации в application.properties
, где мы можем получить доступ к базе данных в памяти.
```javascript
spring.h2.console.enabled = правда
spring.datasource.url=jdbc:h2:mem:туркалифорния
spring.datasource.driverClassName=org.h2.Драйвер
spring.datasource.username = администратор
spring.datasource.password=admin
spring.jpa.database-platform = org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
Теперь из CaliforniaApplication.java
, где находится основной метод, мы можем реализовать интерфейс CommandLineRunner
, который представляет собой простой интерфейс Spring Boot с методом запуска. Spring Boot автоматически вызовет метод run всех bean-компонентов, реализующих этот интерфейс, после загрузки контекста приложения.
Во-первых, мы добавляем свойство в наш файл application.properties для чтения файла ExploreCalifornia.json.
```javascript
ec.importfile=ИсследоватьКалифорнию.json
Затем мы добавляем код для чтения файла JSON и добавляем его в базу данных в файле CaliforniaApplication.java. Мы можем использовать @value весной для импорта имени файла.
- @Value — эта аннотация обеспечивает удобный способ внедрения значений свойств в компоненты. Также весьма полезно предоставить разумные значения по умолчанию для случаев, когда свойство может отсутствовать.
https://gist.github.com/maneeshaindrachapa/eefdf5333c6607eff93ae7e6be82e2a9
И нам нужно добавить новый метод для файла `TourPackageRepository.java
, потому что мы используем
```javascript
TourPackage tourPackage = tourPackageRepository.findByName(tourPackageName).orElseThrow(() ->
new RuntimeException("Пакет тура не существует: " + tourPackageName));
Итак, давайте добавим Optional<TourPackage> findByName(String, name);
в файл TourPackageRepository.java
.
https://gist.github.com/maneeshaindrachapa/f50f664fdd163d1d85694d866d40a68d
Давайте перезапустим сервер и перейдем к http://localhost:8081/h2-console/ URL, где находится консоль базы данных h2.
Затем добавьте имя пользователя, пароль, URL-адрес JDBC, который вы настроили в application.properties
, и войдите в консоль h2. Чтобы убедиться, что данные, загруженные в таблицы, можно выполнить с помощью простого запроса, такого как `SELECT * from TOUR;
Или мы можем перейти на http://localhost:8081/tours/ в браузере и просмотреть данные (поскольку мы добавляем @RepositoryRestResource в наши репозитории, мы можем запускать команды GET/POST/PUT/DELETE в наши хранилища).
если вы не хотите, чтобы данные отображались таким образом, вам нужно добавить @RepositoryRestResource(exported = false)
в свои репозитории.
5. Создание контроллеров
Создайте новое имя пакета controller и создайте там контроллеры, необходимые для проекта.
https://gist.github.com/maneeshaindrachapa/33b9175a896a064c92b9242ff32d7f9c
В приведенном выше коде использовались некоторые аннотации. Давайте посмотрим, какие они,
- @RestController — @RestController объединяет @Controller и @ResponseBody.
- @RequestBody — сопоставляет тело HTTP-запроса с объектом.
- @PathVariable — Эта аннотация указывает, что аргумент метода привязан к переменной шаблона URI.
- @RequestParam — эта аннотация используется для доступа к параметрам HTTP-запроса. @PostMapping — аннотированные методы @PostMapping в аннотированных классах @Controller обрабатывают HTTP-запросы POST, соответствующие заданному выражению URI.
- @GetMapping — аннотированные методы @GetMapping в аннотированных классах @Controller обрабатывают HTTP-запросы GET, соответствующие заданному выражению URI.
- @PutMapping — Аннотированные методы @PutMapping в аннотированных классах @Controller обрабатывают HTTP-запросы PUT, соответствующие заданному выражению URI.
- @DeleteMapping — Аннотированные методы @DeleteMapping в аннотированных классах @Controller обрабатывают HTTP-запросы DELETE, соответствующие заданному выражению URI.
- @PatchMapping — Аннотированные методы @PatchMapping в аннотированных классах @Controller обрабатывают HTTP-запросы PATCH, соответствующие заданному выражению URI.
- @ExceptionHandler — с помощью этой аннотации мы можем объявить собственный метод обработки ошибок. Spring вызывает этот метод, когда метод обработчика запросов выдает любое из указанных исключений.
- @ResponseStatus — с помощью этой аннотации мы можем указать желаемый HTTP-статус ответа, если мы аннотируем метод обработчика запроса этой аннотацией. Мы можем объявить код состояния с аргументом кода, или это псевдоним, аргумент значения
- @RequestMapping — этой аннотацией помечаются методы обработчиков запросов внутри классов @Controller; его можно настроить с помощью,
- путь или его псевдонимы, имя и значение: URL-адрес, на который сопоставляется метод
- метод: совместимые методы HTTP
- params: фильтрует запросы по наличию, отсутствию или значению параметров HTTP.
- заголовки: фильтрует запросы по наличию, отсутствию или значению заголовков HTTP
- потребляет: какие типы мультимедиа метод может использовать в теле запроса HTTP
- производит: какие типы мультимедиа метод может создавать в теле ответа HTTP
6. Тестирование API
Для тестирования API мы можем использовать Postman. Вы можете получить коллекцию почтальона из здесь.
Вы можете найти полный код здесь.
Так вот оно. Вот как вы разрабатываете микросервис с помощью Spring Boot. Это лишь небольшая часть экосистемы Spring. Давайте посмотрим, как защитить API и какие следующие шаги мы можем сделать с пружинами в другом сообщении в блоге.
- Впервые опубликовано [здесь] (https://maneeshaindrachapa.medium.com/create-first-microservice-using-spring-boot-1994cd78bbdf)*
Оригинал