10 дней .Net Aspire: День 5 — Интеграция Apache Kafka

10 дней .Net Aspire: День 5 — Интеграция Apache Kafka

3 сентября 2024 г.

Пошаговое руководство по использованию компонента .Net Aspire Kafka в Visual Studio.

.Net Aspire Framework используется для разработки облачных и готовых к производству распределенных приложений. Он состоит из компонентов для обработки облачных задач, таких как Redis, Postgres и т. д.

Предпосылки

  • Установить.Net 8
  • УстановитьVisual Studio 2022версия 17 или выше
  • Рабочая нагрузка .Net Aspire
  • Среда выполнения контейнера, напримерРабочий стол Docker

10-дневный челлендж .Net Aspire

Цели

Узнайте, как создать начальный проект с использованием .Net Aspire с компонентом Apache Kafka.

Образец Github: Структура решения разделена на следующие проекты:

  • DotnetAspireChallenge.ApiService
  • DotnetAspireChallenge.AppHost
  • DotnetAspireChallenge.ServiceDefaults
  • DotnetAspireChallenge.Web

Начиная

Шаг 1: Установите следующий пакет NuGet

Установите следующий пакет Nuget в последующий проект «DotnetAspireChallenge.AppHost

dotnet add package Aspire.Hosting.Kafka

В проекте выше зарегистрируйте Kafka UI, как показано ниже.

    var messaging = builder.AddKafka("messaging")
```                           .WithKafkaUI();

Then finally add a reference to both the Producer and Consumer where the producer is “DotnetAspireChallenge.ApiService” and the consumer is “DotnetAspireChallenge.Web” project respectively.
```csharp
    var apiService = builder.AddProject<Projects.DotnetAspireChallenge_ApiService>("apiservice")
        .WithReference(messaging);
    
    
    
    builder.AddProject<Projects.DotnetAspireChallenge_Web>("webfrontend")
        .WithExternalHttpEndpoints()
        .WithReference(cache)
        .WithReference(apiService)
        .WithReference(messaging);

Шаг 2: Добавьте зависимость Kafka Producer

Добавьте зависимость в файл Program.cs проекта «**DotnetAspireChallenge.**ApiService»

    builder.AddKafkaProducer<string, string>("messaging");

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

    public static class AspireKafkaExtension
    {
        public static void MapAspireKafkaEndpoint(this WebApplication app)
        {
            app.MapGet("/send", async (IProducer<string, string> services, string key, string value) =>
            {
                try
                {
                    var message = new Message<string, string> { Key = key, Value = value };
                    DeliveryResult<string, string>? result = await services.ProduceAsync("messaging", message);
                    return result;
                }
                catch (Exception ex)
                {
    
                    throw;
                }
    
            });
        }
    }

Конечная точка принимает два параметра, а именно ключ и значение, в качестве значений маршрута и создает сообщение на сервере Kafka, размещенном в Docker.

https://localhost:7313/send?key=key&value=1

Шаг 3: Добавьте зависимость Kafka Consumer

Теперь двигайся «DotnetAspireChallenge.Web» проект, в котором зарегистрироваться как производитель Кафки

    builder.AddKafkaConsumer<string, string>("messaging", options =>
    {
        options.Config.GroupId = "my-consumer-group";
        options.Config.AutoOffsetReset = AutoOffsetReset.Earliest;
        options.Config.EnableAutoCommit = false;
    });

Примечание: Обязательно укажите идентификатор группы по умолчанию.

Шаг 4: Создайте страницу Razor

Создайте базовую страницу Razor с именем «KafkaConsumer.razor» для отображения полученного сообщения с сервера Kafka.

    @page "/kafka"
    @attribute [StreamRendering(true)]
    @attribute [OutputCache(Duration = 5)]
    @using Confluent.Kafka
    <h3>KafkaConsumer</h3>
    
    @inject KafkaConsumeMessageClient kafaConsumeMessageClient
    <PageTitle>Kafka Consumed Message</PageTitle>
    
    <h1>Kafka</h1>
    
    <p>This component demonstrates showing data loaded from a backend API service.</p>
    
    @if (consumedMessage == null)
    {
        <p><em>Loading...</em></p>
    }
    else
    {
        <table class="table">
            <thead>
                <tr>
                    <th>Topic</th>
                    <th>Value</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>@consumedMessage.Topic</td>
                    <td>@consumedMessage.Value</td>
                </tr>
    
            </tbody>
        </table>
    }
    @code {
        private ConsumeResult<string, string>? consumedMessage;
    
        protected override async Task OnInitializedAsync() => consumedMessage = kafaConsumeMessageClient.GetKafkaMessage();
    }

Шаг 5: Настройте HttpCall для ApiService

    public class KafkaConsumeMessageClient(HttpClient httpClient, IConsumer<string, string> _consumer)
    {
    
        public ConsumeResult<string, string>? GetKafkaMessage(CancellationToken cancellationToken = default)
        {
            ConsumeResult<string, string>? deliveryResult = null;
            _consumer.Subscribe("messaging");
            deliveryResult = _consumer.Consume(TimeSpan.FromSeconds(10));
    
            return deliveryResult;
        }
    }

Демоверсия Kafka Produce

#Kafka Produce Demo

Демонстрация пользовательского интерфейса Kafka

#Kafka UI Demo

Демоверсия Kafka Consume

#Kafka Consume Demo

Проект Github:GitHub — ssukhpinder/DotnetAspireChallenge: 10-дневный вызов .Net Aspire Challenge

Шпаргалка:Шпаргалки — .Net


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE