Buku ini memberikan panduan untuk membangun back-end yang memberikan fungsi sebagai RESTful service untuk melakukan proses logika atau layanan pengelolaan data pada database server. ASP.NET Core Web API adalah framework yang dapat mempermudah Full Stack Developer untuk membangun RESTful service yang dapat berjalan di atas platform baik Windows, Linux dan OS X.
Buku ini akan memberikan panduan penggunaan framework ASP.NET Core 6 Web API untuk pengembangan RESTful service tahap demi tahap dengan menggunakan tool development Visual Studio Community dan Visual Studio Code.
Buku ini juga membahas beberapa fitur seperti penggunaan Entity Framework Core dan Migration untuk bekerja dengan database, basic security, dan pengaksesan dari aplikasi Blazor Wasm.
Buku ini memberikan konsep pemrograman dasar yang meliputi struktur runtutan, percabangan, perulangan, dan sub program atau dekomposisi. Implementasi konsep-konsep tersebut diberikan dalam contoh program dengan bahasa pemrograman Java. Kode-kode program yang diberikan disertai dengan ilustrasi flowchart dan penjelasan untuk membantu pemahaman pembaca.
Untuk mendownload buku ini, anda dapat mengunduh pada link berikut ini
Artikel ini adalah kelanjutan dari artikel sebelumnya yang membahas tentang penggunaan Direct Exchange dengan RabbitMQ. Pada artikel ini akan dibahas cara penggunaan Topic Exchange, berbeda dengan jenis exchange sebelumnya Direct Exchange yang menggunakan “fix” routing key, pada Topic Exchange, consumer dapat menentukan routing key secara lebih fleksibel, sebagai contoh consumer dapat menggunakan routing pattern seperti (“*”), sebagai contoh katalog.*, maka consumer akan mengambil semua pesan yang mempunyai awalan routing key katalog tanpa memperhatikan karakter setelah awalan tersebut.
Menambahkan Publisher
Pada project RabbitMQProducer yang sudah dibuat pada artikel sebelumnya, tambahkan class dengan nama TopicExchangePublisher.cs, kemudian tambahkan kode berikut ini:
namespace RabbitMQProducer
{
public class TopicExchangePublisher
{
public static void Publish(IModel channel)
{
channel.ExchangeDeclare("contoh-topic-exchange",
ExchangeType.Topic);
var count = 0;
while (true)
{
var message = new { Name = "Producer", Message = $"Urutan pesan ke: {count}" };
var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
channel.BasicPublish("contoh-topic-exchange", "katalog.details", null, body);
count++;
Thread.Sleep(1000);
}
}
}
}
Pada kode diatas yang berbeda dengan kode pada artikel sebelumnya adalah tipe exchange yang digunakan yaitu Topic. Untuk menjalankan class tersebut tambahkan kode pada Program.cs.
using RabbitMQ.Client;
using RabbitMQProducer;
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
TopicExchangePublisher.Publish(channel);
Menambahkan Consumer
Pada project RabbitMQConsumer, tambahkan class TopicExchangeConsumer.cs.
namespace RabbitMQConsumer
{
public static class TopicExchangeConsumer
{
public static void Consume(IModel channel)
{
channel.ExchangeDeclare("contoh-topic-exchange", ExchangeType.Topic);
channel.QueueDeclare("contoh-topic-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.QueueBind("contoh-topic-queue", "contoh-topic-exchange", "katalog.*");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, e) =>
{
var body = e.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(message);
};
channel.BasicConsume("contoh-topic-queue", true, consumer);
Console.WriteLine("Aplikasi consumer dijalankan...");
Console.ReadLine();
}
}
}
Dari kode deiatas dapat dilihat bahwa routing key yang digunakan mengandung pattern (“*”), sehingga consumer akan menerima pesan dari Publisher yang mengirimkan pesan dengan alamat routing key berawalan “katalog”. Panggil class tersebut pada Program.cs.
using RabbitMQ.Client;
using RabbitMQConsumer;
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
TopicExchangeConsumer.Consume(channel);
Kemudian jalankan Consumer app dan Publisher app untuk melihat hasilnya.
Dapat dilihat bahwa contoh-topic-queue sudah terbinding pada contoh-topic-exchange dengan routing key “katalog.*”
Jika kedua aplikasi Publisher dan Consumer dijalankan dapat dilihat pesan yang dikirimkan oleh Publisher dapat diproses oleh Consumer.
Pada RabbitMQ kita membutuhkan objek exchange untuk bertukar pesan. Pada RabbitMQ pengiriman pesan melalui exchange dapat berasal dari satu producer (pengirim pesan) ke satu atau banyak consumer (penerima pesan). Exchange pada RabbitMQ bisa menggunakan atribut header, routing key, dan binding untuk mengirimkan pesan. Berikut adalah gambar cara kerja pengiriman pesan pada RabbitMQ.
Dapat dilihat pada gambar diatas, bahwa untuk mengirimkan pesan perlu untuk membuat objek Exchange terlebih dahulu, kemudian baru membinding exchange tersebut ke subscriber yang mau menerima pesannya. Pesan akan diantarkan melalui objek Queue (antrian) sehingga urutan pesan yang masuk adalah FIFO (first in first out), jadi pesan yang lebih awal akan diproses terlebih dahulu.
Pada artikel ini akan dibahas bagaimana cara pengiriman pesan menggunakan Direct Exchange. Direct Exchange menggunakan routing key pada header untuk mengidentifikasi pada queue yang mana pesan harus dikirimkan. Routing key adalah nilai header yang dibuat oleh producer (pengirim pesan), dan consumer akan menggunakan routing key untuk melakukain binding ke queue. Hanya pesan dengan routing key yang tepat saja akan diterima oleh subscriber. Contoh program dibawah ini akan menunjukan bagaimana cara kerja Direct Exchange.
Membuat Project Producer
Buat project .NET console baru dengan nama RabbitMQProducer. Untuk bekerja dengan RabbitMQ, hal pertama yang harus dilakukan adalah menambahkan library RabbitMQ client. Anda dapat menggunakan NuGet Package manager untuk menambahkan library tersebut. Jika sudah berhasil ditambahkan, anda dapat melihatnya pada file ,csproj.
Kemudian pada project tersebut tambahkan class dengan nama DirectExchangePublisher.cs.
namespace RabbitMQProducer
{
public class DirectExchangePublisher
{
public static void Publish(IModel channel)
{
channel.ExchangeDeclare("contoh-direct-exchange",
ExchangeType.Direct);
var count = 0;
while (true)
{
var message = new { Name = "Producer", Message = $"Urutan pesan ke-: {count}" };
var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
channel.BasicPublish("contoh-direct-exchange", "katalog.barang", null, body);
count++;
Thread.Sleep(1000);
}
}
}
}
Pada kode diatas dapat dilihat bahwa pertama hal yang harus dilakukan adalah membuat objek exchange (dengan nama contoh-direct-exchange), kemudian ketika pesan akan dikirimkan perlu ditambahkan routing key (katalog.barang) sebagai alamat untuk subscriber yang akan menerima pesan tersebut. Untuk menjalankan class tersebut, tambahkan kode berikut pada file Program.cs.
using RabbitMQ.Client;
using RabbitMQProducer;
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
DirectExchangePublisher.Publish(channel);
Pada program diatas, kita perlu menambahkan alamat dari RabbitMQ Server yang sudah kita pasang sebelumnya.
Membuat Project Consumer
Langkah selanjutnya adalah membuat project consumer yang akan menerima pesan yang dikirimkan oleh producer. Untuk itu buat project .NET console baru dengan nama RabbitMQConsumer, kemudian sama seperti langkah sebelumnya, tambahkan library RabbitMQ.Client pada project tersebut (dari NuGet package manager).
Pada project buat file dengan nama DirectExchangeConsumer.cs, kemudian tambahkan kode berikut:
namespace RabbitMQConsumer
{
public class DirectExchageConsumer
{
public static void Consume(IModel channel)
{
channel.ExchangeDeclare("contoh-direct-exchange", ExchangeType.Direct);
channel.QueueDeclare("contoh-direct-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.QueueBind("contoh-direct-queue", "contoh-direct-exchange", "katalog.barang");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, e) =>
{
var body = e.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(message);
};
channel.BasicConsume("contoh-direct-queue", true, consumer);
Console.WriteLine("aplikasi consumer dijalankan...");
Console.ReadLine();
}
}
}
Pada kode diatas dapat dilihat, pada consumer yang pertama harus dilakukan adalah membuat objek exchange, kemudian membuat objek queue, langkah selanjutnya adalah mengikatkan (membinding) exchange dengan queue dan routing key. Pesan akan diterima pada event consumer.Received. Untuk memanggil class DirectExchangeConsumer pada Program.cs tambahkan kode berikut:
using RabbitMQ.Client;
using RabbitMQConsumer;
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
DirectExchageConsumer.Consume(channel);
Test Menjalankan Aplikasi
Untuk menjalankan aplikasi, dan mensimulasikan pengiriman data antar pesan, jalankan aplikasi RabbitMQConsumer terlebih dahulu dengan perintah dotnet run, setelah dijalankan lihat pada RabbitMQ Management website, seharusnya dapat dilihat bahwa exchange “contoh-direct-exchange” dan queue “contoh-direct-queue” sudah berhasil untuk dibinding.
Kemudian jalankan aplikasi RabbitMQProducer, dan lihat bahwa pesan yang dikirimkan akan berhasil diambil dan ditampilkan oleh aplikasi RabbitMQConsumer secara terurut.
Pada output diatas dapat dilihat bahwa pesan yang dikirimkan dari aplikasi Producer dapat diambil oleh aplikasi Consumer.
Pada artikel selanjutnya akan dibahas bagaimana cara untuk mengirimkan pesan dengan menggunakan Topic Exchange.