.Net Core — это кроссплатформенная среда с открытым исходным кодом, которая позволяет нам создавать приложения для целого ряда операционных систем, от Windows до Mac и Linux.

Кроме того, это дает нам возможность использовать возможности контейнеризации. Контейнеризация помогает нам масштабировать услуги по мере увеличения трафика.

В этом посте мы увидим:
1. Как мы можем создавать масштабируемые API с помощью .Net Core
2. Как подключиться к базе данных SQL Server с помощью Entity Framework Core
3. Как мы можно создавать образы докеров меньшего размера
4. Как мы можем развернуть приложение как контейнер в Ubuntu.

Поскольку это демонстрационное приложение, мы собираемся максимально упростить требования. Например, предположим, что клиент хочет, чтобы приложение сформировало клиентскую базу, которая будет покупать продукты в его супермаркете. Для этого нам нужно создать:
1. Клиентский API для добавления, обновления и удаления клиентов
2. Продуктовый API для добавления, обновления и удаления продуктов в счете клиента.

Вы можете найти полный код вышеуказанного API здесь.

Чтобы создать API, перейдите в Visual Studio и создайте основной проект веб-API. После создания проекта давайте установим в него следующие зависимости проекта с помощью диспетчера пакетов nuget:

Install-Package Microsoft.EntityFrameworkCore -v 2.6.0
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

Следующий шаг: подключение к базе данных и модели

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

Для этого создайте класс и назовите его Customer.cs, Product.cs и ApplicationDbContext.cs. Класс ApplicationDbContext наследует класс DbContext, находящийся в библиотеке EntityFrameworkCore.
Ниже приведено содержимое каждого из вышеперечисленных классов:

Регистрация необходимых служб

Теперь, когда контекст нашей базы данных готов, следующим шагом будет настройка необходимых служб и конвейера запросов в Startup.cs.

Настройка контекста базы данных в ConfigureService() позволит нам внедрить его где угодно. Для этого добавим приведенный ниже код в метод ConfigureServices() в Startup.cs.

Создание сервисов и контроллеров

Следующим шагом будет добавление классов контроллера и сервисов.
Итак, добавим 2 интерфейса:
1. ICustomerService
2. IPProductService
Также добавим соответствующие классы для созданных интерфейсов
1. CustomerService
2. ProductService

Поскольку мы создали 2 службы, а именно CustomerService и ProductService, нам нужно зарегистрировать эти службы в методе ConfigureServices() в Startup, чтобы ввести их в контроллер. Давайте продолжим и изменим метод ConfigureServices(), добавив следующий код:

services.AddTransient<ICustomerService, CustomerService>();
services.AddTransient<IProductService, ProductService>();

Теперь пришло время реализовать контроллер. Создайте 2 контроллера API и назовите их CustomerController и ProductController. Внедрите требуемый сервис в конструктор в Controller, как показано ниже:

ПРИМЕЧАНИЕ. Убедитесь, что вы добавили строку подключения в файл appSettings.json, как показано ниже:

"ConnectionString": "Server=<instanceName>;Database=<dbName>;User Id=<userId>;Password=<password>"

ПРИМЕЧАНИЕ. Кроме того, убедитесь, что вы создаете и запускаете миграцию базы данных в ApplicationDbContext, чтобы создать базу данных и схему с помощью команд —

> Add-Migration InitialMigration -c ApplicationDbContext -o Data/Migrations
> Update-Database

Подготовьтесь к развертыванию

Следующим шагом является настройка проекта для развертывания в качестве контейнера докеров. Чтобы создать результирующий образ меньшего размера, мы собираемся использовать базовые образы alpine для среды sdk и aspnet.

Итак, давайте добавим в проект Dockerfile и добавим в него следующие строки кода для создания образа Docker.

Теперь, когда наш проект настроен, внесите код в свой репозиторий GitHub или bitbucket. Поскольку мы собираемся развернуть API на узле Linux, у нас должен быть готов узел Linux с docker и git.

На практике образы можно создавать, настроив конвейеры GitHub/bitbucket/AWS Codebuild и отправив полученный образ в репозиторий образов, например Dockerhub/Amazon ECR, который затем можно развернуть. с помощью Jenkins или Kubernetes.

В этом посте мы не будем углубляться в эту тему, поэтому мы собираемся развернуть его вручную.
У меня есть готовый компьютер с Ubuntu, поэтому давайте войдем в систему и клонируем репозиторий, используя:

git clone <repositoryCloneUrl>

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

sudo docker build -t sshop-image ./Examples-1-SShop/SShop

После создания образа вы увидите сообщение, как показано на изображении ниже:

Затем выполните приведенную ниже команду, чтобы запустить приложение в контейнере:

sudo docker run -d -p <machine-ip>:8080:80 -e ConnectionString="Server=<instanceName>;Database=<dbName>;User Id=<userId>;Password=<password>" --name sshop sshop-image

ПРИМЕЧАНИЕ. Не забудьте заменить ‹machine-ip›/‹instanceName›/‹dbName›/‹userId›/‹password› на IP-адрес вашего компьютера, экземпляр базы данных и учетные данные, если это необходимо.

Из приведенной выше команды видно, как мы можем передать строку подключения как переменную среды, которая переопределит значение ключа ConnectionString в appsettings.json. файл и используется нашим приложением.
API будет доступен на ‹machine-ip›:8080 после успешного развертывания.

Тестирование развертывания

Теперь, когда наш API развернут, пришло время для тестирования. Мы можем протестировать API с помощью Postman.

Поздравляем, вы создали API с использованием ядра .Net и развернули его как контейнер докеров.

Ссылка на репозиторий кода прикреплена в начале этого поста. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь обращаться ко мне по адресу [email protected].