Упражнение. Создание ресурсов Azure и приложения Java Spring
В этом уроке вы создадите базовое приложение Spring Boot. Для редактирования кода вы будете использовать Azure CLI и интегрированную среду разработки (IDE) по своему усмотрению. Для выполнения кода можно использовать любой терминал.
Подготовка среды выполнения
Настройте несколько переменных среды с помощью следующих команд:
AZ_RESOURCE_GROUP=azure-spring-workshop
AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
AZ_LOCATION=<YOUR_AZURE_REGION>
AZ_MYSQL_USERNAME=spring
AZ_MYSQL_PASSWORD=<YOUR_MYSQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
Замените заполнители в своем коде значениями, приведенными в следующей таблице. Эти значения используются во всем модуле.
«Переменная» | Description |
---|---|
<YOUR_DATABASE_NAME> | Имя вашего сервера MySQL. Оно должно быть уникальным в Azure. |
<YOUR_AZURE_REGION> | Используемый регион Azure. Можно использовать регион eastus по умолчанию, но рекомендуется указать регион, ближайший к вашему месту жительства. Чтобы получить полный список доступных регионов, выполните команду az account list-locations . |
<YOUR_MYSQL_PASSWORD> | Пароль к вашему серверу базы данных MySQL. Пароль должен содержать не менее восьми символов Символы должны быть из трех из трех следующих категорий: английские прописные буквы, строчные буквы английского языка, цифры от 0 до 9, а также нефазные цифры (!, $, #, %, и т. д.). |
<YOUR_LOCAL_IP_ADDRESS> | IP-адрес локального компьютера, с которого вы будете запускать приложение Spring Boot. Чтобы узнать IP-адрес, введите в адресной строке браузера whatismyip.akamai.com. |
Затем создайте группу ресурсов:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
| jq
Примечание.
В этом модуле используется инструмент jq
, которое устанавливается по умолчанию в Azure Cloud Shell для отображения данных JSON и упрощения их чтения.
Если вы не хотите использовать jq
, можно безопасно удалить часть | jq
из всех команд в этом модуле.
Создание экземпляра Базы данных Azure для MySQL
Теперь настало время создать управляемый сервер MySQL.
Примечание.
Чтобы получить дополнительные сведения о службе "База данных Azure для MySQL", воспользуйтесь ссылкой на соответствующую документацию в конце этого модуля.
Выполните следующий скрипт, чтобы создать небольшой экземпляр Базы данных Azure для MySQL. Эта база данных имеет 1 ЦП и 2 ГБ ОЗУ.
az mysql server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--sku-name B_Gen5_1 \
--storage-size 5120 \
--admin-user $AZ_MYSQL_USERNAME \
--admin-password $AZ_MYSQL_PASSWORD \
| jq
Скрипт создает небольшой сервер MySQL, использующий переменные, которые вы настроили ранее.
Настройка правила брандмауэра для сервера MySQL
База данных Azure для MySQL защищена по умолчанию. Ее брандмауэр не разрешает входящие подключения. Поэтому необходимо добавить правило брандмауэра с разрешением на доступ к серверу базы данных для локального IP-адреса.
Выполните следующую команду, чтобы открыть брандмауэр сервера:
az mysql server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME-database-allow-local-ip \
--server-name $AZ_DATABASE_NAME \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
| jq
Выполните следующую команду, чтобы брандмауэр разрешал доступ из ресурсов Azure:
az mysql server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name allAzureIPs \
--server-name $AZ_DATABASE_NAME \
--start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0 \
| jq
Настройка базы данных MySQL
Созданный вами ранее сервер MySQL пуст. У него нет базы данных, которую вы могли бы использовать с приложением Spring Boot. Создайте новую базу данных с именем demo
:
az mysql db create \
--resource-group $AZ_RESOURCE_GROUP \
--name demo \
--server-name $AZ_DATABASE_NAME \
| jq
Создание приложения с помощью Spring Initializr
Spring Initializr — это веб-приложение, которое создает для вас структуру проекта Spring Boot. Spring Initializr не создает код приложения, но предоставляет базовую структуру проекта и спецификацию сборки Maven.
Далее вы создадите шаблон приложения с тремя зависимостями: web
, mysql
и data-jpa
.
Указывать зависимости Azure не нужно, так как вы будете выполнять свое приложение локально.
В командной строке создайте приложение с помощью следующей команды:
curl https://start.spring.io/starter.tgz -d type=maven-project -d dependencies=web,data-jpa,mysql -d baseDir=azure-spring-workshop -d bootVersion=3.1.5.RELEASE -d javaVersion=17 | tar -xzvf -
Настройка Spring Boot для использования Базы данных Azure для MySQL
Откройте файл src/main/resources/application.properties и добавьте в него несколько свойств. Не забудьте заменить две переменные $AZ_DATABASE_NAME
и переменную $AZ_MYSQL_PASSWORD
на значения, которые вы настроили ранее.
logging.level.org.hibernate.SQL=DEBUG
spring.datasource.url=jdbc:mysql://$AZ_DATABASE_NAME.mysql.database.azure.com:3306/demo?serverTimezone=UTC
spring.datasource.username=spring@$AZ_DATABASE_NAME
spring.datasource.password=$AZ_MYSQL_PASSWORD
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
Предупреждение
Свойство конфигурации spring.jpa.hibernate.ddl-auto=create-drop
означает, что Spring Boot будет автоматически создавать схему базы данных при запуске приложения и пытаться удалить эту схему базы данных при завершении работы приложения. Это свойство отлично подходит для тестирования, но не должно использоваться в рабочей среде!
Примечание.
Добавьте ?serverTimezone=UTC
в свойство конфигурации spring.datasource.url
. Эта настройка сообщает драйверу Java Database Connectivity (JDBC), что при подключении к базе данных должен использоваться формат даты и времени UTC. В противном случае форматы даты на сервере Java и в базе данных будут разные, что приведет к ошибке.
Теперь запустите приложение с помощью предоставленной программы-оболочки Maven:
./mvnw spring-boot:run
На этом снимке экрана показано приложение, запущенное впервые.
Добавление кода приложения
Теперь добавьте следующий код Java. В нем используется Java Persistence API (JPA) для сохранения данных на сервере MySQL и извлечения их оттуда.
Вы будете использовать класс сущности JPA для сопоставления объекта Todo
Java непосредственно с таблицей Todo
в MySQL.
Вместе с классом DemoApplication
создайте новый класс сущности Todo
. Затем добавьте приведенный ниже код.
package com.example.demo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Todo {
public Todo() {
}
public Todo(String description, String details, boolean done) {
this.description = description;
this.details = details;
this.done = done;
}
@Id
@GeneratedValue
private Long id;
private String description;
private String details;
private boolean done;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Todo)) {
return false;
}
return id != null && id.equals(((Todo) o).id);
}
@Override
public int hashCode() {
return 31;
}
}
Этот класс представляет собой модель предметной области, сопоставленную с таблицей Todo
. Он будет автоматически создан JPA.
Для управления этим классом необходим репозиторий. Определите новый интерфейс TodoRepository
в том же пакете:
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TodoRepository extends JpaRepository<Todo, Long> {
}
Этот репозиторий является репозиторием JPA, которым управляет JPA Spring Data. Расширяя JpaRepository
, вы получаете множество универсальных методов создания, чтения, обновления и удаления (CRUD) для вашего типа. Таким образом, вы сможете выполнять такие действия, как сохранение и удаление объектов Todo
.
Завершите работу с приложением, создав RestController
, который может публиковать интерфейсы REST для сохранения и получения данных с помощью HTTP. Реализуйте класс TodoController
в том же пакете. Затем добавьте приведенный ниже код.
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping("/")
@ResponseStatus(HttpStatus.CREATED)
public Todo createTodo(@RequestBody Todo todo) {
return todoRepository.save(todo);
}
@GetMapping("/")
public Iterable<Todo> getTodos() {
return todoRepository.findAll();
}
}
Наконец, остановите приложение и запустите его снова с помощью следующей команды:
./mvnw spring-boot:run
Приложение Spring Boot должно запуститься и подключиться к вашей базе данных.
На следующем снимке экрана показано приложение, подключающееся к базе данных.
Тестирование приложения
Для тестирования приложения можно использовать cURL
.
Сначала создайте новый элемент списка дел в базе данных:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done": "true"}' \
http://127.0.0.1:8080
Эта команда должна возвращать созданный элемент:
{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}
Затем извлеките данные, используя новый запрос cURL
:
curl http://127.0.0.1:8080
Эта команда возвращает список дел, включающий только что созданный элемент списка дел:
[{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}]