Spring Data R2DBC'i PostgreSQL için Azure Veritabanı ile kullanma
Bu makalede, bilgileri bir PostgreSQL için Azure Veritabanı veritabanında depolamak ve almak için Spring Data R2DBC kullanan örnek bir uygulama oluşturma gösterilmektedir. Örnek, GitHub'daki r2dbc-postgresql deposundan PostgreSQL için R2DBC uygulamasını kullanır.
R2DBC, geleneksel ilişkisel veritabanları için reaktif API’ler sunar. Bunu Spring WebFlux ile birlikte kullanarak engelleyici olmayan API'ler kullanan tam reaktif Spring Boot uygulamaları oluşturabilirsiniz. Klasik "bağlantı başına bir iş parçacığı" yaklaşımından daha iyi ölçeklenebilirlik sağlar.
Önkoşullar
Azure aboneliği - ücretsiz bir abonelik oluşturun.
Java Development Kit (JDK), sürüm 8 veya üzeri.
cURL veya işlevselliği test etmek için benzer bir HTTP yardımcı programı.
Örnek uygulamaya bakın
Bu makalede örnek bir uygulama kodlayacaksınız. Daha hızlı gitmek istiyorsanız, bu uygulama zaten kodlanmış ve adresinde https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-postgresqlkullanılabilir.
Çalışma ortamını hazırlama
İlk olarak, aşağıdaki komutları çalıştırarak bazı ortam değişkenlerini ayarlayın:
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_POSTGRESQL_ADMIN_USERNAME=spring
export AZ_POSTGRESQL_ADMIN_PASSWORD=<YOUR_POSTGRESQL_ADMIN_PASSWORD>
export AZ_POSTGRESQL_NON_ADMIN_USERNAME=nonspring
export AZ_POSTGRESQL_NON_ADMIN_PASSWORD=<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
Yer tutucuları, bu makale boyunca kullanılan aşağıdaki değerlerle değiştirin:
<YOUR_DATABASE_SERVER_NAME>
: Azure genelinde benzersiz olması gereken PostgreSQL sunucunuzun adı.<YOUR_DATABASE_NAME>
: Azure içinde benzersiz olması gereken PostgreSQL sunucusunun veritabanı adı.<YOUR_AZURE_REGION>
: Kullanacağınız Azure bölgesi. Varsayılan olarakeastus
kullanabilirsiniz ancak bölgeyi, yaşadığınız yere yakın bir yerde yapılandırmanızı öneririz. kullanarakaz account list-locations
kullanılabilir bölgelerin tam listesini görebilirsiniz.<YOUR_POSTGRESQL_ADMIN_PASSWORD>
ve<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>
: PostgreSQL veritabanı sunucunuzun parolasıdır ve en az sekiz karakter uzunluğunda olmalıdır. Karakterler şu üç kategoriden olmalıdır: İngilizce büyük harfler, İngilizce küçük harfler, sayılar (0-9) ve alfasayısal olmayan karakterler (!, $, #, %, vb.).<YOUR_LOCAL_IP_ADDRESS>
: Spring Boot uygulamanızı çalıştırabileceğiniz yerel bilgisayarınızın IP adresi. Bunu bulmanın kullanışlı yollarından biri whatismyip.akamai.com açmaktır.
Ardından, aşağıdaki komutu kullanarak bir kaynak grubu oluşturun:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
PostgreSQL için Azure Veritabanı örneği oluşturma ve yönetici kullanıcıyı ayarlama
Oluşturacağınız ilk şey, yönetici kullanıcılı yönetilen bir PostgreSQL sunucusudur.
Dekont
Azure portalını kullanarak PostgreSQL için Azure Veritabanı sunucusu oluşturma bölümünde PostgreSQL sunucuları oluşturma hakkında daha ayrıntılı bilgi edinebilirsiniz.
az postgres flexible-server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--location $AZ_LOCATION \
--admin-user $AZ_POSTGRESQL_ADMIN_USERNAME \
--admin-password $AZ_POSTGRESQL_ADMIN_PASSWORD \
--yes \
--output tsv
PostgreSQL veritabanı yapılandırma
Daha önce oluşturduğunuz PostgreSQL sunucusu boş. Yeni bir veritabanı oluşturmak için aşağıdaki komutu kullanın.
az postgres flexible-server db create \
--resource-group $AZ_RESOURCE_GROUP \
--database-name $AZ_DATABASE_NAME \
--server-name $AZ_DATABASE_SERVER_NAME \
--output tsv
PostgreSQL sunucunuz için güvenlik duvarı kuralı yapılandırma
PostgreSQL için Azure Veritabanı örnekleri varsayılan olarak güvenlidir. Gelen bağlantılara izin vermeyen bir güvenlik duvarı vardır. Veritabanınızı kullanabilmek için yerel IP adresinin veritabanı sunucusuna erişmesine izin veren bir güvenlik duvarı kuralı eklemeniz gerekir.
Bu makalenin başında yerel IP adresinizi yapılandırdığınızdan, aşağıdaki komutu çalıştırarak sunucunun güvenlik duvarını açabilirsiniz:
az postgres flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
--output tsv
PostgreSQL sunucunuza windows bilgisayardaki Linux için Windows Alt Sistemi (WSL) üzerinden bağlanıyorsanız WSL ana bilgisayar kimliğini güvenlik duvarınıza eklemeniz gerekir.
WSL'de aşağıdaki komutu çalıştırarak konak makinenizin IP adresini alın:
cat /etc/resolv.conf
teriminden nameserver
sonra IP adresini kopyalayın ve WSL IP Adresi için bir ortam değişkeni ayarlamak üzere aşağıdaki komutu kullanın:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Ardından aşağıdaki komutu kullanarak sunucunun güvenlik duvarını WSL tabanlı uygulamanızda açın:
az postgres flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--output tsv
PostgreSQL yönetici olmayan kullanıcı oluşturma ve izin verme
Ardından, yönetici olmayan bir kullanıcı oluşturun ve veritabanına tüm izinleri verin.
Dekont
PostgreSQL kullanıcıları oluşturma hakkında daha ayrıntılı bilgileri PostgreSQL için Azure Veritabanı'de kullanıcı oluşturma bölümünden okuyabilirsiniz.
Yönetici olmayan bir kullanıcı oluşturmak için create_user.sql adlı bir SQL betiği oluşturun. Aşağıdaki içeriği ekleyin ve yerel olarak kaydedin:
cat << EOF > create_user.sql
CREATE ROLE "$AZ_POSTGRESQL_NON_ADMIN_USERNAME" WITH LOGIN PASSWORD '$AZ_POSTGRESQL_NON_ADMIN_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO "$AZ_POSTGRESQL_NON_ADMIN_USERNAME";
EOF
Ardından aşağıdaki komutu kullanarak SQL betiğini çalıştırarak Microsoft Entra yönetici olmayan kullanıcıyı oluşturun:
psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require" < create_user.sql
Şimdi geçici SQL betik dosyasını kaldırmak için aşağıdaki komutu kullanın:
rm create_user.sql
Reaktif bir Spring Boot uygulaması oluşturma
Reaktif bir Spring Boot uygulaması oluşturmak için Spring Initializr kullanacağız. Oluşturacağımız uygulama aşağıdakileri kullanır:
- Spring Boot 2.7.11.
- Aşağıdaki bağımlılıklar: Spring Reactive Web (Spring WebFlux olarak da bilinir) ve Spring Data R2DBC.
Spring Initializr’ı kullanarak uygulama oluşturma
Aşağıdaki komutu kullanarak komut satırında uygulamayı oluşturun:
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 -
Reaktif PostgreSQL sürücü uygulamasını ekleme
Oluşturulan projenin pom.xml dosyasını açın ve ardından GitHub'daki r2dbc-postgresql deposundan reaktif PostgreSQL sürücüsünü ekleyin. Bağımlılık sonrasında spring-boot-starter-webflux
aşağıdaki metni ekleyin:
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-postgresql</artifactId>
<version>0.8.12.RELEASE</version>
<scope>runtime</scope>
</dependency>
Spring Boot'ı PostgreSQL için Azure Veritabanı kullanacak şekilde yapılandırma
src/main/resources/application.properties dosyasını açın ve aşağıdaki metni ekleyin:
logging.level.org.springframework.data.r2dbc=DEBUG
spring.r2dbc.url=r2dbc:pool:postgres://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME
spring.r2dbc.username=nonspring
spring.r2dbc.password=$AZ_POSTGRESQL_NON_ADMIN_PASSWORD
spring.r2dbc.properties.sslMode=REQUIRE
$AZ_DATABASE_SERVER_NAME
, $AZ_DATABASE_NAME
ve $AZ_POSTGRESQL_NON_ADMIN_PASSWORD
değişkenlerini bu makalenin başında yapılandırdığınız değerlerle değiştirin.
Uyarı
Güvenlik nedeniyle PostgreSQL için Azure Veritabanı SSL bağlantılarının kullanılması gerekir. Bu nedenle yapılandırma özelliğini eklemeniz spring.r2dbc.properties.sslMode=REQUIRE
gerekir, aksi takdirde R2DBC PostgreSQL sürücüsü güvenli olmayan bir bağlantı kullanarak bağlanmayı dener ve başarısız olur.
Dekont
Daha iyi performans için özelliği r2dbc-pool spring.r2dbc.url
kullanarak bir bağlantı havuzu kullanacak şekilde yapılandırılır.
Artık sağlanan Maven sarmalayıcısını kullanarak uygulamanızı şu şekilde başlatabilmeniz gerekir:
./mvnw spring-boot:run
İlk kez çalışan bir uygulamanın ekran görüntüsü aşağıda verilmiştir:
Veritabanı şemasını oluşturma
Ana DemoApplication
sınıfın içinde, aşağıdaki kodu kullanarak veritabanı şeması oluşturacak yeni bir Spring çekirdeği yapılandırın:
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;
}
}
Bu Spring çekirdeği schema.sql adlı bir dosya kullandığından src/main/resources klasöründe bu dosyayı oluşturun ve aşağıdaki metni ekleyin:
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Çalışan uygulamayı durdurun ve aşağıdaki komutu kullanarak yeniden başlatın. Uygulama artık önceden oluşturduğunuz demo
veritabanını kullanır ve bunun içinde bir todo
tablosu oluşturur.
./mvnw spring-boot:run
Veritabanı tablosunun oluşturulurken ekran görüntüsü aşağıdadır:
Uygulamayı kodlama
Ardından, PostgreSQL sunucunuzda verileri depolamak ve almak için R2DBC kullanacak Java kodunu ekleyin.
Aşağıdaki kodu kullanarak sınıfının yanında DemoApplication
yeni Todo
bir Java sınıfı oluşturun:
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;
}
}
Bu sınıf, önceden oluşturduğunuz todo
tablosunda eşlenmiş olan bir etki alanı modelidir.
Bu sınıfı yönetmek için bir depoya ihtiyacınız vardır. Aşağıdaki kodu kullanarak aynı pakette yeni TodoRepository
bir arabirim tanımlayın:
package com.example.demo;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
public interface TodoRepository extends ReactiveCrudRepository<Todo, Long> {
}
Bu depo, Spring Data R2DBC'nin yönettiği reaktif bir depodur.
Verileri depolayıp alabilen bir denetleyici oluşturarak uygulamayı tamamlayın. Aynı pakette bir TodoController
sınıfı uygulayın ve aşağıdaki kodu ekleyin:
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();
}
}
Son olarak, uygulamayı durdurun ve aşağıdaki komutu kullanarak yeniden başlatın:
./mvnw spring-boot:run
Uygulamayı test etme
Uygulamayı test etmek için cURL’yi kullanabilirsiniz.
İlk olarak, aşağıdaki komutu kullanarak veritabanında yeni bir “yapılacak” öğesi oluşturun:
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
Bu komut, burada gösterildiği gibi oluşturulan öğeyi döndürmelidir:
{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}
Ardından, aşağıdaki komutla yeni bir cURL isteği kullanarak verileri alın:
curl http://127.0.0.1:8080
Bu komut, burada gösterildiği gibi oluşturduğunuz öğe de dahil olmak üzere "yapılacaklar" öğelerinin listesini döndürür:
[{"id":1,"description":"configuration","details":"congratulations, you have set up R2DBC correctly!","done":true}]
Bu cURL isteklerinin ekran görüntüsü aşağıdadır:
Tebrikler! PostgreSQL için Azure Veritabanı verileri depolamak ve almak için R2DBC kullanan tamamen reaktif bir Spring Boot uygulaması oluşturdunuz.
Kaynakları temizleme
Bu hızlı başlangıç sırasında kullanılan tüm kaynakları temizlemek için aşağıdaki komutu kullanarak kaynak grubunu silin:
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes
Sonraki adımlar
Spring Data uygulamasını Azure Spring Apps'e dağıtma ve yönetilen kimlik kullanma hakkında daha fazla bilgi edinmek için bkz . Öğretici: Azure veritabanına parolasız bağlantıyla Azure Spring Apps'e Spring uygulaması dağıtma.
Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.
Ayrıca bkz.
Spring Data R2DBC hakkında daha fazla bilgi için Spring'in başvuru belgelerine bakın.
Azure’ı Java ile kullanma hakkında daha fazla bilgi için Java geliştiricileri için Azure ve Azure DevOps ve Java ile çalışma başlıklı makalelere bakın.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin