Gunakan Spring Data R2DBC dengan Azure Database for MySQL
Artikel ini menunjukkan pembuatan aplikasi contoh yang menggunakan Spring Data R2DBC untuk menyimpan dan mengambil informasi di Azure Database for MySQL menggunakan implementasi R2DBC untuk MySQL dari repositori GitHub r2dbc-mysql.
R2DBC membawa API reaktif ke database relasional tradisional. Anda dapat menggunakannya dengan Spring WebFlux untuk membuat aplikasi Spring Boot yang sepenuhnya reaktif, yang menggunakan API non-blocking. Ini akan memberikan skalabilitas yang lebih baik daripada pendekatan klasik "satu utas per koneksi".
Prasyarat
Langganan Azure - membuat secara gratis.
Java Development Kit (JDK), versi 8 atau yang lebih tinggi.
Lihat aplikasi sampel
Dalam artikel ini, Anda akan membuat kode aplikasi sampel. Jika Anda ingin lebih cepat, aplikasi ini sudah dikodekan dan tersedia di https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-mysql.
Menyiapkan lingkungan kerja
Pertama, siapkan beberapa variabel lingkungan dengan menjalankan perintah berikut:
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_MYSQL_ADMIN_USERNAME=spring
export AZ_MYSQL_ADMIN_PASSWORD=<YOUR_MYSQL_ADMIN_PASSWORD>
export AZ_MYSQL_NON_ADMIN_USERNAME=spring-non-admin
export AZ_MYSQL_NON_ADMIN_PASSWORD=<YOUR_MYSQL_NON_ADMIN_PASSWORD>
Ganti tempat penampung dengan nilai berikut, yang digunakan di seluruh artikel ini:
<YOUR_DATABASE_NAME>
: Nama server MySQL Anda, yang harus unik di seluruh Azure.<YOUR_AZURE_REGION>
: Wilayah Azure yang akan Anda gunakan. Anda dapat menggunakaneastus
secara default, tetapi kami menyarankan agar Anda mengonfigurasi wilayah yang lebih dekat ke tempat tinggal Anda. Anda dapat melihat daftar lengkap wilayah yang tersedia dengan menggunakanaz account list-locations
.<YOUR_MYSQL_ADMIN_PASSWORD>
dan<YOUR_MYSQL_NON_ADMIN_PASSWORD>
: Kata sandi server database MySQL Anda, yang seharusnya memiliki minimal delapan karakter. Kata sandi Anda harus berisi karakter dari tiga kategori berikut – huruf besar Inggris, huruf kecil Inggris, angka (0-9), dan karakter non-alfanumerik (!, $, #,%, dll.).
Selanjutnya, buat grup sumber daya:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
Membuat instans Azure Database for MySQL dan menyiapkan pengguna admin
Hal pertama yang akan Anda buat adalah server MySQL terkelola dengan pengguna admin.
Catatan
Anda bisa membaca informasi lebih rinci tentang membuat server MySQL di Membuat server Azure Database for MySQL dengan menggunakan portal Microsoft Azure.
az mysql flexible-server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--admin-user $AZ_MYSQL_ADMIN_USERNAME \
--admin-password $AZ_MYSQL_ADMIN_PASSWORD \
--yes \
--output tsv
Mengonfigurasikan database MySQL
Buat database baru bernama demo
dengan menjalankan perintah berikut ini:
az mysql flexible-server db create \
--resource-group $AZ_RESOURCE_GROUP \
--database-name demo \
--server-name $AZ_DATABASE_NAME \
--output tsv
Mengonfigurasikan aturan firewall untuk server MySQL Anda
Instans Azure Database for MySQL diamankan secara default. Mereka memiliki firewall yang tidak mengizinkan koneksi masuk.
Anda dapat melewati langkah ini jika Anda menggunakan Bash karena flexible-server create
perintah sudah mendeteksi alamat IP lokal Anda dan mengaturnya di server MySQL.
Jika Anda menyambungkan ke server MySQL dari Subsistem Windows untuk Linux (WSL) di komputer Windows, Anda perlu menambahkan ID host WSL ke firewall Anda. Dapatkan alamat IP komputer host Anda dengan menjalankan perintah berikut di WSL:
cat /etc/resolv.conf
Salin alamat IP dengan mengikuti istilah nameserver
, lalu gunakan perintah berikut untuk mengatur variabel lingkungan untuk Alamat IP WSL:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Kemudian, gunakan perintah berikut untuk membuka firewall server ke aplikasi berbasis WSL Anda:
az mysql flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--rule-name allowiprange \
--output tsv
Membuat pengguna non-admin MySQL dan memberikan izin
Langkah ini akan membuat pengguna non-admin dan memberikan semua izin pada database ke demo
dalamnya.
Catatan
Anda dapat membaca informasi selengkapnya tentang membuat pengguna MySQL di Membuat pengguna di Azure Database for MySQL.
Pertama, buat skrip SQL yang disebut create_user.sql untuk membuat pengguna non-admin. Tambahkan konten berikut dan simpan secara lokal:
cat << EOF > create_user.sql
CREATE USER '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%' IDENTIFIED BY '$AZ_MYSQL_NON_ADMIN_PASSWORD';
GRANT ALL PRIVILEGES ON demo.* TO '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%';
FLUSH PRIVILEGES;
EOF
Kemudian, gunakan perintah berikut untuk menjalankan skrip SQL untuk membuat pengguna non-admin:
mysql -h $AZ_DATABASE_NAME.mysql.database.azure.com --user $AZ_MYSQL_ADMIN_USERNAME --enable-cleartext-plugin --password=$AZ_MYSQL_ADMIN_PASSWORD < create_user.sql
Sekarang gunakan perintah berikut untuk menghapus file skrip SQL sementara:
rm create_user.sql
Buat aplikasi Spring Boot reaktif
Untuk membuat aplikasi Spring Boot reaktif, kita akan menggunakan Spring Initializr. Aplikasi yang akan kita buat akan menggunakan:
- Spring Boot 2.7.11.
- Dependensi berikut: Spring Reactive Web (juga dikenal sebagai Spring WebFlux) dan Spring Data R2DBC.
Hasilkan aplikasi dengan menggunakan Spring Initializr
Buat aplikasi pada baris perintah dengan memasukkan:
curl https://start.spring.io/starter.tgz -d dependencies=webflux,data-r2dbc -d baseDir=azure-database-workshop -d bootVersion=2.7.11 -d javaVersion=17 | tar -xzvf -
Tambahkan implementasi driver MySQL reaktif
Buka file pom.xml dari proyek yang dihasilkan untuk menambahkan driver MySQL reaktif dari repositori r2dbc-mysql di GitHub.
Setelah dependensi spring-boot-starter-webflux
, tambahkan cuplikan berikut:
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.9.1</version>
</dependency>
Mengonfigurasikan Spring Boot untuk menggunakan Azure Database untuk MySQL
Buka file src/main/resources/application.properties, dan tambahkan:
logging.level.org.springframework.data.r2dbc=DEBUG
spring.r2dbc.url=r2dbc:pool:mysql://$AZ_DATABASE_NAME.mysql.database.azure.com:3306/demo?tlsVersion=TLSv1.2
spring.r2dbc.username=spring-non-admin
spring.r2dbc.password=$AZ_MYSQL_NON_ADMIN_PASSWORD
$AZ_DATABASE_NAME
Ganti variabel dan $AZ_MYSQL_NON_ADMIN_PASSWORD
dengan nilai yang Anda konfigurasi di awal artikel ini.
Catatan
Untuk kinerja yang lebih baik, properti spring.r2dbc.url
dikonfigurasi untuk menggunakan kumpulan koneksi menggunakan r2dbc-pool.
Sekarang Anda dapat memulai aplikasi Anda dengan menggunakan wrapper Maven yang disediakan:
./mvnw spring-boot:run
Berikut adalah cuplikan layar aplikasi yang berjalan untuk pertama kalinya:
Buat skema database
Di dalam kelas DemoApplication
utama, konfigurasikan bean Spring baru yang akan membuat skema database, menggunakan kode berikut:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.r2dbc.connectionfactory.init.ConnectionFactoryInitializer;
import org.springframework.data.r2dbc.connectionfactory.init.ResourceDatabasePopulator;
import io.r2dbc.spi.ConnectionFactory;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {
ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
initializer.setConnectionFactory(connectionFactory);
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource("schema.sql"));
initializer.setDatabasePopulator(populator);
return initializer;
}
}
Bean Spring ini menggunakan file yang disebut schema.sql, maka buatlah file tersebut di folder src/main/resources, dan tambahkan teks berikut:
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Hentikan aplikasi yang sedang berjalan, dan mulai lagi. Aplikasi sekarang akan menggunakan database demo
yang Anda buat sebelumnya, dan membuat tabel todo
di dalamnya.
./mvnw spring-boot:run
Berikut adalah tangkapan layar tabel database saat sedang dibuat:
Kodekan aplikasi
Selanjutnya, tambahkan kode Java yang akan menggunakan R2DBC untuk menyimpan dan mengambil data dari server MySQL Anda.
Tambahkan kelas Java Todo
baru, di samping kelas DemoApplication
, menggunakan kode berikut:
package com.example.demo;
import org.springframework.data.annotation.Id;
public class Todo {
public Todo() {
}
public Todo(String description, String details, boolean done) {
this.description = description;
this.details = details;
this.done = done;
}
@Id
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;
}
}
Kelas ini adalah model domain yang dipetakan pada tabel todo
yang Anda buat sebelumnya.
Untuk mengelola kelas itu, Anda memerlukan repositori. Tentukan antarmuka TodoRepository
baru dalam paket yang sama, menggunakan kode berikut:
package com.example.demo;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
public interface TodoRepository extends ReactiveCrudRepository<Todo, Long> {
}
Repositori ini adalah repositori reaktif yang dikelola Spring Data R2DBC.
Selesaikan aplikasi dengan membuat pengontrol yang dapat menyimpan dan mengambil data. Terapkan kelas TodoController
dalam paket yang sama, dan tambahkan kode berikut:
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping("/")
@ResponseStatus(HttpStatus.CREATED)
public Mono<Todo> createTodo(@RequestBody Todo todo) {
return todoRepository.save(todo);
}
@GetMapping("/")
public Flux<Todo> getTodos() {
return todoRepository.findAll();
}
}
Terakhir, hentikan aplikasi lalu mulai kembali menggunakan perintah berikut:
./mvnw spring-boot:run
Uji aplikasi
Untuk menguji aplikasi, Anda dapat menggunakan cURL.
Pertama, buat item "todo" baru dalam database menggunakan perintah berikut:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done": "true"}' \
http://127.0.0.1:8080
Perintah ini harus menghasilkan item yang dibuat, seperti yang ditampilkan di sini:
{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}
Selanjutnya, ambil data menggunakan permintaan cURL baru dengan perintah berikut:
curl http://127.0.0.1:8080
Perintah ini akan menghasilkan daftar item "todo", termasuk item yang telah Anda buat, seperti yang ditampilkan berikut ini:
[{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}]
Berikut adalah tangkapan layar beberapa permintaan cURL:
Selamat! Anda telah menciptakan aplikasi Spring Boot yang sepenuhnya reaktif, yang menggunakan R2DBC untuk menyimpan dan mengambil data dari Azure Database for MySQL.
Membersihkan sumber daya
Untuk membersihkan semua sumber daya yang digunakan selama mulai cepat ini, hapus grup sumber daya dengan menggunakan perintah berikut:
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes
Langkah berikutnya
Untuk mempelajari selengkapnya tentang menyebarkan aplikasi Spring Data ke Azure Spring Apps dan menggunakan identitas terkelola, lihat Tutorial: Menyebarkan aplikasi Spring ke Azure Spring Apps dengan koneksi tanpa kata sandi ke database Azure.
Untuk mempelajari selengkapnya tentang Spring dan Azure, lanjutkan ke pusat dokumentasi Spring di Azure.
Baca juga
Untuk informasi selengkapnya tentang Spring Data R2BDC, lihat dokumentasi referensi Spring.
Untuk informasi selengkapnya tentang menggunakan Azure dengan Java, lihat Azure untuk pengembang Java dan Bekerja dengan Azure DevOps dan Java.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk