Aracılığıyla paylaş


Spring Data R2DBC'i MySQL için Azure Veritabanı ile kullanma

Bu makalede, r2dbc-mysql GitHub deposundan MySQL için R2DBC uygulamasını kullanarak bilgileri MySQL için Azure Veritabanı'de depolamak ve almak için Spring Data R2DBC kullanan bir örnek uygulama oluşturma gösterilmektedir.

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

Ö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-mysqlkullanı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_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>

Yer tutucuları, bu makale boyunca kullanılan aşağıdaki değerlerle değiştirin:

  • <YOUR_DATABASE_NAME>: MySQL sunucunuzun adıdır ve bu ad Azure genelinde benzersiz olmalıdır.
  • <YOUR_AZURE_REGION>: Kullanacağınız Azure bölgesi. Varsayılan olarak eastus kullanabilirsiniz ancak bölgeyi, yaşadığınız yere yakın bir yerde yapılandırmanızı öneririz. kullanarak az account list-locationskullanılabilir bölgelerin tam listesini görebilirsiniz.
  • <YOUR_MYSQL_ADMIN_PASSWORD> ve <YOUR_MYSQL_NON_ADMIN_PASSWORD>: MySQL veritabanı sunucunuzun parolası, 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.).

Not

Microsoft, kullanılabilir en güvenli kimlik doğrulama akışının kullanılmasını önerir. Veritabanları, önbellekler, mesajlaşma veya yapay zeka hizmetleri gibi bu yordamda açıklanan kimlik doğrulama akışı, uygulamaya çok yüksek düzeyde güven gerektirir ve diğer akışlarda mevcut olmayan riskler taşır. Bu akışı yalnızca parolasız veya anahtarsız bağlantılar için yönetilen kimlikler gibi daha güvenli seçenekler uygun olmadığında kullanın. Yerel makine işlemleri için parolasız veya anahtarsız bağlantılar için kullanıcı kimliklerini tercih edin.

Sonra, kaynak grubu oluşturun:

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
    --output tsv

MySQL 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 MySQL sunucusudur.

Not

MySQL sunucuları oluşturma hakkında daha ayrıntılı bilgileri Azure portalı kullanarak MySQL için Azure Veritabanı sunucusu oluşturma başlıklı makaleyi okuyarak edinebilirsiniz.

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

MySQL veritabanı yapılandırma

Aşağıdaki komutu kullanarak adlı demo yeni bir veritabanı oluşturun:

az mysql flexible-server db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --database-name demo \
    --server-name $AZ_DATABASE_NAME \
    --output tsv

MySQL sunucunuz için bir güvenlik duvarı kuralı yapılandırma

MySQL için Azure Veritabanı örnekleri varsayılan olarak güvenlidir. Gelen bağlantılara izin vermeyen bir güvenlik duvarı vardır.

Komut yerel IP adresinizi zaten algıladığı ve MySQL sunucusunda ayarladığı için flexible-server create Bash kullanıyorsanız bu adımı atlayabilirsiniz.

Windows bilgisayarda Linux için Windows Alt Sistemi 'den (WSL) MySQL sunucunuza 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 nameserversonra 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 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

Yönetici olmayan bir MySQL kullanıcısı oluşturma ve izin verme

Bu adım yönetici olmayan bir kullanıcı oluşturur ve veritabanındaki demo tüm izinleri ona verir.

Not

MySQL kullanıcıları oluşturma hakkında daha ayrıntılı bilgileri MySQL için Azure Veritabanı'de kullanıcı oluşturma bölümünden okuyabilirsiniz.

İlk olarak, yönetici olmayan 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:

Not

Microsoft, kullanılabilir en güvenli kimlik doğrulama akışının kullanılmasını önerir. Veritabanları, önbellekler, mesajlaşma veya yapay zeka hizmetleri gibi bu yordamda açıklanan kimlik doğrulama akışı, uygulamaya çok yüksek düzeyde güven gerektirir ve diğer akışlarda mevcut olmayan riskler taşır. Bu akışı yalnızca parolasız veya anahtarsız bağlantılar için yönetilen kimlikler gibi daha güvenli seçenekler uygun olmadığında kullanın. Yerel makine işlemleri için parolasız veya anahtarsız bağlantılar için kullanıcı kimliklerini tercih edin.

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

Ardından, yönetici olmayan kullanıcıyı oluşturmak üzere SQL betiğini çalıştırmak için aşağıdaki komutu kullanın:

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

Ş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

Şunu girerek uygulamayı komut satırında 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 MySQL sunucusu uygulamasını ekleme

GitHub'daki r2dbc-mysql deposundan reaktif MySQL sürücüsünü eklemek için oluşturulan projenin pom.xml dosyasını açın.

spring-boot-starter-webflux bağımlılığından sonra aşağıdaki kod parçacığını ekleyin:

<dependency>
  <groupId>io.asyncer</groupId>
  <artifactId>r2dbc-mysql</artifactId>
  <version>0.9.1</version>
</dependency>

Spring Boot’u MySQL için Azure Veritabanı’nı kullanacak şekilde yapılandırma

src/main/resources/application.properties dosyasını açın ve şunları ekleyin:

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 ve $AZ_MYSQL_NON_ADMIN_PASSWORD değişkenlerini bu makalenin başında yapılandırdığınız değerlerle değiştirin.

Not

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ı başlatabilmeniz gerekir:

./mvnw spring-boot:run

İlk kez çalışan bir uygulamanın ekran görüntüsü aşağıda verilmiştir:

Çalışan uygulamanın ekran görüntüsü.

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 fasulyesi 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 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:

Veritabanı tablosunun oluşturulmasının ekran görüntüsü.

Uygulamayı kodlama

Ardından, MySQL sunucunuzda verileri depolamak ve almak için R2DBC kullanacak Java kodunu ekleyin.

Aşağıdaki kodu kullanarak sınıfının yanında Todo yeni DemoApplication 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:

cURL testinin ekran görüntüsü.

Tebrikler! MySQL için Azure Veritabanı verileri depolamak ve almak için R2DBC kullanan tam olarak 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.