Katmanlı Mimari ve Platformlar Arası Haberleşme Üzerine

Kategori: Genel Programlama
Tarih: 3rd Mayıs 2013


Bazen bir projede birden fazla platform ile haberleşmeniz gerekebilir. Bu bazen zorunluluktan bazen de sistemin tasarımından kaynaklanır. Mesela katmanlı mimari kullanarak bir sistem geliştirdiğinizi varsayalım. 1. katman data access layer burada veriyi veritabanından bağımsızlaştırırsınız. 2. katman business Access layer burdada veriyi istediğiniz formatlarda sınırlar ve kullanıcıdan parametre olarak isteğiniz formatlarda alırsınız (sorrugate tipler). 3. Katman ise artık size kalmış burada direk bir Windows form yada wpf ile uygulama geliştirebilirsiniz.

3n.jpg

Ama fonksiyonel olan 3. Katman olarak bir servis yazmaktır. Daha sonra platformu ne olursa olsun uygulamamızda bu servisi referans ederek yine uygulamamızı geliştiririz. Mesela hem android bir cihazdan hem bir web sitesinden hemde masaüstü uygulamasından aynı servisi kullanırız. 3 platformda da bir butona basınca servisin ilgili methodu çalıştırılır. Bütün bu uygulamalar bizim sistemimizin bir istemcisi olur. Bir hata mesajını bile değiştirmek istesek bütün platformlarla teker teker uğraşmak yerine servisimizdeki method içinden değişlik yaparız ve tüm istemcilere artık o yeni hata mesajı gönderilir.

Aslında bir servis yazmak için hiçbir sınırınız yok. Soket programlama boyutunda verinizi istediğiniz formatta gönderip istediğiniz formatta okursunuz. Hatta gönderilen ve alınan veriyi şifreleyerek güvenliğide sağlayabilirsiniz. Ama yine fonksiyonel olan bir standart kullanmaktır. Wsdl (web service defination language) yani web servis tanımlama dili veri gönderip almanız için bir servis standartıdır. Bu şekilde bundan birkaç sene sonra çıkacak olan bir proglamlama dili yada framework bile olsa servisiniz ona da hizmet verebileceltir.

asd

Wsdl bir servis mimarisi değil mimari içinde kullanılan bir tanımlama dilidir. Mesela SOAP(Simple Object Access Protocol – Basit Nesne Erişim Protokolü) wsdl kullanan bir mimaridir. Biz wsdl ile bu servisin sunduğu fonksiyonları, onların gerek duyduğu parametreleri ve geri döndüreceği verileri belirleriz. Soap için örnek bir wsdl kodu aşağıdadır.


<?xml version='1.0' encoding='iso-8859-9'?>

<definitions name="server" targetNamespace="urn:server" xmlns:typens="urn:server" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:typens0="http://127.0.0.1/server.php">

<message name="ekle">

<part name="urunAdi"/>

<part name="aciklama"/>

<part name="marka"/>

<part name="fiyat"/>

<part name="taksit"/>

<part name="musterikodu"/>

</message>

<message name="ekleResponse">

<part name="ekleReturn"/>

</message>

<portType name="class.testPortType">

<operation name="ekle">

<input message="typens:ekle"/>

<output message="typens:ekleResponse"/>

</operation>

</portType>

<binding name="class.testBinding" type="typens:class.testPortType">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="ekle">

<soap:operation soapAction="urn:class.testAction"/>

<input>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input>

<output>

<soap:body namespace="urn:server" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output>

</operation>

</binding>

<service name="serverService">

<port name="class.testPort" binding="typens:class.testBinding">

<soap:address location="http://localhost/server.php"/>

</port>

</service>

</definitions>

Bu şekilde tanımlanmış bir servise php ile bağlanacağımızı düşünelim. Bağlantı kodu da aşağıdadır.


<?php

  $client = new SoapClient("http://localhost/siparis.wsdl", array('encoding' => 'ISO-8859-9'));
   echo $client->ekle($_POST['urunAdi'], $_POST['aciklama'], $_POST['marka'], $_POST['fiyat'], $_POST['taksit'], MUSTERISIFRE);

?>

İşte bu kadar basit. Ne veritabanı ne soket bağlantısı vs. hiçbirşeyle uğraşmadık. Sadece butona basılınca servise bağlandık ve fonksiyonu kullandık. Üstelik bu tüm platformlarda böyle basit.

Servis wsdl kullanıyorsa sorun yok. Ama wsdl kullanmayan bir servisiniz varsa bazı platformlarda sorun yaşabilirsiniz. Mesela Nufus ve vatandaşlık işleri bazı kurumlara protokol dahilinde bir Wcf açıyor. Üniversiteler, Valilikler gibi. Bu servise php bir projeden bağlanamazınız. Wcf in bi dolu avantajının yanında tek dezavantajı bu heralde. Bu seferde veriyi wcf den çekebilmek için bir ara masaüstü uygulaması yazmanız gerekir. Siz parametrelerinizi bu programa gönderirsinizi bu programda sizin yerinize wcf e bağlanır, verinizi ona gönderir gelen veriyide size iletir. Bu iş için C# ile geliştirilmiş uygulama kodları aşağıdadır.


static void Main(string[] args)

{

try

{

Service1SoapClient client = new Service1SoapClient();

TCDon[] veri = client.TCKimlik(args[0], args[1]);

Console.Write(veri[0]._ailesirano + "|" + Seo(veri[0]._adi) + "|" + Seo(veri[0]._soyadi));

}

catch (Exception ex)

{

Rapor.Yaz(ex);

}

}

Bu programı çalıştırıp veriyi geri okuyacak php kodu da aşağıdadır.


$tc = “..........”;
 $ip = “..........”
 $r = shell_exec('C:\.....\service.exe '.$tc.' ' . $ip);

Bu şekilde bir ara programla tüm platformlarda haberleşme sağlatılarbilir.




Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Comment

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Optimization WordPress Plugins & Solutions by W3 EDGE