Поделиться через


Использование JDBC Spring Data с Базой данных Azure для MySQL

В этом руководстве показано, как хранить данные в базе данных База данных Azure для MySQL с помощью JDBC Spring Data.

JDBC — это стандартный API Java для подключения к стандартным реляционным базам данных.

В этом руководстве мы рассмотрим два метода проверки подлинности: проверку подлинности Microsoft Entra и проверку подлинности MySQL. На вкладке "Без пароля" показана проверка подлинности Microsoft Entra, а на вкладке "Пароль " отображается проверка подлинности MySQL.

Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для MySQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. С помощью проверки подлинности Microsoft Entra вы можете управлять удостоверениями пользователей базы данных и другими службами Microsoft в едином месте, что упрощает управление разрешениями.

Проверка подлинности MySQL использует учетные записи, хранящиеся в MySQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные будут храниться в user таблице. Так как эти пароли хранятся в MySQL, вам нужно самостоятельно управлять сменой паролей.

Предварительные условия

  • Клиент командной строки MySQL.

  • Если у вас нет приложения Spring Boot, создайте проект Maven с помощью Spring Initializr. Обязательно выберите Проект Maven и в разделе Зависимостей добавьте зависимости Spring Web, Spring Data JDBC и MySQL Driver , а затем выберите Java версии 8 или более поздней.

См. пример приложения

В этом руководстве вы закодируем пример приложения. Если вы хотите ускорить работу, готовое приложение доступно здесь: https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Настройка правила брандмауэра для сервера MySQL

Экземпляры Базы данных Azure для MySQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения.

Чтобы использовать базу данных, откройте брандмауэр сервера, чтобы разрешить локальный IP-адрес для доступа к серверу базы данных. Дополнительные сведения см. в статье "Управление правилами брандмауэра для Azure Database для MySQL — гибкий сервер с помощью портала Azure".

Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить IP-адрес узла WSL в брандмауэр.

Создание пользователя, отличного от администратора MySQL, и предоставление разрешений

На этом шаге будет создан пользователь, отличный от администратора, и предоставят ему все разрешения для demo базы данных.

Вы можете использовать следующий метод для создания пользователя без административных прав, который использует подключение без пароля.

  1. Используйте следующую команду, чтобы установить расширение Service Connector без пароля для Azure CLI:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Используйте следующую команду, чтобы создать пользователя Microsoft Entra, не являющегося администратором:

      az connection create mysql-flexible \
           --resource-group <your_resource_group_name> \
           --connection mysql_conn \
           --target-resource-group <your_resource_group_name> \
           --server mysqlflexibletest \
           --database demo \
           --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \
           --query authInfo.userName \
           --output tsv
    

    Когда команда завершится, запишите имя пользователя в выходных данных консоли.

Хранение данных из База данных Azure для MySQL

Теперь, когда у вас есть База данных Azure для MySQL гибкий экземпляр сервера, можно хранить данные с помощью Spring Cloud Azure.

Чтобы установить модуль Azure Starter JDBC MySQL Spring Cloud, добавьте следующие зависимости в файл pom.xml :

  • Выставление счетов за материалы Spring Cloud (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.21.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите для него версию spring-cloud-azure-dependencies на 4.19.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Примечание.

С версии 4.5.0 поддерживаются подключения без пароля.

Настройка Spring Boot для использования Базы данных Azure для MySQL

Чтобы сохранить данные из База данных Azure для MySQL с помощью Spring Data JDBC, выполните следующие действия, чтобы настроить приложение:

  1. Настройте учетные данные База данных Azure для MySQL, добавив следующие свойства в файл конфигурации application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Предупреждение

    Свойство spring.sql.init.mode=always конфигурации означает, что Spring Boot автоматически создает схему базы данных с помощью файла schema.sql , который будет создан далее, при каждом запуске сервера. Эта функция отлично подходит для тестирования, но помните, что данные будут удалены при каждом перезапуске, поэтому его не следует использовать в рабочей среде.

    Свойству конфигурации spring.datasource.url добавляется ?serverTimezone=UTC, чтобы сообщить драйверу JDBC использовать формат даты UTC (или Всемирное координированное время) при подключении к базе данных. Без этого параметра сервер Java не будет использовать тот же формат даты, что и база данных, что приведет к ошибке.

См. пример приложения

В этой статье вы закодируем пример приложения. Если вы хотите ускорить работу, готовое приложение доступно здесь: https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Настройка правила брандмауэра для сервера MySQL

Экземпляры Базы данных Azure для MySQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения.

Чтобы использовать базу данных, откройте брандмауэр сервера, чтобы разрешить локальный IP-адрес для доступа к серверу базы данных. Дополнительные сведения см. в статье "Создание правил брандмауэра База данных Azure для MySQL и управление ими с помощью портал Azure".

Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить IP-адрес узла WSL в брандмауэр.

Создание пользователя, отличного от администратора MySQL, и предоставление разрешений

На этом шаге будет создан пользователь, отличный от администратора, и предоставят ему все разрешения для demo базы данных.

Внимание

Чтобы использовать подключения без пароля, создайте пользователя администратора Microsoft Entra для вашего экземпляра базы данных Azure для MySQL. Дополнительные сведения см. в разделе "Настройка пользователя администратора Microsoft Entra Admin" в разделе "Использование идентификатора Microsoft Entra ID для проверки подлинности с помощью MySQL".

Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF

Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя Microsoft Entra, не администратора.

mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Совет

Чтобы использовать аутентификацию Microsoft Entra для подключения к базе данных Azure для MySQL, необходимо войти с помощью настроенного пользователя администратора Microsoft Entra, а затем получить маркер доступа в качестве пароля. Дополнительные сведения см. в разделе "Использование идентификатора Microsoft Entra для проверки подлинности с помощью MySQL".

Хранение данных из База данных Azure для MySQL

Теперь, когда у вас есть экземпляр сервера базы данных Azure для MySQL в режиме одного сервера, вы можете хранить данные с помощью Spring Cloud Azure.

Чтобы установить модуль Azure Starter JDBC MySQL Spring Cloud, добавьте следующие зависимости в файл pom.xml :

  • Набор спецификаций Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.21.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.19.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Примечание.

С версии 4.5.0 поддерживаются подключения без пароля.

Настройка Spring Boot для использования Базы данных Azure для MySQL

Чтобы сохранить данные из База данных Azure для MySQL с помощью Spring Data JDBC, выполните следующие действия, чтобы настроить приложение:

  1. Настройте учетные данные База данных Azure для MySQL, добавив следующие свойства в файл конфигурации application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Предупреждение

    Свойство spring.sql.init.mode=always конфигурации означает, что Spring Boot автоматически создает схему базы данных с помощью файла schema.sql , который будет создан далее, при каждом запуске сервера. Эта функция отлично подходит для тестирования, но помните, что данные будут удалены при каждом перезапуске, поэтому его не следует использовать в рабочей среде.

    Свойство spring.datasource.url конфигурации добавлено ?serverTimezone=UTC , чтобы сообщить драйверу JDBC использовать формат даты UTC (или универсальное время координированного времени) при подключении к базе данных. Без этого параметра сервер Java не будет использовать тот же формат даты, что и база данных, что приведет к ошибке.

  1. Создайте файл конфигурации src/main/resources/schema.sql для настройки схемы базы данных, а затем добавьте следующее содержимое.

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  1. Создайте новый Todo класс Java. Этот класс представляет собой модель домена, сопоставленную с таблицей todo , которая будет создана автоматически Spring Boot. Следующий код игнорирует getters методы и setters методы.

    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;
    
    }
    
  2. Измените файл класса запуска, чтобы отобразить следующее содержимое.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.repository.CrudRepository;
    
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends CrudRepository<Todo, Long> {
    
    }
    

    Совет

    В этом руководстве нет операций проверки подлинности в конфигурациях или коде. Однако для подключения к службам Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать удостоверение Azure. Spring Cloud Azure использует DefaultAzureCredential библиотеку Azure Identity, которая помогает получить учетные данные без каких-либо изменений кода.

    DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах (например, локальных и рабочих средах), не реализуя код, зависящий от среды. Дополнительные сведения см. в разделе DefaultAzureCredential.

    Для выполнения проверки подлинности в локальных средах разработки можно использовать Azure CLI, Visual Studio Code, PowerShell или другие методы. Дополнительные сведения см. в статье о проверке подлинности Azure в средах разработки Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение, назначаемое пользователем. Для получения дополнительной информации см. Что такое управляемые удостоверения для ресурсов Azure?.

  3. Запустите приложение. Приложение сохраняет данные в базе данных. Вы увидите журналы, аналогичные следующему примеру:

    2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)]    
    com.example.demo.Todo@4bdb04c8
    

Развертывание в Azure Spring Apps

Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Azure Spring Apps упрощает развертывание приложений Spring Boot в Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Azure Spring Apps обеспечивает управление жизненным циклом за счет комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, выполнения сине-зеленых развертываний и прочего. Сведения о развертывании приложения в Azure Spring Apps см. в статье "Развертывание первого приложения в Azure Spring Apps".

Следующие шаги