Spring Data R2DBC gebruiken met Azure SQL Database
In dit artikel wordt gedemonstreerd hoe u een voorbeeldtoepassing maakt die gebruikmaakt van Spring Data R2DBC voor het opslaan en ophalen van informatie in Azure SQL Database met behulp van de R2DBC-implementatie voor Microsoft SQL Server vanuit de gitHub-opslagplaats r2dbc-mssql.
R2DBC brengt reactieve API's naar traditionele relationele databases. U kunt het gebruiken met Spring WebFlux om volledig reactieve Spring Boot-toepassingen te maken die gebruikmaken van niet-blokkerende API's. Het biedt een betere schaalbaarheid dan de klassieke benadering 'één thread per verbinding'.
Vereisten
Een Azure-abonnement (u kunt een gratis abonnement maken).
Java Development Kit (JDK), versie 8 of hoger.
cURL of een vergelijkbaar HTTP-hulpprogramma om de functionaliteit te testen.
Bekijk de voorbeeldtoepassing
In dit artikel codet u een voorbeeldtoepassing. Als u sneller wilt gaan, is deze toepassing al gecodeerd en beschikbaar op https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-sql-server.
De werkomgeving voorbereiden
Stel eerst een aantal omgevingsvariabelen in met behulp van de volgende opdrachten:
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_SQL_SERVER_ADMIN_USERNAME=spring
export AZ_SQL_SERVER_ADMIN_PASSWORD=<YOUR_AZURE_SQL_ADMIN_PASSWORD>
export AZ_SQL_SERVER_NON_ADMIN_USERNAME=nonspring
export AZ_SQL_SERVER_NON_ADMIN_PASSWORD=<YOUR_AZURE_SQL_NON_ADMIN_PASSWORD>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
Vervang de tijdelijke aanduidingen door de volgende waarden, die overal in dit artikel worden gebruikt:
<YOUR_DATABASE_NAME>
: De naam van uw Azure SQL Database-server, die uniek moet zijn in Azure.<YOUR_AZURE_REGION>
: de Azure-regio die u gaat gebruiken. U kunt standaardeastus
gebruiken, maar we raden u aan om een regio dichtbij uw locatie te configureren. U kunt de volledige lijst met beschikbare regio's bekijken met behulp vanaz account list-locations
.<AZ_SQL_SERVER_ADMIN_PASSWORD>
en<AZ_SQL_SERVER_NON_ADMIN_PASSWORD>
: het wachtwoord van uw Azure SQL Database-server, die minimaal acht tekens moet bevatten. De tekens moeten uit drie van de volgende categorieën bestaan: Nederlandse hoofdletters, Nederlandse kleine letters, cijfers (0-9) en niet-alfanumerieke tekens (!, $, #, %, enzovoort).<YOUR_LOCAL_IP_ADDRESS>
: Het IP-adres van uw lokale computer, van waaruit u uw Spring Boot-toepassing uitvoert. Een handige manier om het te vinden is door whatismyip.akamai.com te openen.
Notitie
Microsoft raadt aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in deze procedure wordt beschreven, zoals voor databases, caches, berichten of AI-services, vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. Gebruik deze stroom alleen wanneer veiligere opties, zoals beheerde identiteiten voor wachtwoordloze of sleutelloze verbindingen, niet haalbaar zijn. Voor bewerkingen van lokale machines geeft u de voorkeur aan gebruikersidentiteiten voor verbindingen zonder wachtwoord of sleutelloze verbindingen.
Maak vervolgens een resourcegroep met de volgende opdracht:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
Een Azure SQL Database-exemplaar maken
Maak vervolgens een beheerd Azure SQL Database-serverexemplaren door de volgende opdracht uit te voeren.
Notitie
Het MS SQL-wachtwoord moet voldoen aan specifieke criteria en de installatie mislukt met een niet-compatibel wachtwoord. Zie Wachtwoordbeleid voor meer informatie.
az sql server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--admin-user $AZ_SQL_SERVER_ADMIN_USERNAME \
--admin-password $AZ_SQL_SERVER_ADMIN_PASSWORD \
--output tsv
Een firewallregel configureren voor uw Azure SQL Database-server
Azure SQL Database-exemplaren worden standaard beveiligd. Ze hebben een firewall die geen enkele binnenkomende verbinding toestaat. Om uw database te kunnen gebruiken, moet u een firewallregel toevoegen waarmee het lokale IP-adres toegang krijgt tot de databaseserver.
Aangezien u aan het begin van dit artikel een lokaal IP-adres hebt geconfigureerd, kunt u de firewall van de server openen door de volgende opdracht uit te voeren:
az sql server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME-database-allow-local-ip \
--server $AZ_DATABASE_NAME \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
--output tsv
Als u verbinding maakt met uw Azure SQL Database-server vanaf Windows-subsysteem voor Linux (WSL) op een Windows-computer, moet u de WSL-host-id toevoegen aan uw firewall.
Haal het IP-adres van uw hostcomputer op door de volgende opdracht uit te voeren in WSL:
cat /etc/resolv.conf
Kopieer het IP-adres na de term nameserver
en gebruik vervolgens de volgende opdracht om een omgevingsvariabele in te stellen voor het WSL IP-adres:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Gebruik vervolgens de volgende opdracht om de firewall van de server te openen naar uw WSL-app:
az sql server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME-database-allow-local-ip-wsl \
--server $AZ_DATABASE_NAME \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--output tsv
Een Azure SQL-database configureren
De Azure SQL Database-server die u eerder hebt gemaakt, is leeg. Deze bevat geen databases die u kunt gebruiken met de Spring Boot-toepassing. Maak daarom een nieuwe database met de naam demo
door de volgende opdracht uit te voeren:
az sql db create \
--resource-group $AZ_RESOURCE_GROUP \
--name demo \
--server $AZ_DATABASE_NAME \
--output tsv
Een sql-database maken die geen beheerder is en machtigingen verlenen
Met deze stap maakt u een niet-beheerder en verleent u alle machtigingen voor de demo
database.
Maak een SQL-script met de naam create_user.sql voor het maken van een niet-beheerdersgebruiker. Voeg de volgende inhoud toe en sla deze lokaal op:
Notitie
Microsoft raadt aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in deze procedure wordt beschreven, zoals voor databases, caches, berichten of AI-services, vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. Gebruik deze stroom alleen wanneer veiligere opties, zoals beheerde identiteiten voor wachtwoordloze of sleutelloze verbindingen, niet haalbaar zijn. Voor bewerkingen van lokale machines geeft u de voorkeur aan gebruikersidentiteiten voor verbindingen zonder wachtwoord of sleutelloze verbindingen.
cat << EOF > create_user.sql
USE demo;
GO
CREATE USER $AZ_SQL_SERVER_NON_ADMIN_USERNAME WITH PASSWORD='$AZ_SQL_SERVER_NON_ADMIN_PASSWORD'
GO
GRANT CONTROL ON DATABASE::demo TO $AZ_SQL_SERVER_NON_ADMIN_USERNAME;
GO
EOF
Gebruik vervolgens de volgende opdracht om het SQL-script uit te voeren om de niet-beheerdersgebruiker te maken:
sqlcmd -S $AZ_DATABASE_NAME.database.windows.net,1433 -d demo -U $AZ_SQL_SERVER_ADMIN_USERNAME -P $AZ_SQL_SERVER_ADMIN_PASSWORD -i create_user.sql
Notitie
Zie CREATE USER (Transact-SQL) voor meer informatie over het maken van SQL-databasegebruikers.
Een reactieve Spring Boot-toepassing maken
Als u een reactieve Spring Boot-toepassing wilt maken, gebruiken we Spring Initializr. De toepassing die we gaan maken, maakt gebruik van:
- Spring Boot 2.7.11.
- De volgende afhankelijkheden: Spring Reactive Web (ook wel Bekend als Spring WebFlux) en Spring Data R2DBC.
De toepassing genereren met Spring Initializr
Genereer de toepassing op de opdrachtregel door de volgende opdracht uit te voeren:
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 -
De reactieve implementatie van het Azure SQL Database-stuurprogramma toevoegen
Open het pom.xml-bestand van het gegenereerde project om het reactieve Azure SQL Database-stuurprogramma toe te voegen vanuit de GitHub-opslagplaats r2dbc-mssql.
Voeg na de spring-boot-starter-webflux
afhankelijkheid de volgende tekst toe:
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-mssql</artifactId>
<scope>runtime</scope>
</dependency>
Spring Boot configureren voor het gebruik van Azure SQL Database
Open het bestand src/main/resources/application.properties en voeg de volgende tekst toe:
logging.level.org.springframework.data.r2dbc=DEBUG
spring.r2dbc.url=r2dbc:pool:mssql://$AZ_DATABASE_NAME.database.windows.net:1433/demo
spring.r2dbc.username=nonspring@$AZ_DATABASE_NAME
spring.r2dbc.password=$AZ_SQL_SERVER_NON_ADMIN_PASSWORD
Vervang de twee $AZ_DATABASE_NAME
variabelen en de $AZ_SQL_SERVER_NON_ADMIN_PASSWORD
variabele door de waarden die u aan het begin van dit artikel hebt geconfigureerd.
Notitie
Voor betere prestaties is de spring.r2dbc.url
eigenschap geconfigureerd voor het gebruik van een verbindingsgroep met behulp van r2dbc-pool.
U moet nu uw toepassing als volgt kunnen starten met behulp van de meegeleverde Maven-wrapper:
./mvnw spring-boot:run
Hier volgt een schermopname van de toepassing die voor de eerste keer wordt uitgevoerd:
Het databaseschema maken
Configureer in de hoofdklasse DemoApplication
een nieuwe Spring-bean die een databaseschema maakt met behulp van de volgende code:
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;
}
}
Deze Spring bean maakt gebruik van een bestand met de naam schema.sql, dus maak dat bestand in de map src/main/resources en voeg de volgende tekst toe:
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id INT IDENTITY PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);
Stop de actieve toepassing en start deze opnieuw met behulp van de volgende opdracht. De toepassing gebruikt nu de demo
-database die u eerder hebt gemaakt, en er wordt een tabel todo
in deze database gemaakt.
./mvnw spring-boot:run
Hier volgt een schermopname van de databasetabel terwijl deze wordt gemaakt:
De toepassing coderen
Voeg vervolgens de Java-code toe die R2DBC gebruikt om gegevens op te slaan en op te halen uit uw Azure SQL Database-server.
Maak een nieuwe Todo
Java-klasse naast de DemoApplication
klasse met behulp van de volgende code:
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;
}
}
Deze klasse is een domeinmodel dat is toegewezen aan de tabel todo
die u eerder hebt gemaakt.
Als u deze klasse wilt beheren, hebt u een opslagplaats nodig. Definieer een nieuwe TodoRepository
interface in hetzelfde pakket met behulp van de volgende code:
package com.example.demo;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
public interface TodoRepository extends ReactiveCrudRepository<Todo, Long> {
}
Deze opslagplaats is een reactieve opslagplaats die Spring Data R2DBC beheert.
Voltooi de toepassing door een controller te maken die gegevens kan opslaan en ophalen. Implementeer een TodoController
-klasse in hetzelfde pakket en voeg de volgende code toe:
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();
}
}
Stop tot slot de toepassing en start deze opnieuw met behulp van de volgende opdracht:
./mvnw spring-boot:run
De toepassing testen
Als u de toepassing wilt testen, kunt u cURL gebruiken.
Maak eerst een nieuw 'todo'-item in de database met behulp van de volgende opdracht:
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
Met deze opdracht wordt het gemaakte item geretourneerd, zoals hier wordt weergegeven:
{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}
Haal vervolgens de gegevens op met behulp van een nieuwe cURL-aanvraag met de volgende opdracht:
curl http://127.0.0.1:8080
Met deze opdracht wordt de lijst met todo-items geretourneerd, inclusief het item dat u hebt gemaakt, zoals hier wordt weergegeven:
[{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}]
Hier volgt een schermopname van deze cURL-aanvragen:
Gefeliciteerd U hebt een volledig reactieve Spring Boot-toepassing gemaakt die gebruikmaakt van R2DBC om gegevens op te slaan en op te halen uit Azure SQL Database.
Resources opschonen
Als u alle resources wilt opschonen die tijdens deze quickstart worden gebruikt, verwijdert u de resourcegroep met behulp van de volgende opdracht:
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes
Volgende stappen
Zie zelfstudie: Een Spring-toepassing implementeren in Azure Spring Apps met een wachtwoordloze verbinding met een Azure-database voor meer informatie over het implementeren van een Spring Data-toepassing in Azure Spring Apps en het gebruik van beheerde identiteiten.
Voor meer informatie over Spring en Azure gaat u door naar het documentatiecentrum van Spring op Azure.
Zie ook
Zie de referentiedocumentatie van Spring voor meer informatie over Spring Data R2DBC.
Voor meer informatie over Azure gebruiken met Java, raadpleegt u Azure voor Java-ontwikkelaars en Werken met Azure DevOps en Java.