От монолита к микросервисам: создайте свое первое приложение для микросервисов с помощью Spring Boot

От монолита к микросервисам: создайте свое первое приложение для микросервисов с помощью 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.


Детали примера проекта Spring Initializer


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



Как вы можете видеть на картинке выше, есть несколько файлов, и если мы проверим файл 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.


Консоль входа 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. Вы можете получить коллекцию почтальона из здесь.


ПОЛУЧИТЬ тур с помощью теста id в Postman


Вы можете найти полный код здесь.


Так вот оно. Вот как вы разрабатываете микросервис с помощью Spring Boot. Это лишь небольшая часть экосистемы Spring. Давайте посмотрим, как защитить API и какие следующие шаги мы можем сделать с пружинами в другом сообщении в блоге.


  • Впервые опубликовано [здесь] (https://maneeshaindrachapa.medium.com/create-first-microservice-using-spring-boot-1994cd78bbdf)*


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE