Cvičení – vytvoření prostředků Azure a aplikace Java Spring
V této lekci vytvoříte základní aplikaci Spring Boot. K úpravám kódu použijete rozhraní Azure CLI a integrované vývojové prostředí (IDE) podle svého výběru. Ke spuštění kódu použijete terminál podle svého výběru.
Příprava pracovního prostředí
Pomocí následujících příkazů nastavte několik proměnných prostředí:
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>
Ve svém kódu nahraďte zástupné hodnoty hodnotami z následující tabulky. Tyto hodnoty se budou používat v celém tomto modulu.
Proměnná | Popis |
---|---|
<YOUR_DATABASE_NAME> | Název vašeho serveru MySQL. Měl by být jedinečný v rámci Azure. |
<YOUR_AZURE_REGION> | Oblast Azure, kterou budete používat. Standardně můžete použít eastus , ale doporučujeme použít oblast blíže k místu, kde se nacházíte. Úplný seznam dostupných oblastí zobrazíte zadáním az account list-locations . |
<YOUR_MYSQL_PASSWORD> | Heslo k vašemu databázovému serveru MySQL. Toto heslo by mělo mít minimálně osm znaků. Znaky by měly být ze tří z následujících kategorií: velká písmena anglické abecedy, malá písmena anglické abecedy, číslice 0 až 9 a neosamocené znaky (!, $, #, %atd.). |
<YOUR_LOCAL_IP_ADDRESS> | IP adresa místního počítače, ze kterého aplikaci Spring Boot spustíte. Tuto IP adresu najdete tak, že v prohlížeči přejdete na adresu whatismyip.akamai.com. |
Následně vytvořte skupinu prostředků:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
| jq
Poznámka:
V tomto modulu se používá nástroj jq
, který je standardně nainstalován v Azure Cloud Shellu a umožňuje zobrazit data JSON v čitelnějším formátu.
Pokud nechcete používat nástroj jq
, můžete bezpečně odebrat část | jq
ve všech příkazech v tomto modulu.
Vytvoření instance Azure Database for MySQL
Nyní vytvoříte spravovaný server MySQL.
Poznámka:
Pokud se chcete dozvědět víc o Azure Database for MySQL, použijte na konci tohoto modulu odkaz na příslušnou dokumentaci.
Spuštěním následujícího skriptu vytvořte malou instanci Azure Database for MySQL. Databáze má 1 procesor a 2 GB paměti 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
Tento skript vytvoří malý server MySQL, který používá proměnné, které jste nastavili dříve.
Konfigurace pravidla brány firewall pro server MySQL
Služba Azure Database for MySQL je standardně zabezpečená. Brána firewall nepovoluje žádná příchozí připojení. Přidejte proto pravidlo brány firewall, které místní IP adrese povolí přístup k databázovému serveru.
Spuštěním následujícího příkazu otevřete bránu firewall na serveru:
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
Spuštěním následujícího příkazu povolte přístup k bráně firewall z prostředků 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
Konfigurace databáze MySQL
Server MySQL, který jste vytvořili dříve, je prázdný. Neobsahuje žádnou databázi, kterou můžete s aplikací Spring Boot použít. Vytvořte novou databázi s názvem demo
:
az mysql db create \
--resource-group $AZ_RESOURCE_GROUP \
--name demo \
--server-name $AZ_DATABASE_NAME \
| jq
Vygenerování aplikace pomocí Spring Initializr
Spring Initializr je webová aplikace, která za vás vygeneruje strukturu projektu Spring Boot. Spring Initializr negeneruje žádný kód aplikace, poskytne vám ale základní strukturu projektu a specifikace sestavení Maven.
Vygenerujete základní strukturu aplikace se třemi závislostmi: web
, mysql
a data-jpa
.
Nemusíte zadávat závislosti Azure, protože aplikaci budete spouštět místně.
V příkazovém řádku vygenerujte aplikaci:
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 -
Konfigurace Spring Boot pro použití služby Azure Database for MySQL
Otevřete soubor src/main/resources/application.properties a přidejte nějaké vlastnosti. Nezapomeňte nahradit dvě proměnné $AZ_DATABASE_NAME
a $AZ_MYSQL_PASSWORD
hodnotami, které jste nastavili dříve.
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
Upozorňující
Konfigurační vlastnost spring.jpa.hibernate.ddl-auto=create-drop
znamená, že Spring Boot při spuštění aplikace automaticky vytvoří schéma databáze a při ukončení se pokusí toto schéma databáze odstranit. Tato vlastnost je skvělá pro testování, ale neměla by se používat v produkčním prostředí.
Poznámka:
?serverTimezone=UTC
připojujete ke konfigurační vlastnosti spring.datasource.url
. Toto nastavení informuje ovladač JDBC (Java Database Connectivity), aby při připojení k databázi používal formát data standardu UTC (Coordinated Universal Time). V opačném případě by váš server Java nepoužíval stejný formát data jako databáze, což by způsobilo chybu.
Teď aplikaci spusťte pomocí obálky, kterou dodal Maven:
./mvnw spring-boot:run
Na tomto screenshotu je první spuštění aplikace:
Vytvoření kódu aplikace
Pak přidejte následující kód v jazyce Java. K ukládání a načítání dat ze serveru MySQL používá tento kód rozhraní JPA (Java Persistence API).
Třídu entity rozhraní JPA použijete k namapování objektu Java Todo
přímo na tabulku MySQL Todo
.
Vedle třídy DemoApplication
vytvořte novou třídu entity Todo
. Pak přidejte následující kód:
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;
}
}
Tato třída je doménový model, který je namapován na tabulku Todo
. Automaticky se vytvoří pomocí rozhraní JPA.
Ke správě této třídy budete potřebovat úložiště. Ve stejném balíčku definujte nové rozhraní TodoRepository
:
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TodoRepository extends JpaRepository<Todo, Long> {
}
Jedná se o úložiště JPA, které spravuje Spring Data JPA. Rozšířením úložiště JpaRepository
získáte obecné metody create, read, update a delete (CRUD) pro váš typ. Takže můžete provádět akce, jako je ukládání a odstraňování objektů Todo
.
Aplikaci dokončíte tak, že vytvoříte RestController
, který může publikovat rozhraní REST pro ukládání a načítání dat pomocí protokolu HTTP. Implementujte třídu TodoController
ve stejném balíčku. Pak přidejte následující kód:
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();
}
}
Nakonec aplikaci zastavte a znovu ji spusťte pomocí následujícího příkazu:
./mvnw spring-boot:run
Aplikace Spring Boot by se měla spustit a připojit se k databázi.
Tady je screenshot aplikace, která se připojuje k databázi:
Testování aplikace
K otestování aplikace můžete použít cURL
.
Nejprve vytvořte novou položku úkolu v databázi:
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
Tento příkaz by měl vrátit vytvořenou položku:
{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}
Pak načtěte data pomocí nové žádosti cURL
:
curl http://127.0.0.1:8080
Tento příkaz vrátí seznam položek úkolů včetně položky, kterou jste vytvořili:
[{"id":1,"description":"configuration","details":"congratulations, you have set up your Spring Boot application correctly!","done":true}]