Оркестрация приложений Python в .NET Aspire
Из этой статьи вы узнаете, как использовать приложения Python в узле приложения .NET Aspire. Пример приложения в этой статье демонстрирует запуск приложения Python. Расширение Python для .NET Aspire требует использования виртуальных сред.
Необходимые условия
Для работы с .NET.NET Aspireвам потребуется следующее, установленное локально:
- .NET 8.0 или .NET 9.0
- Контейнерная среда выполнения, соответствующая стандарту OCI, например:
- Docker рабочий стол или Podman. Дополнительную информацию см. в сведениях о среде выполнения контейнеров.
- Интегрированная среда разработки (IDE) или редактор кода, например:
- Visual Studio 2022 версии 17.9 или более поздней (необязательно)
-
Visual Studio Code (необязательно)
- C# Dev Kit: расширение (необязательно)
- JetBrains Rider с плагином .NET.NET Aspire (необязательно)
Дополнительные сведения см. в разделе .NET.NET Aspire программы установки и инструментови .NET.NET Aspire SDK.
Кроме того, необходимо установить Python на компьютере. Пример приложения в этой статье был создан с использованием Python версии 3.12.4 и pip версии 24.1.2. Чтобы проверить версии Python и pip, выполните следующие команды:
python --version
pip --version
Чтобы скачать Python (включая pip
), см. страницу загрузки Python.
Создание проекта .NET.NET Aspire с помощью шаблона
Чтобы приступить к запуску проекта Python в .NET Aspire сначала используйте начальный шаблон для создания узла приложения .NET Aspire:
dotnet new aspire -o PythonSample
В том же сеансе терминала измените каталоги в только что созданный проект:
cd PythonSample
После создания шаблона запустите хост приложения с помощью следующей команды, чтобы убедиться, что хост приложения и панель мониторинга .NET.NET Aspire успешно запускаются:
dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj
После запуска хоста приложения можно щелкнуть ссылку панели управления в выходных данных консоли. На этом этапе панель мониторинга не будет отображать какие-либо ресурсы. Остановите хост приложения, нажав клавиши CTRL + C в терминале.
Подготовьте приложение Python
Из предыдущего сеанса терминала, в котором вы создали решение .NET Aspire, создайте новый каталог, содержащий исходный код Python.
mkdir hello-python
Измените каталоги в только что созданный каталог hello-python:
cd hello-python
Инициализация виртуальной среды Python
Чтобы работать с Python приложениями, они должны находиться в виртуальной среде. Чтобы создать виртуальную среду, выполните следующую команду:
python -m venv .venv
Дополнительные сведения о виртуальных средах см. в статье Python. Установка пакетов в виртуальной среде с помощью pip и venv.
Чтобы активировать виртуальную среду, включив установку и использование пакетов, выполните следующую команду:
source .venv/bin/activate
Убедитесь, что pip в виртуальной среде up-to-date, выполнив следующую команду:
python -m pip install --upgrade pip
Установка пакетов Python
Установите пакет Flask, создав файл
Flask==3.0.3
Затем установите пакет Flask, выполнив следующую команду:
python -m pip install -r requirements.txt
После установки Flask создайте новый файл с именем
import os
import flask
app = flask.Flask(__name__)
@app.route('/', methods=['GET'])
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
port = int(os.environ.get('PORT', 8111))
app.run(host='0.0.0.0', port=port)
Приведенный выше код создает простое приложение Flask, которое прослушивает порт 8111 и возвращает сообщение "Hello, World!"
при доступе к корневой конечной точке.
Обновление проекта хоста приложения
Установите хостинг-пакет Python, выполнив следующую команду:
dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0
После установки пакета XML проекта должен иметь новую ссылку на пакет, аналогичную следующему:
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.0.0" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
<UserSecretsId>5fd92a87-fff8-4a09-9f6e-2c0d656e25ba</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
<PackageReference Include="Aspire.Hosting.Python" Version="9.0.0" />
</ItemGroup>
</Project>
Обновите файл узла приложения Program.cs, чтобы включить проект Python, вызвав API AddPythonApp
и указав имя проекта, путь проекта и файл точки входа:
using Microsoft.Extensions.Hosting;
var builder = DistributedApplication.CreateBuilder(args);
#pragma warning disable ASPIREHOSTINGPYTHON001
var pythonapp = builder.AddPythonApp("hello-python", "../hello-python", "main.py")
.WithHttpEndpoint(env: "PORT")
.WithExternalHttpEndpoints()
.WithOtlpExporter();
#pragma warning restore ASPIREHOSTINGPYTHON001
if (builder.ExecutionContext.IsRunMode && builder.Environment.IsDevelopment())
{
pythonapp.WithEnvironment("DEBUG", "True");
}
builder.Build().Run();
Важный
API AddPythonApp
является экспериментальным и может измениться в будущих выпусках. Дополнительные сведения см. в разделе ASPIREHOSTINGPYTHON001.
Запуск приложения
Теперь, когда вы добавили пакет хостинга Python, обновили файл Program.cs хоста приложения и создали проект Python, можно запустить хост приложения:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Запустите панель мониторинга, щелкнув ссылку в выходных данных консоли. Панель мониторинга должна отображать проект Python в качестве ресурса.
Щелкните ссылку Конечные точки, чтобы открыть конечную точку hello-python
на новой вкладке браузера. В браузере должно появиться сообщение "Hello, World!":
Остановите хост приложения, нажав клавиши CTRL + C в терминале.
Добавьте поддержку телеметрии.
Для небольшого повышения возможности наблюдения добавьте данные телеметрии, чтобы отслеживать зависимое приложение Python. В проекте Python добавьте следующий пакет OpenTelemetry в качестве зависимости в файле requirements.txt:
Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn
В предыдущем обновлении требований добавляется пакет OpenTelemetry и экспортер OTLP. Затем повторно установите требования к приложению Python в виртуальной среде, выполнив следующую команду:
python -m pip install -r requirements.txt
Предыдущая команда устанавливает пакет OpenTelemetry и экспортер OTLP в виртуальной среде. Обновите приложение Python, чтобы включить код OpenTelemetry, заменив существующий код main.py следующим образом:
import os
import logging
import flask
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor
app = flask.Flask(__name__)
trace.set_tracer_provider(TracerProvider())
otlpExporter = OTLPSpanExporter()
processor = BatchSpanProcessor(otlpExporter)
trace.get_tracer_provider().add_span_processor(processor)
FlaskInstrumentor().instrument_app(app)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route('/', methods=['GET'])
def hello_world():
logger.info("request received!")
return 'Hello, World!'
if __name__ == '__main__':
port = int(os.environ.get('PORT', 8111))
debug = bool(os.environ.get('DEBUG', False))
host = os.environ.get('HOST', '127.0.0.1')
app.run(port=port, debug=debug, host=host)
Обновите файл launchSettings.json проекта узла приложения, чтобы включить переменную среды ASPIRE_ALLOW_UNSECURED_TRANSPORT
:
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:17171;http://localhost:15209",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21171",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22122"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:15209",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19171",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20208",
"ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
}
}
}
}
Переменная ASPIRE_ALLOW_UNSECURED_TRANSPORT
является необходимой, потому что при локальном запуске клиент OpenTelemetry в Python отклоняет локальный сертификат разработки. Снова запустите хост приложения :
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
После запуска сервера приложения перейдите на панель мониторинга и обратите внимание, что, помимо выходных данных журнала консоли, структурированное ведение журнала также направляется через панель мониторинга.
Сводка
Хотя существует несколько соображений, которые выходят за рамки этой статьи, вы узнали, как создать .NET Aspire решение, которое интегрируется с Python. Вы также узнали, как использовать API AddPythonApp
для размещения приложений Python.
См. также
.NET Aspire