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


Оркестрация приложений Python в .NET Aspire

Из этой статьи вы узнаете, как использовать приложения Python в узле приложения .NET Aspire. Пример приложения в этой статье демонстрирует запуск приложения Python. Расширение Python для .NET Aspire требует использования виртуальных сред.

Необходимые условия

Для работы с .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, создав файл requirements.txt в каталоге hello-python и добавив следующую строку:

Flask==3.0.3

Затем установите пакет Flask, выполнив следующую команду:

python -m pip install -r requirements.txt

После установки Flask создайте новый файл с именем main.py в каталоге hello-python hello-python и добавьте следующий код:

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 в качестве ресурса.

панель мониторинга .NET Aspire: Python пример приложения.

Щелкните ссылку Конечные точки, чтобы открыть конечную точку hello-python на новой вкладке браузера. В браузере должно появиться сообщение "Hello, World!":

панель управления .NET Aspire: Python пример конечной точки приложения.

Остановите хост приложения, нажав клавиши 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.

Сводка

Хотя существует несколько соображений, которые выходят за рамки этой статьи, вы узнали, как создать .NET Aspire решение, которое интегрируется с Python. Вы также узнали, как использовать API AddPythonApp для размещения приложений Python.

См. также