Your resource for web content, online publishing
and the distribution of digital products.
S M T W T F S
 
 
 
 
 
1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30
 

10 Days of .Net Aspire: Day 5 — Integrating Apache Kafka

DATE POSTED:September 3, 2024
Step-by-step guide on how to use the .Net Aspire Kafka component in Visual Studio.

.Net Aspire framework is used to develop cloud and production-ready distributed applications. It consists of components to handle cloud-native concerns such as Redis, Postgres etc.

Prerequisites

:::tip 10 Day .Net Aspire Challenge

:::

Objectives

Learn how to create a starter project using .Net Aspire with the Apache Kafka component.

Github Sample: The solution structure is divided into the following projects:

  • DotnetAspireChallenge.ApiService
  • DotnetAspireChallenge.AppHost
  • DotnetAspireChallenge.ServiceDefaults
  • DotnetAspireChallenge.Web
Getting Started Step 1: Install the following NuGet package

Install the following Nuget package into the subsequent project “DotnetAspireChallenge.AppHost

dotnet add package Aspire.Hosting.Kafka

\ In the above project, register Kafka UI as shown below

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.

var apiService = builder.AddProject("apiservice") .WithReference(messaging); builder.AddProject("webfrontend") .WithExternalHttpEndpoints() .WithReference(cache) .WithReference(apiService) .WithReference(messaging);

\

Step 2: Add dependency of Kafka Producer

Add the dependency in the Program.cs file of the project “**DotnetAspireChallenge.**ApiService”

builder.AddKafkaProducer("messaging");

\ and add a relevant minimal API endpoint using the following code.

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

\ The endpoint takes two parameters namely key and value as route values, and produces the message on the docker-hosted Kafka server.

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

\

Step 3: Add dependency of Kafka Consumer

Now move “DotnetAspireChallenge.Web” project wherein register as a Kafka producer

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

:::info Note: It's mandatory to provide a default group ID.

:::

\

Step 4: Create a Razor Page

Create a basic razor page named “KafkaConsumer.razor” to show the consumed message from the Kafka server.

@page "/kafka" @attribute [StreamRendering(true)] @attribute [OutputCache(Duration = 5)] @using Confluent.Kafka

KafkaConsumer

@inject KafkaConsumeMessageClient kafaConsumeMessageClient Kafka Consumed Message

Kafka

This component demonstrates showing data loaded from a backend API service.

@if (consumedMessage == null) {

Loading...

} else {
Topic Value
@consumedMessage.Topic @consumedMessage.Value
} @code { private ConsumeResult? consumedMessage; protected override async Task OnInitializedAsync() => consumedMessage = kafaConsumeMessageClient.GetKafkaMessage(); }

\

Step 5: Configure HttpCall to the ApiService public class KafkaConsumeMessageClient(HttpClient httpClient, IConsumer _consumer) { public ConsumeResult? GetKafkaMessage(CancellationToken cancellationToken = default) { ConsumeResult? deliveryResult = null; _consumer.Subscribe("messaging"); deliveryResult = _consumer.Consume(TimeSpan.FromSeconds(10)); return deliveryResult; } }

\

Kafka Produce Demo

#Kafka Produce Demo

\

Kafka UI Demo

#Kafka UI Demo

\

Kafka Consume Demo

#Kafka Consume Demo

\

:::info Github Project: GitHub - ssukhpinder/DotnetAspireChallenge: 10 Day .Net Aspire Challenge

Cheatsheet: Cheat Sheets — .Net

:::

\