Ćwiczenie — tworzenie zasobów platformy Azure i aplikacji platformy Spring w języku Java
W tej lekcji utworzysz podstawową aplikację platformy Spring Boot. Będziesz używać interfejsu wiersza polecenia platformy Azure oraz wybranego środowiska IDE do edytowania kodu. Kod zostanie uruchomiony za pomocą wybranego przez Ciebie terminalu.
Przygotowywanie środowiska roboczego
Skonfiguruj niektóre zmienne środowiskowe za pomocą następujących poleceń:
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>
W kodzie zastąp symbole zastępcze wartościami z poniższej tabeli. Te wartości są używane w tym module.
Zmienna | opis |
---|---|
<YOUR_DATABASE_NAME> | Nazwa serwera MySQL. Powinna być ona unikatowa w obrębie platformy Azure. |
<YOUR_AZURE_REGION> | Region platformy Azure do użycia. Możesz domyślnie użyć regionu eastus , ale zalecamy użycie regionu bliżej Twojego miejsca zamieszkania. Aby wyświetlić pełną listę dostępnych regionów, wprowadź polecenie az account list-locations |
<YOUR_MYSQL_PASSWORD> | Hasło serwera bazy danych MySQL. Hasło powinno zawierać co najmniej osiem znaków. Znaki powinny pochodzić z trzech z następujących kategorii: wielkie litery angielskie, małe litery angielskie, cyfry od 0 do 9 i znaki nienumeryczne (!, $, #, %itd.). |
<YOUR_LOCAL_IP_ADDRESS> | Adres IP komputera lokalnego, z którego będzie uruchamiania aplikacja platformy Spring Boot. Aby znaleźć adres IP, wskaż w przeglądarce adres whatismyip.akamai.com. |
Następnie utwórz grupę zasobów:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
| jq
Uwaga
W tym module używane jest narzędzie jq
instalowane domyślnie w usłudze Azure Cloud Shell, aby wyświetlić dane JSON i zwiększyć ich czytelność.
Jeśli nie chcesz korzystać z narzędzia jq
, możesz bezpiecznie usunąć część | jq
wszystkich poleceń w tym module.
Tworzenie wystąpienia usługi Azure Database for MySQL
Teraz utworzysz zarządzany serwer MySQL.
Uwaga
Aby dowiedzieć się więcej o usłudze Azure Database for MySQL, na końcu tego modułu skorzystaj z linku do odpowiedniej dokumentacji.
Uruchom następujący skrypt, aby utworzyć małe wystąpienie usługi Azure Database for MySQL. Baza danych ma 1 procesor CPU i 2 GB pamięci RAM.
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
Ten skrypt tworzy mały serwer MySQL, który używa wcześniej skonfigurowanych zmiennych.
Konfigurowanie reguły zapory dla serwera MySQL
Usługa Azure Database for MySQL jest zabezpieczana domyślnie. Jego zapora nie zezwala na żadne połączenia przychodzące. Musisz dodać regułę zapory zezwalającą na dostęp lokalnego adresu IP do serwera bazy danych.
Uruchom następujące polecenie, aby otworzyć zaporę serwera:
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
Uruchom następujące polecenie, aby zezwolić na dostęp zapory z zasobów platformy 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
Konfigurowanie bazy danych MySQL
Utworzony wcześniej serwer MySQL jest pusty. Nie ma on żadnej bazy danych, której można użyć z aplikacją platformy Spring Boot. Utwórz nową bazę danych o nazwie demo
:
az mysql db create \
--resource-group $AZ_RESOURCE_GROUP \
--name demo \
--server-name $AZ_DATABASE_NAME \
| jq
Generowanie aplikacji przy użyciu narzędzia Spring Initializr
Spring Initializr to aplikacja internetowa, która generuje potrzebną Ci strukturę projektu Spring Boot. Aplikacja Spring Initializr nie generuje kodu aplikacji, ale zapewnia Ci podstawową strukturę projektu oraz specyfikację kompilacji programu Maven.
Wygenerujesz szkielet aplikacji z trzema zależnościami: web
, mysql
i data-jpa
.
Nie musisz określać zależności platformy Azure, ponieważ uruchomisz aplikację lokalnie.
W wierszu polecenia wygeneruj aplikację:
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 -
Konfigurowanie platformy Spring Boot do korzystania z usługi Azure Database for MySQL
Otwórz plik src/main/resources/application.properties i dodaj kilka właściwości. Pamiętaj, aby zastąpić dwie zmienne $AZ_DATABASE_NAME
i zmienną $AZ_MYSQL_PASSWORD
wartościami skonfigurowanymi wcześniej.
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
Ostrzeżenie
Właściwość konfiguracji spring.jpa.hibernate.ddl-auto=create-drop
oznacza, że platforma Spring Boot automatycznie utworzy schemat bazy danych podczas uruchamiania aplikacji i spróbuje go usunąć po jej zamknięciu. Ta właściwość świetnie sprawdza się w przypadku testowania, ale nie powinna być używana w środowisku produkcyjnym.
Uwaga
Dołączasz element ?serverTimezone=UTC
do właściwości konfiguracji spring.datasource.url
. Ta konfiguracja instruuje sterownik JDBC (Java Database Connectivity) o konieczności użycia formatu daty UTC (Coordinated Universal Time) podczas nawiązywania połączenia z bazą danych. W przeciwnym razie Twój serwer Java nie będzie używać tego samego formatu daty co baza danych, co spowoduje wystąpienie błędu.
Teraz uruchom aplikację za pomocą udostępnionej otoki programu Maven:
./mvnw spring-boot:run
Ten zrzut ekranu przedstawia aplikację uruchomioną po raz pierwszy:
Kodowanie aplikacji
Następnie dodaj następujący kod w języku Java. Używa on rozwiązania JPA (Java Persistence API) do przechowywania i pobierania danych z serwera MySQL.
Użyjesz klasy jednostki JPA do mapowania obiektu Todo
języka Java bezpośrednio do tabeli Todo
programu MySQL.
Obok klasy DemoApplication
utwórz nową klasę jednostki Todo
. Następnie dodaj następujący kod:
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;
}
}
Ta klasa jest modelem domeny mapowanym na tabelę Todo
. Zostanie automatycznie utworzona przez rozwiązanie JPA.
Do zarządzania tą klasą potrzebujesz repozytorium. Zdefiniuj nowy interfejs TodoRepository
w tym samym pakiecie:
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TodoRepository extends JpaRepository<Todo, Long> {
}
To repozytorium jest repozytorium JPA zarządzanym przez rozwiązanie JPA dla danych platformy Spring. Rozszerzając repozytorium JpaRepository
, uzyskujesz wiele ogólnych metod tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla danego typu. Dzięki temu możesz wykonywać operacje, takie jak zapisywanie i usuwanie obiektów Todo
.
Dokończ aplikację, tworząc element RestController
, który może publikować interfejsy REST w celu przechowywania i pobierania danych przy użyciu protokołu HTTP. Zaimplementuj klasę TodoController
w tym samym pakiecie. Następnie dodaj następujący kod:
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();
}
}
Na koniec zatrzymaj aplikację, a następnie uruchom ją ponownie za pomocą następującego polecenia:
./mvnw spring-boot:run
Aplikacja platformy Spring Boot powinna zostać uruchomiona i połączona z bazą danych.
Ten zrzut ekranu przedstawia aplikację nawiązującą połączenie z bazą danych:
Testowanie aplikacji
Do przetestowania aplikacji możesz użyć narzędzia cURL
.
Najpierw utwórz nowy element typu „zadanie do wykonania” w bazie danych:
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
To polecenie powinno zwrócić utworzony element:
{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}
Następnie pobierz dane przy użyciu nowego żądania cURL
:
curl http://127.0.0.1:8080
To polecenie zwraca listę elementów do wykonania, w tym utworzony element:
[{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}]