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


интеграция .NET Aspire Pomelo MySQLEntity Framework Core

Включает:интеграции размещения и Client интеграции

MySQL — это система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL) для управления данными и управления ими. Он используется в различных средах, от небольших проектов до крупномасштабных корпоративных систем, и это популярный выбор для размещения данных, которые лежат в основе микрослужб в облачном приложении. Интеграция Pomelo позволяет подключаться к существующим базам данных или создавать новые экземпляры из , используя контейнерный образ.

Интеграция хостинга

MySQL хостинг интеграция моделирует server как тип MySqlServerResource, а база данных как тип MySqlDatabaseResource. Чтобы получить доступ к этим типам и API, добавьте 📦Aspire. Хостинг.MySql пакет NuGet в проекте узла приложения .

dotnet add package Aspire.Hosting.MySql

Дополнительные сведения см. в статье dotnet add package or Manage package dependencies in .NET applications.

Добавление ресурса MySQLserver и ресурса базы данных

В проекте узла вашего приложения вызовите AddMySql, чтобы добавить построитель ресурсов MySQL и вернуть его. Примените вызов к возвращаемому билдеру ресурсов на AddDatabase, чтобы добавить ресурс базы данных MySQL.

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithLifetime(ContainerLifetime.Persistent);

var mysqldb = mysql.AddDatabase("mysqldb");

var myService = builder.AddProject<Projects.ExampleProject>()
                       .WithReference(mysqldb)
                       .WaitFor(mysqldb);

// After adding all resources, run the app...

Заметка

Контейнер SQL Server медленно запускается, поэтому рекомендуется использовать постоянное время существования, чтобы избежать ненужных перезапусков. Для получения дополнительной информации см. срок существования ресурса контейнера.

Когда .NET.NET Aspire добавляет контейнерный образ в узел приложения, как показано в предыдущем примере с образом mysql, контейнерный образ создает новый экземпляр MySQL на локальном компьютере. Ссылка на ваш построитель ресурсов MySQL (переменная mysql) используется для добавления базы данных. База данных называется mysqldb, а затем добавляется в ExampleProject. Ресурс MySQL включает учетные данные по умолчанию с параметрами usernameroot и случайным password, сгенерированным с помощью метода CreateDefaultPasswordParameter.

При запуске узла приложения пароль хранится в хранилище секретов узла приложения. Он добавлен в раздел Parameters, например:

{
  "Parameters:mysql-password": "<THE_GENERATED_PASSWORD>"
}

Имя параметра — mysql-password, но на самом деле это просто форматирование имени ресурса с -password суффиксом. Дополнительные сведения см. в разделе Безопасное хранение секретов приложений в разработке в ASP.NET Core и Добавление ресурса MySQL с параметрами.

Метод WithReference настраивает подключение в ExampleProject с именем mysqldb.

Совет

Если вы хотите подключиться к существующей MySQLserver, вызовите AddConnectionString вместо этого. Для получения более подробной информации см. статью Справочник по существующим ресурсам.

Добавьте ресурс MySQL с томом данных

Чтобы добавить том данных в ресурс SQL Server, вызовите метод WithDataVolume в ресурсе SQL Server:

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithDataVolume();

var mysqldb = mysql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

Том данных используется для сохранения MySQLserver данных за пределами жизненного цикла контейнера. Том данных монтируется по пути /var/lib/mysql в контейнере SQL Server, и если параметр name не предоставлен, имя создается случайным образом. Дополнительная информация о томах данных и о причинах, по которым они предпочтительнее привязок, см. в документации Docker: Томы.

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

Пароль хранится в томе данных. При использовании тома данных и при изменении пароля он не будет работать, пока не удалите том.

Добавление ресурса MySQL с подключением привязки данных

Чтобы добавить подключение привязки данных к ресурсу MySQL, вызовите метод WithDataBindMount:

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithDataBindMount(source: @"C:\MySql\Data");

var db = sql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

Важный

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

Монтажи привязки данных зависят от файловой системы хост-компьютера для сохранения данных MySQL при перезапусках контейнера. Монтирование привязки данных смонтировано по пути C:\MySql\Data в Windows (или /MySql/Data на Unix) на хост-компьютере в контейнере MySQL. Дополнительные сведения о монтировании привязок данных см. в документации по Docker: монтирование привязок.

Добавление ресурса MySQL с параметрами

Если вы хотите явно указать корневой MySQL пароль, его можно передать в качестве параметра. Рассмотрим следующий альтернативный пример:

var password = builder.AddParameter("password", secret: true);

var mysql = builder.AddMySql("mysql", password)
                   .WithLifetime(ContainerLifetime.Persistent);

var mysqldb = mysql.AddDatabase("mysqldb");

var myService = builder.AddProject<Projects.ExampleProject>()
                       .WithReference(mysqldb)
                       .WaitFor(mysqldb);

Дополнительные сведения см. в разделе Внешние параметры.

Добавление ресурса PhpMyAdmin

phpMyAdmin — это популярное средство администрирования в виде веб-приложения для MySQL. Его можно использовать для просмотра и изменения объектов MySQL, таких как базы данных, таблицы, представления и индексы. Чтобы использовать phpMyAdmin в решении .NET.NET Aspire, вызовите метод WithPhpMyAdmin. Этот метод добавляет новый ресурс контейнера в решение, на котором размещен phpMyAdmin, и подключает его к контейнеру MySQL:

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithPhpMyAdmin();

var db = sql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

При запуске решения панель мониторинга .NET.NET Aspire отображает ресурсы phpMyAdmin с конечной точкой. Выберите ссылку на конечную точку, чтобы просмотреть phpMyAdmin на новой вкладке браузера.

Проверка работоспособности интеграции хостинга

Интеграция хостинга MySQL автоматически добавляет проверку работоспособности ресурса MySQL. Проверка работоспособности подтверждает, что MySQLserver запущена и что к ней можно установить соединение.

Интеграция размещения зависит от пакета NuGet 📦 AspNetCore.HealthChecks.MySql.

интеграция Client

Чтобы приступить к работе с интеграцией .NET Aspire Pomelo MySQL Entity Framework, установите пакет NuGet 📦Aspire. Pomelo.EntityFrameworkCoreMySql на проект, использующий client, то есть проект для приложения, использующего MySQLEntity Framework Coreclient.

dotnet add package Aspire.Pomelo.EntityFrameworkCore.MySql

Дополнительные сведения см. в статье dotnet add package or Manage package dependencies in .NET applications.

Добавить контекст базы данных MySQL

В файле Program.cs проекта client-потребляющем вызовите метод расширения AddMySqlDbContext для любого IHostApplicationBuilder, чтобы зарегистрировать DbContext для использования в контейнере внедрения зависимостей. Метод принимает параметр имени подключения.

builder.AddMySqlDbContext<ExampleDbContext>(connectionName: "mysqldb");

Совет

Параметр connectionName должен соответствовать имени, используемому при добавлении ресурса базы данных SQL Server в проект узла приложения. Другими словами, при вызове AddDatabase и указании имени mysqldb то же имя следует использовать при вызове AddMySqlDbContext. Дополнительные сведения см. в разделе Добавление ресурса MySQLserver и ресурса базы данных.

Чтобы получить объект ExampleDbContext из службы:

public class ExampleService(ExampleDbContext context)
{
    // Use context...
}

Дополнительные сведения о внедрении зависимостей см. в .NETвнедрение зависимостей.

Добавьте контекст базы данных MySQL с учетом обогащения

Чтобы дополнить DbContext дополнительными службами, такими как автоматические повторные попытки, проверки работоспособности, ведение журнала и телеметрия, вызовите метод EnrichMySqlDbContext:

builder.EnrichMySqlDbContext<ExampleDbContext>(
    connectionName: "mysqldb",
    configureSettings: settings =>
    {
        settings.DisableRetry = false;
        settings.CommandTimeout = 30 // seconds
    });

Параметр settings является экземпляром класса PomeloEntityFrameworkCoreMySqlSettings.

Конфигурация

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core предоставляет несколько вариантов настройки подключения к базе данных в соответствии с требованиями и стандартами вашего проекта.

Используйте строку подключения

При использовании строки подключения из раздела конфигурации ConnectionStrings можно указать имя строки подключения при вызове builder.AddMySqlDatabaseDbContext<TContext>():

builder.AddMySqlDatabaseDbContext<MyDbContext>("mysql");

Затем строка подключения будет извлечена из раздела конфигурации ConnectionStrings:

{
  "ConnectionStrings": {
    "mysql": "Server=mysql;Database=mysqldb"
  }
}

EnrichMySqlDbContext не будет использовать раздел конфигурации ConnectionStrings, так как ожидается, что DbContext будет зарегистрирован в момент его вызова.

Дополнительные сведения см. в документации MySqlConnector: ConnectionString.

Использование поставщиков конфигураций

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core поддерживает Microsoft.Extensions.Configuration. Он загружает PomeloEntityFrameworkCoreMySqlSettings из файлов конфигурации, таких как appsettings.json с помощью ключа Aspire:Pomelo:EntityFrameworkCore:MySql.

В следующем примере показан appsettings.json, который конфигурирует некоторые из доступных параметров:

{
  "Aspire": {
    "Pomelo": {
      "EntityFrameworkCore": {
        "MySql": {
          "ConnectionString": "YOUR_CONNECTIONSTRING",
          "DisableHealthChecks": true,
          "DisableTracing": true
        }
      }
    }
  }
}

Полная схема интеграции MySQLJSON доступна в Aspire. Pomelo.EntityFrameworkCore.MySql/ConfigurationSchema.json.

Использование встроенных делегатов

Также можно передать делегат Action<PomeloEntityFrameworkCoreMySqlSettings> для настройки некоторых или всех параметров непосредственно в коде, например, чтобы отключить проверки состояния из кода.

builder.AddMySqlDbContext<MyDbContext>(
    "mysqldb",
    static settings => settings.DisableHealthChecks = true);

или

builder.EnrichMySqlDbContext<MyDbContext>(
    static settings => settings.DisableHealthChecks = true);

Проверки состояния здоровья

По умолчанию .NET.NET Aspire интеграции разрешают проверки работоспособности для всех услуг. Дополнительные сведения см. в обзоре интеграции .NET.NET Aspire.

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core:

  • Добавляет проверку работоспособности, когда PomeloEntityFrameworkCoreMySqlSettings.DisableHealthChecks является false, которая вызывает метод CanConnectAsyncEF Core.
  • Интегрируется с HTTP-эндпоинтом /health, который указывает, что все зарегистрированные проверки работоспособности должны быть успешными, чтобы приложение считалось готовым принимать трафик.

Наблюдаемость и телеметрия

.NET .NET Aspire интеграции автоматически настраивают конфигурации журналов, трассировки и метрик, которые иногда называются основами наблюдаемости. Дополнительные сведения об наблюдаемости интеграции и телеметрии см. в .NET.NET Aspire обзоре интеграции. В зависимости от резервной службы некоторые интеграции могут поддерживать только некоторые из этих функций. Например, некоторые интеграции поддерживают ведение журнала и трассировку, но не метрики. Функции телеметрии также можно отключить с помощью методов, представленных в разделе конфигурации .

Лесозаготовка

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core использует следующие категории журналов:

  • Microsoft.EntityFrameworkCore.ChangeTracking
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Database.Connection
  • Microsoft.EntityFrameworkCore.Database.Transaction
  • Microsoft.EntityFrameworkCore.Infrastructure
  • Microsoft.EntityFrameworkCore.Migrations
  • Microsoft.EntityFrameworkCore.Model
  • Microsoft.EntityFrameworkCore.Model.Validation
  • Microsoft.EntityFrameworkCore.Query
  • Microsoft.EntityFrameworkCore.Update

Отслеживание

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core будет генерировать следующие активности трассировки, используя OpenTelemetry.

  • MySqlConnector

Метрика

Интеграция .NET Aspire Pomelo MySQLEntity Framework Core в настоящее время поддерживает следующие метрики:

  • MySqlConnector:
    • db.client.connections.create_time
    • db.client.connections.use_time
    • db.client.connections.wait_time
    • db.client.connections.idle.max
    • db.client.connections.idle.min
    • db.client.connections.max
    • db.client.connections.pending_requests
    • db.client.connections.timeouts
    • db.client.connections.usage

См. также