Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tavsiye
Bu içerik, .NET Docs veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi adlı e-Kitap'tan bir alıntıdır.
.NET Mikro Hizmetler Mimarisi Kapsayıcılı .NET Uygulamaları için eKitabın kapak küçük resmi
eShopOnContainers uygulamasının yaptığı gibi kapsayıcıda çalışan RabbitMQ tabanlı özel olay veri yolunu oluşturursanız, bunun yalnızca geliştirme ve test ortamlarınız için kullanılması gerektiğini söyleyerek başlamalıyız. Bunu, aşağıdaki Ek kaynaklar bölümünde açıklandığı gibi üretime hazır bir hizmet veri yolunun parçası olarak oluşturmadığınız sürece üretim ortamınız için kullanmayın. Basit bir özel olay veri yolu, ticari hizmet veri yolunun sahip olduğu üretime hazır birçok kritik özelliği eksik olabilir.
eShopOnContainers'daki olay veri yolu özel implementasyonlarından biri, RabbitMQ API'si üzerine kurulu bir kütüphanedir. (Azure Service Bus'ı temel alan başka bir uygulama vardır.)
RabbitMQ ile olay veri yolu uygulaması, Şekil 6-21'de gösterildiği gibi mikro hizmetlerin olaylara abone olmasını, olayları yayımlamasını ve olayları almasını sağlar.
Şekil 6-21. RabbitMQ ile olay veri yolu uygulaması
RabbitMQ, dağıtımı işlemek için ileti yayımcısı ile aboneler arasında bir aracı işlevi görür. Kodda EventBusRabbitMQ sınıfı genel IEventBus arabirimini uygular. Bu uygulama Bağımlılık Ekleme'yi temel alır, böylece bu geliştirme/test sürümünden üretim sürümüne geçiş yapabilirsiniz.
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Implementation using RabbitMQ API
//...
}
Örnek geliştirme/test etkinlik veri yolunun RabbitMQ uygulaması şablon koddur. RabbitMQ sunucusuyla bağlantıyı işlemeli ve kuyruklara bir ileti olayı yayımlamak için kod sağlamalı. Ayrıca her olay türü için tümleştirme olay işleyicileri koleksiyonlarından oluşan bir sözlük uygulaması gerekir; Şekil 6-21'de gösterildiği gibi, bu olay türlerinin her alıcı mikro hizmeti için farklı bir örnekleme ve farklı abonelikleri olabilir.
RabbitMQ ile basit bir yayımlama yöntemi uygulama
Aşağıdaki kod, RabbitMQ için bir olay veri yolu uygulamasının basitleştirilmiş bir sürümüdür ve senaryonun tamamını gösterir. Bağlantıyı gerçekten bu şekilde yapmıyorsun. Uygulamanın tamamını görmek için dotnet-architecture/eShopOnContainers deposundaki gerçek koda bakın.
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Member objects and other methods ...
// ...
public void Publish(IntegrationEvent @event)
{
var eventName = @event.GetType().Name;
var factory = new ConnectionFactory() { HostName = _connectionString };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: _brokerName,
type: "direct");
string message = JsonConvert.SerializeObject(@event);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: _brokerName,
routingKey: eventName,
basicProperties: null,
body: body);
}
}
}
eShopOnContainers uygulamasında Publish yönteminin gerçek kodu , RabbitMQ kapsayıcısının hazır olmaması durumunda görevi birkaç kez yeniden deneyen bir Polly yeniden deneme ilkesi kullanılarak geliştirilmiştir. Docker-compose kapsayıcıları başlatırken bu senaryo oluşabilir; örneğin, RabbitMQ kapsayıcısı diğer kapsayıcılardan daha yavaş başlayabilir.
Daha önce de belirtildiği gibi RabbitMQ'de birçok olası yapılandırma vardır, bu nedenle bu kod yalnızca geliştirme/test ortamları için kullanılmalıdır.
RabbitMQ API ile abonelik kodunu uygulama
Yayımlama kodunda olduğu gibi aşağıdaki kod da RabbitMQ için olay veri yolu uygulamasının bir parçasının basitleştirilmesidir. Yine, genellikle geliştirmediğiniz sürece değiştirmeniz gerekmez.
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Member objects and other methods ...
// ...
public void Subscribe<T, TH>()
where T : IntegrationEvent
where TH : IIntegrationEventHandler<T>
{
var eventName = _subsManager.GetEventKey<T>();
var containsKey = _subsManager.HasSubscriptionsForEvent(eventName);
if (!containsKey)
{
if (!_persistentConnection.IsConnected)
{
_persistentConnection.TryConnect();
}
using (var channel = _persistentConnection.CreateModel())
{
channel.QueueBind(queue: _queueName,
exchange: BROKER_NAME,
routingKey: eventName);
}
}
_subsManager.AddSubscription<T, TH>();
}
}
Her olay türünün RabbitMQ'den olay almak için ilgili bir kanalı vardır. Daha sonra kanal ve olay türü başına gerektiği kadar olay işleyiciniz olabilir.
Subscribe yöntemi, geçerli mikro hizmetteki geri çağırma yöntemine benzeyen bir IIntegrationEventHandler nesnesini ve ilgili IntegrationEvent nesnesini kabul eder. Kod daha sonra bu olay işleyicisini her tümleştirme olay türünün istemci mikro hizmeti başına sahip olabileceği olay işleyicileri listesine ekler. İstemci kodu olaya henüz abone olmadıysa, kod olay türü için bir kanal oluşturur, böylece olay başka bir hizmetten yayımlandığında RabbitMQ'den gönderme stilinde olayları alabilir.
Yukarıda belirtildiği gibi, eShopOnContainers'da uygulanan olay veri yolu sadece eğitim amaçlı tasarlanmıştır; çünkü yalnızca ana senaryoları işler, bu nedenle üretim için hazır değildir.
Üretim senaryoları için Aşağıdaki RabbitMQ'ye özgü ek kaynakları ve Mikro hizmetler arasında olay tabanlı iletişim uygulama bölümünü gözden geçirin.
Ek kaynaklar
RabbitMQ desteğine sahip üretime hazır bir çözüm.
Peregrine Connect - Uygulamaların, API'lerin ve iş akışlarının verimli tasarımı, dağıtımı ve yönetimiyle tümleştirmenizi basitleştirin
https://www.peregrineconnect.com/why-peregrine/rabbitmq-integrationNServiceBus - .NET için gelişmiş yönetim ve izleme araçlarıyla tam desteklenen ticari hizmet otobüsü
https://particular.net/EasyNetQ - RabbitMQ için Açık Kaynak .NET API istemcisi
https://easynetq.com/MassTransit - .NET için ücretsiz, açık kaynak dağıtılmış uygulama çerçevesi
https://masstransit-project.com/Rebus - Açık kaynak .NET Service Bus
https://github.com/rebus-org/Rebus