Azure Mobile Services'a Giriş

Giriş

   

Günümüzde en populer konulardan biri olan mobil uygulama geliştirme çok hız gerektiren bir konu. Eğer bir fikriniz var ise bunu hayata geçirmek için aylarınız yıllarınız yok. Çok kısa zamanda bu fikrinizi hayata geçirmeniz gerekiyor. Tabiki her mobile uygulama geliştirmek isteyen kişinin hem mobile uygulama geliştirmeyi hemde backend geliştirmeyi bilmesi çokta mümkün değil en azından ikisi üzerinede uzman sayısı çok fazla yok.

   

Ayrıca bir mobil uygulama geliştirmek istiyorsak, amacımız mobil uygulama geliştirmektir ve sadece mobile uygulamaya konsantre olmamız daha kısa zamanda daha başarılı bir uygulama çıkartmamızı sağlayacaktır. Bu sebeple tüm backend development yükünden kurtulmak ve alt yapı hizmetlerinden kurtulamak için mobile services'I rahatlıkla kullanabiliriz. Mobile Services sayesinde çok kolaylıkla login sistemini kurabilirsiniz, verilerinizi server tarafında saklayabilirsiniz, push notification gönderebilirsiniz, loglama yapabilirsiniz, server tarafında belirlediğini kodları istediğiniz zamanda çalıştırabilirsiniz.

   

Servisler & Mobil Platformlar

   

Azure Mobile Service bir çok içerisinde bir çok servis barındırıyor bunlar;
 

  • Data
  • Api
  • Scheduler
  • Push
  • Identity
  • Logs

   

   

Yukarıdaki tüm hizmetleri mobile services altında kullanmanız mümkün. En önemlisi ise bu servislerin tümünü IOS, Android, Html/Javascript, Xamarin, Windows 8, Windows Phone, PhoneGap platformlarında kullanabilirsiniz. Yani geliştireceğiniz mobil uygulamanın hangi platformda olduğu hiç önemli değil. Ayrıca eğer geliştirdiğiniz platform yukarıdakilerden biri değil ise bile Mobile Services REST API ile internete bağlanabilen her türlü platformdan Mobile Services kullanmak mümkün mesela Raspberry Pi gibi.

   

   

Backend Platform

   

Mobile Services kullanırken karşımıza iki yol çıkıyor. Azure tarafında çalışacak kodları .Net ile mi yoksa JS ile mi yazmak istediğimiz mobile servis'I kullanırken karşımıza çıkacak ilk konu. JS seçersek server tarafında çok çok az kod yazmamız gerekecek ve çok daha hızlı biz şekilde geliştirme yapacağız. .Net backend seçersek biraz özelleştirilmiş bir Web Api yazmamız gerekecek. Ben yeni başlayan arkadaşlar için JS Backend tavsiye ederim. Aslına bakarsanız hangisini seçtiğiniz çok önemli değil aynı işleri ikisiylede yapmanız mümkün.

   

Başlangıç

Management Portal üzerinden sol tarafta bulunan Mobile Services bölümüne geliyoruz ve aşağıda bulunan + butonu ile yeni bir mobile services ekliyoruz. Burada karşımıza bir popup çıkıyor ve bir kaç bilgi istiyor.

   

Create a Mobile Service

   

Mobile Service yaratılırken URL yani mobile service ismi, Database (yukarıda bahsettiğimiz gibi verileri saklamak için), Region (mobile service'in hangi bölgede host edileceği) ve Backend( JavaScript & .Net) bilgilerini girmemizi istiyor. Burada Database seçerken var olan bir database seçebilirisiniz veya yeni bir database yaratabilirsiniz. İsterseniz 20MB ücretsiz bir SQL database oluşturmanız mümkün.

   

Mobile Service Overview

   

Yarattığımız mobile servisin içine girdiğimizde yukarıdaki ekran ile karşılacağız. Burada Gördüğünüz gibi yukarıda farklı servisler için tab'lar mevcut ve açılan ana sayfada platform seçenekleri var. Buradan platformunu seçecek örnek kodları indirebilirsiniz veya bu platform için mobile services nasıl kullanılır öğrenebilirsiniz.

   

Mobile Services'a bağlanmak için bir önceki sayfada girdiğimiz URL ve otomatik oluşan bir key kullanacağız. URL'I zaten biliyoruz (oluşturuken yazdık). Key'leri ise en altta bulunan Manage Keys butoununa basarak görebilirsiniz.

   

Mobile Services 3 fiyat ve performans seçeneğinden oluşmakta. Bunlar Free, Basic, Standart ve bunların arasındaki geçişi yukarıda bulunan Scale tab'Indan yapabilirsiniz. Free adından anlaşıldığı gibi ücretsiz tabiki belli limitleri var. Basic ve Standart'ta siz bu limitleri belirleyebilir ve mobil servisinizdeki yüke göre kod yazmadan otomatik olarak scale etmesini sağlayabilirsiniz.

   

JS Backend ve .Net backend için tüm servisleri ayrı yazılarda inceleyeceğiz.

Azure Cloud Service

Azure Cloud Service'i bir container olarak düşünebiliriz. CloudService projesine bağlı iki farklı tipte proje olabilir bunlar Worker Role ve Web Role'dür. Ayrıca ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg, ServiceDefinition.csdef gibi config dosyaları barındırır. Her Web Role ve Worker Role için en az bir VM yaratılır ve birbirlerinden bağımsız olarak scale edilebilirler. Ayrıca connection string gibi bilgiler projelerin App Config veya Web Config dosyalarında değil ServiceConfiguration dosyalarında bulunur. Böylece tüm worker role ve web role instance'ları aynı configuration dosyalarını okuyabilirler.

Kısaca Worker Role ve Web Role ne demek bakalım.

   

Worker Role

Worker Role, sürekli olarak çalışan bir programdır. Azure üzerinde bir sanal makineye deploy edeilir ve kendi kendine çalışır eğer bir sebepten dolayı (exception vb.) program kapanırsa otomatik olarak yeniden başlatılır.

İçerisinde bir kaç default method barındırır. OnStart(), Run(), OnStop(). Her worker role class'i RoleEntyPoint class'inden inherit ettiği için bu methodları ovveride olarak barındırır. Bu methodlar nedir kısaca bakmak gerekirse; OnStart(), worker role ilk çalıştığında çalışır ve genelde connection'lari başlatmak gibi işlemler için kullanılır. OnStart() methodundan sonra Run() methodu çağırlır ve asıl iş burada döner, her hangi bir sebebten ötürü program kapanacak olursa OnStop() methodu çağırılır ve bu method içerisinde açılan connectionların kapatılması gibi işlemler yapılır. Bu methodlar Azure tarafından otomatik olarak çağırılmaktadır. Asıl bizim için önem taşıyan method Run() methodudur. Bu methodun hiç sonlanmayacağını düşünmeliyiz. Çünkü eğer bu method tamamlanırsa ardından OnStop() çağırılır ve program kapanır. Ardından otomatik olarak Azure tarafından tekrar program başlatılır. Bu sebebten dolayı Run methodu hiç bitmeyecek şekilde tasarlanmalıdır. Örneğin while(true) gibi bir sonsuz döngü barındırmalıdır veya ManualResetEvent.WaitOne() gibi bir method ile bekletilmelidir.

Visual studio içerisinde bir kaç farklı tipte Worker Role proje template'i olsada aslında olay hep yukarıda anlattığım kadardır.

   

Worker Role nasıl bir senaryoda işimize yarar?

Örneğin bir Queue var ve client uygulamalarımız sürekli olarak bu queue'ya mesaj gönderiyor. Bir programın bu queue'dan gelen mesajı okuyup işlemesi gerekir ve devamında bir takım işlemleri yapması gerekir. Bu durumda WorkerRole sürekli çalışan bir program yapısında olduğundan sürekli olarak Queue'yu dinlemesi mümkündür ve queue'ya herhangi bir mesaj geldiğinde gelen mesajı işleyip ardından bir sonraki mesajı alabilir. Queue hakkında detaylı bilgiyi buradan ulaşabilirsiniz.

   

Web Role

Web Role aslında bir Asp.Net projesinden fazlası değildir. Normal bir Asp.Net projesinden fazla olarak içerisinde WebRole.cs adında bir class barındırır. Bu class aynı Worker Rolede olduğu gibi RoleEntityPoint'ten inherit edilmiştir. Böylece OnStart() gibi methodlar ile durumları handle etmeniz mümkün.

   

Configuration Dosyaları

   

Cloud service projesi içerisinde 3 tane configuration dosyası bulunur. Bunlar ServiceConfiguration.Cloud.cscfg, ServiceConfiguration.Local.cscfg ve ServiceDefination.csdef. Aslına bakılırsa ServiceDefinition.csdef bir configuration dosyası değildir bir tanımlama dosyasıdır.

Cloud Service

   

ServiceDefinition.csdef dosyasında tüm WebRole ve WorkerRole'lerimiz için ayarlar bulunur.

ServiceDefinition.csdef

Yukarıda gördünüz gibi bir WebRole tagi'i ve birde WorkerRole tagi'i bulunuyor.

Worker Role tag'ine baktığımızda name ve vmsize isimli iki property görüyoruz. VMSIZE property'si şuanda Small olarak set edilmiş durumda, azure ClouldSample.CloudService.WorkerRole'u host etmek yaratacağı VM(leri) Small size'da yaratacaktır. Siz buradan bunu değiştirebilirsiniz. Aynı ayar WebRole içinde mevcut, ancak web role için daha çok ayar görüyoruz, port ve protocol gibi bunları buradan değiştirebilirsiniz. Ayrıca eğerki webconfig dosyasında olduğu gibi istediğiniz başka bir ayarı eklemek isterseniz, öncelikle key değerimizi bu dosyaya yazmamız gerekiyor. Örneğin ben WorkerRole için Key1 isimli bir setting tanımladım ancak değerinin ne olduğu bu dosyada belirtilmiyor.

   

Gelelim cscfg dosyalarına

Cloud.cscfg

Bu dosyalardan iki tane mevcut bir tanesi Cloud.cscfg diğer ise Local.cscfg. Ancak dosyaların şemaları aynı. Bunu web configteki debug config ve release config dosyası olarak düşünebilirsiniz. Localde emulator üzerinde çalıştırırsanız Local.cscfg dosyası yükleniyor cloud üzeirnde çalışırsa Cloud.cscfg dosyası yükleniyor. Bunları değiştirmeniz mümkün.

Dosyanın içeriğine baktığımızda yine her role için bir tag olduğunu görüyoruz ve önemli olarak Instances tagi bulunmakta. Bu tagin count property'si ile kaç insantance yaratılacağını belirliyoruz. Böylece ServiceDefination.csdef dosyasında bulunan sizede ve bu dosyada bulunan sayıda intance yaratılır. Bu ayarı buradan değiştirebilir. Ayrıca ServiceDefiniation.csdef dosyasında bulunan setting değerleri bu dosyaların ikisindede mecburen olmalı. Gördüğünüz gibi ben Key1 için Value1 olarak bir değer bildirdim.

   

Bu dosyaları xml olarak düzenlemek istemezseniz. CloudService altında bulnan Roles içerisnde role'ün üzerine çift tıklayarak bir editor açabilirsiniz ve buradan Instance size veya settings veya endpoint gibi bir çok ayarı yönetebilirsiniz.

   

Cloud Service nasıl oluşturulur?

Visual Studio üzerinden Create New Project'e tıklayacak açılan pencerede Templates-> Cloud ve Azure Cloud Service'i seçiyoruz.

Create Cloud Service

   

Karşınıza aşağıdaki ekran gelecektir. Ve bu pencerede service'imize Role ekliyoruz.Ben aşağıdaki örnekte Bir Worker Role birde Web Role ekledim.

   

Role Ekleme

Tabiki daha sonra yeni role ekleme imkanımızda olacaktır. Daha sonra karşınıza Web Role için seçeneklerin olduğu bir pencere çıkacaktır. Buradan Web Forms, MVC, Web Api gibi template'lerden birini seçerek devam ediyoruz. Ben bu örnekte MVC seçiyorum ve Authenction olarak No Authentication diyorum böylece herhangi bir authentication mekanızmaması olmayacak.

   

Worker Role & Web Role & Queue kullanan bir örneği yakında yayınlayacağım.