Windows Azure Service Bus / Relay

Service bus, Windows Azure platformu içerisinde yer alan uygulamalar arası haberleşme veya mesajlaşma için oluşturulmuş bir araçtır. Uygulamalarınızı kurum içi genel veya özel bulut altyapısı dahilinde tutmanızı sağlayarak uygulamalarınız arasında haberleşmenizi sağlamaktaki en büyük yardımcılarınızdan birisidir.

indir

Service Bus, ölçeklenebilirlik ve esneklik olarak tanımlanan Windows Azure güvencelerinin yer aldığı mesajlaşma altyapısını kullanıcılarının hizmetine sunmaktadır.

  • Mesajlarınızın iletişimini bulut altyapısı dahilinde yönetebilirsiniz,
  • Kurum içi uygulamalarınız da bulut altyapısı ile service bus özelliklerinden faydalanabilirsiniz,
  • Mobil cihazlar için geliştirilmiş uygulamaları ölçeklendirebilir ve bulut hizmeti ile iletişim kolaylığından faydalanabilirsiniz.

Service bus yapısının sunduğu olanakları 3 başlık altında toplarsak;

  • QUEUES : First-in-First-out mantığı ile çalışan ve mesajlarınızın service bus garantisi ile iletimini sağlayabileceğiniz bir ortamdır.
  • TOPICS : Mesajlarınızı sadece özel yetki verdiğiniz veya üye olarak barındırdığınız kullanıcılara teslim ederek iletişim kurmanızı sağlayan ortamdır.
  • RELAY   : Uygulamarınızda Web servis aracılığı ile yapacağınız işlemler için kurum içi iletişim alt yapısı için mesajlaşma ortamı sağlar.

Bu yazıda Service Bus Kavramının alt başlıklarından birisi olan RELAY yapısına yönelik bir demo ile devam ediyor olacağım.

İlk olarak Windows Azure Management Portal ile bağlantımızı sağlayarak Service Bus sekmesinden yeni bir service bus hizmeti oluşturmamız gerekmektedir.

service bus add

Azure portalında Service Bus hizmeti aktif olduktan sonra projemizin kodlama kısmına geçebiliriz. Visual Studio üzerinden yeni bir Console Application oluşturarak development işlemine başlayabiliriz.

Console Application

Proje oluşturulduktan sonra yapmamız gereken önemli bir püf nokta bulunmakta. Projenin framework yapısını .Net 4 olarak belirlememiz gerekmektedir. Project sekmesine tıkladığımızda en altta bulunan projenin properties kısmına ulaşabiliriz.

Untitled

Capture

Bu işlemi gerçekleştirdikten sonra, yukarıda belirtmiş olduğum Service Bus Relay yapısında Web Servisler aracılığı ile bağlantı sağlamamız gerekmektedir. Bunun için projeye 2 adet  Class ekliyoruz.  IServiceBusService ve ServiceBusService adında servis classlarımızı ekleyerek devam ediyoruz.

Capture

Daha önce WCF (Windows Communication Services) ile uygulama geliştirenler açısından farklı bir durum yok. Oluşturduğumuz class’lar içerisine standart WCF kodları ile geliştirme yapacağız.

Ancak öncelikle Service Bus hizmetinden yararlanmamız için gerekli referansların projeye tanımlanması gerekmektedir. Solution explorer kısmındaki references kısmına sağ tık ile Manage Nu Get Packages kısmına tıklayarak arama sekmesine windowsazure.servicebus yazarak gerekli olan package yüklemesini yapmamız gerekmekte.

Capture

Daha sonrasında service altyapısını oluşturmak için IServicebusService Class’ı içerisine oluşturacağımız interface için gerekli kodları yazıyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ServiceBusTutorial.Services
{
    [ServiceContract(Namespace = "ServiceBusTutorial")]
    interface IServiceBusService
    {
        [OperationContract]
        string Version(string ClientID);
    }

    interface IServiceBusChannel : IServiceBusService, IClientChannel { }
}

IServicebusService kısmında görüldüğü üzere clientID üzerinden hareket ediyor olacağız. Service bus relay yapısında daha önce bahsettiğim gibi bir üye veya yetki üzerine haberleşme sağlanmaktadır. bundan dolayı ClientID eşleşmesi ile gerekli haberleşmeyi karşı tarafa yolluyor olacağız.

Şimdi servisimizin sunacağı kısım için gerekli fonksiyonun bulunduğu ServicebusService Class’ı içerisine bir metod oluşturuyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ServiceBusTutorial.Services
{
    class ServiceBusService : IServiceBusService
    {
        public string Version(string ClientID)
        {
            string result = "Version 1.0.0 ClientID = " + ClientID;
            return result;
        }
    }
}

Servis altyapısını sağladıktan sonra programın iletişimi için gerekli olan Relay hizmetinde management portal üzerinde bize sunulan service bus ile bağlantı kodlarını kullanacağız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus;
using ServiceBusTutorial.Services;
using System.Threading;

namespace ServiceBusTutorial
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost sh = new ServiceHost(typeof(ServiceBusService));

            Console.WriteLine("Servis Bağlantısı Sağlanıyor ...");

            sh.AddServiceEndpoint(typeof(IServiceBusService), new NetTcpRelayBinding(), ServiceBusEnvironment.CreateServiceUri("sb", "servicebusFeed1", "service"))
                .Behaviors.Add(new TransportClientEndpointBehavior
                {
                    TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("DEFAULST ISSUER", "DEFAULT KEY")
                });

            sh.Open();

            foreach (ChannelDispatcherBase channelDispatcherBase in sh.ChannelDispatchers)
            {
                ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
                foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
                {
                    Console.WriteLine("Adres Dinleniyor : {0}", endpointDispatcher.EndpointAddress);
                }
            }
            Thread.Sleep(5000);

            Console.WriteLine("Servis Bağlantısı Gerçekleştirildi ...");

            Console.WriteLine("Kapatmak için : ENTER'a basınız");
            Console.ReadLine();

            sh.Close();
        }
    }
}

Yukarıda görüldüğü üzere Service Bus hizmetini management portal üzerinde oluşturduktan sonra bize ENDPOINT olarak bir url vermekte bu url ile bağlantıyı gerçekleştirmek için gerekli yerlere Default Issuer ve Default Key yerleştirerek bu adres üzerinden wcf servisimizin bize return ettiği her türlü veriye ulaşmamız sağlanmakta.

Default Issuer ve Default Key bilgilerine erişmek için management portal üzerinde oluşturduğumuz Service Bus sekmesinin altında bulunan Connection Information kısmından ulaşabiliriz.

Capture

Programı çalıştırdığımızda karşımıza çıkan arayüzde görüleceği üzere Service Bus ile gerekli Connection String yapısındaki Endpoint noktası üzerinden adres dinleniyor ve bağlantı kuruluyor. Daha sonrasında WCF aracılığı ile gönderilen bilgiler Service Bus ile tutularak birazdan yapacağımız Reciever aracılığı ile görüntülenmesine yardımcı oluyor.

Capture

Programı test etmek amacıyla solution explorer kısmından yeni bir Console App projesi ekliyoruz.

Capture

Projeyi oluşturduktan sonra diğer projede bulunan IServicebusService sınıfını bu projeye Add Existing Item olarak tanımlamamız gerekiyor. Bunun için ServiceBusTutorialTestClient Solution kısmına sağ tıklayarak Add > Existing Item diyerek diğer projedeki IServicebusService  class’ını seçiyoruz. Seçtikten sonra ADD yerine Add as a Link olarak ekliyoruz.

Untitled

Servisimizi Test Client projesine tanımladıktan sonra Program Main kısmına servisten gelen bağlantı ile eşleşecek olan mesajımızı ve Azure Service Bus Relay bağlantılarını gerçekleştirebiliriz.

using Microsoft.ServiceBus;
using ServiceBusTutorial.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace ServiceBusTutorialTestClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var cf = new ChannelFactory<IServiceBusService>
                (new NetTcpRelayBinding(), new EndpointAddress(ServiceBusEnvironment.CreateServiceUri(
"sb", "servicebusFeed1", "service")));

            cf.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior
            { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("DEFAULST ISSUER", "DEFAULT KEY") });

            var ch = cf.CreateChannel();

            Console.WriteLine(ch.Version("Onur Yazıcı"));
            Console.ReadLine();
        }
    }
}

Bu kısmıda tamamladıktan sonra iki projeyide Debug ederek test edebiliriz. Öncelikle ilk oluşturduğumuz Sender işlemini yapan projeyi çalıştırıyoruz ve servis ile bağlantıyı gerçekleştirip ClientID gönderimini tamamlıyoruz. Sonrasında Reciever işleminin gerçekleştiği ikinci projeyi çalıştırarak ClientID ile eşleşen mesajımızı Console ekranında görebiliriz.

Capture

 

görüldüğü üzere iki farklı console ekranında gerekli mesajlaşma sağlanarak yayınlama işlemi başarıyla gerçekleştirildi. Service Bus’ın diğer yapıları olan Queue ve Topics konularını ileriki makalelerde anlatıyor olacağım .

 

Teşekkürler …


Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s