Senin, 18 November 2013

RPC (Remote Procedure Call), SOAP (Simple Object Access Protocol), REST (Representational State Transfer)



RPC (Remote Procedure Call), SOAP (Simple Object Access Protocol), REST (Representational State Transfer)
 


Pengertian Remote Procedure Call (RPC)

Remote Procedure Call (RPC) adalah sebuah metode yang memungkinkan kita untuk mengakses sebuah prosedur yang berada di komputer lain. Untuk dapat melakukan ini sebuah  server harus menyediakan layanan  remote procedure.Pendekatan yang dilakuan adalah sebuah  server membuka  socket, lalu menunggu client yang meminta prosedur yang disediakan oleh server. Bila client tidak tahu haruS menghubungi  port yang mana,  client bisa me-request kepada sebuah  matchmaker pada sebuah RPC  port yang tetap.  Matchmaker akan memberikan  port apa yang digunakan oleh prosedur yang diminta client.

Prinsip Dasar RPC


Kelebihan RPC
  • Relatif mudah digunakan :
Pemanggilan remote procedure tidak jauh berbeda dibandingkan pemanggilan procedure. Sehingga pemrogram dapat berkonsentrasi pada software logic, tidak perlu memikirkan low  level details seperti  socket, marshalling & unmarshalling.
  • Robust (Sempurna):
Sejak th 1980-an RPC telah banyak digunakan dlm pengembangan mission- critical application yg memerlukan scalability, fault tolerance, & reliability.

Kekurangan RPC
  • Tidak fleksibel terhadap perubahan : Static relationship between client & server at run-time.
  • Berdasarkan prosedural/structured programming yang sudah ketinggalan jaman dibandingkan OOP.

Struktur Protokol Message RPC
  • Call Message
Dilakukan oleh klien, dimana meminta server untuk mengeksekusi suatu prosedur. Terdapat nilai-nilai unsigned integer yang digunakan untuk mengidentifikasi prosedurremote yang diminta:
1.      Nomor Program
2.      Nomor Versi dari Program
3.      Nomor Prosedur
  • Reply Message
Dikirimkan oleh server jaringan, bervariasi tergantung apakah call messages yang diminta klien diterima atau ditolak. Reply message mengandung informasi yang digunakan untuk membedakan kondisi-kondisi yang diminta sesuai dengan call messages. Informasi ini antara lain :
1.      RPM mengeksekusi call message dengan sukses
2.      Implementasi remote tidak sesuai dengan protokol yang digunakan (versi yang lebih tinggi atau lebih rendah ditolak)
3.      Program remote tidak tersedia pada sistem remote
4.      Program remote tidak mendukung versi yang diminta klien
5.      Nomor prosedur yang diminta tidak ada

Fitur dalam RPC
1.      Batching Calls
Mengijinkan klien untuk mengirim message calls ke server dalam jumlah besar secara berurutan.
2.      Broadcasting Calls
Menijinkan klien untuk mengirimkan paket data ke jaringan dan menunggu balasan dari network.
3.      Callback Procedures
Mengijinkan server untuk bertindak sebagai klien dan melakukan PRC callback ke proses yang dijalankan klien.
4.      Select Subrutin
Memeriksa deskripsi suatu file dan messages dalamantrian untuk melihat apakah siap dibaca atau ditulis,atau ditahan. (mengijinkan server untuk menginterupsi suatu aktivitas.


Langkah-langkah dalam RPC 


1.  Prosedur client memanggil client stub
2.  Client stub membuat pesan dan memanggil OS client
3.  OS client mengirim pesan ke OS server
4.  OS server memberikan pesan ke server stub
5.  Server stub meng-unpack parameter-parameter untuk memanggil server
6.  Server mengerjakan operasi, dan mengembalikan hasilnya ke server stub
7.  Server stub mem-pack hasil tsb dan memanggil OS server
8.  OS server mengirim pesan (hasil) ke OS client
9.  OS client memberikan pesan tersebut ke client stub
10.  Client stub meng-unpack hasil dan mengembalikan hasil tersebut ke Client



Remote Procedure Call dengan SunRPC
Salah satu implementasi RPC (Remote Procedure Call) adalah dengan menggunakan SunRPC. Dalam tutorial kali ini, saya akan mencontohkan pembuatan program sederhana yang menggunakan SunRPC.
Service yang disediakan oleh program adalah operasi matematika dasar, yaitu penjumlahan, pengurangan, perkalian, pembagian, dan pencarian modulo.

Pendefinisian Service
Sebelum program yang menggunakan RPC dibuat, kita harus mendefinisikan fungsi-fungsi atau prosedur-prosedur apa saja yang akan dibuat.
Berikut ini adalah definisi service yang akan kita buat.
struct angka {
    int a;
    int b;
};

program TAMBAHAN {
    version TAMBAHANVER {
        int tambah(angka) = 1;
        int kurang(angka) = 2;
        int kali(angka) = 3;
        float bagi(angka) = 4;
        int mod(angka) = 5;
    } = 1;
} = 99;
Simpan text di atas ke dalam sebuah file bernama tambah.x. Sekarang jalankan program rpcgen untuk mengubah file tersebut menjadi client dan server stub.
rpcgen tambah.x
Setelah program di atas dijalankan, akan terbentuk empat buah file baru. Yaitu:
  1. tambah_clnt.c
  2. tambah_svc.c
  3. tambah.h
  4. tambah_xdr.c
Semua file tadi akan digunakan dalam pembuatan program client dan server RPC.
Pembuatan Server
Program server akan mengimplementasikan fungsi-fungsi pada server stub. Dalam program kali ini, ada lima buah fungsi yang harus diimplementasikan, yaitu:
  1. int * tambah_1_svc(angka *, struct svc_req *)
  2. int * kurang_1_svc(angka *, struct svc_req *)
  3. kali_1_svc(angka *, struct svc_req *)
  4. bagi_1_svc(angka *, struct svc_req *)
  5. mod_1_svc(angka *, struct svc_req *)
Daftar fungsi-fungsi itu dapat dilihat pada file tambah.h.
Berikut ini adalah implementasi fungsi yang akan kita buat.
#include <rpc/rpc.h>
#define _RPCGEN_SVC
#include "tambah.h"

int * tambah_1_svc(angka *input, struct svc_req *req) {
    static int hasil;

    hasil = input->a + input-> b;
    return &hasil;
}

int * kurang_1_svc(angka *input, struct svc_req *req) {
    static int hasil;

    hasil = input->a - input->b;
    return &hasil;

}

int * kali_1_svc(angka *input, struct svc_req *req) {
    static int hasil;

    hasil = input->a * input-> b;
    return &hasil;
}

float * bagi_1_svc(angka *input, struct svc_req *req) {
    static float hasil;

    hasil = (float)input->a / (float)input->b;
    return &hasil;
}

int * mod_1_svc(angka *input, struct svc_req *req) {
    static int hasil;

    hasil = input->a % input->b;
    return &hasil;
}
Simpan source code di atas ke dalam file tambah_server.c. Setelah itu, lakukan kompilasi.
gcc -o tambah_server tambah_server.c tambah_svc.c tambah_xdr.c

Pembuatan Client
Program yang akan menjadi client, dapat menggunakan prosedur yang dijadikan sebagai remote procedure seolah-olah prosedur/fungsi tersebut menjadi bagian dari program client.
Berikut ini adalah source code dari program client yang akan kita buat.
#include <rpc/rpc.h>
#define _RPCGEN_CLNT
#include "tambah.h"

int main(int argc, char **argv) {
    CLIENT *cl;
    int *hasil;
    float *hasil_float;
    struct angka input;

    if (argc < 2) {
        printf("Masukkan alamat komputer yang menyediakan service.n");
        printf("Contoh: %s localhostnn", argv[0]);
        exit(1);
    }

    cl = clnt_create(argv[1], TAMBAHAN, TAMBAHANVER, "tcp");
    if (cl == NULL) {
        clnt_pcreateerror(argv[1]);
        exit(1);
    }

    cl->cl_auth = authunix_create_default();

    input.a = 2;
    input.b = 2;

    printf("%d + %d = %dn", input.a, input.b, *tambah_1(&input, cl));
    printf("%d - %d = %dn", input.a, input.b, *kurang_1(&input, cl));
    printf("%d * %d = %dn", input.a, input.b, *kali_1(&input, cl));
    printf("%d / %d = %dn", input.a, input.b, *bagi_1(&input, cl));
    printf("%d %% %d = %dn", input.a, input.b, *mod_1(&input, cl));

}

Simpan source code di atas ke dalam file tambah_client.c. Setelah itu lakukan kompilasi.
gcc -o tambah_client tambah_client.c tambah_clnt.c tambah_xdr.c


Simple Object Access Protocol (SOAP)

Konsep Dasar SOAP

SOAP singkatan dari Simple Object Access Protocol. SOAP adalah protokol untuk pertukaran informasi dengan desentralisasi dan terdistribusi. SOAP dibangun dengan menggunakan protokol komunikasi HTTP. Karena HTTP didukung oleh semua browser dan server, maka SOAP dapat berkomunikasi dengan berbagai aplikasi meskipun terdapat perbedaan sistem operasi, teknologi, dan bahasa pemrogramannya.
Peran SOAP di dalam teknologi web service adalah sebagai protokol pemaketan untuk pesan-pesan (messages) yang digunakan secara bersama oleh aplikasi-aplikasi penggunanya. Spesifikasi yang digunakan tidak lebih seperti sebuah amplop biasa berbasis XML untuk informasi yang ditransfer, serta sekumpulan aturan bagi translasi aplikasi dan tipe-tipe data platform yang spesifik menjadi bentuk XML. Desain bentuk dari SOAP membuatnya cocok untuk berbagai pertukaran pesan pada aplikasi.

Pesan SOAP
Sebuah pesan SOAP adalah sebuah dokumen XML yang berisi elemen-elemen berikut:
  1. Envelope element yang mengidentifikasi dokumen XML sebagai sebuah pesan SOAP.
  2. Elemen header yang berisi informasi header. Elemen ini bersifat opsional.
  3. Elemen body yang berisi panggilan dan merespon informasi.
  4. Fault element yang berisi pesan kesalahan yang terjadi pada waktu proses. Elemen ini opsional.

NuSOAP
NuSOAP adalah library yang digunakan untuk membangun web service berbasis SOAP yang ditulis dengan menggunakan bahasa PHP.
Sebagai contoh, di bawah ini terdapat dua listing program pada sisi server dan sisi client. Berikut contoh implementasi NuSOAP pada sisi server:
Kode Program File server.php
<?php
require_once(‘nusoap.php’);
$server = new soap_server;
$server->register(‘hello’);
function hello($name) {
return ‘Hello, ‘ . $name;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA :
”;
$server->service($HTTP_RAW_POST_DATA);
?>


Berikut implementasi NuSOAP untuk sisi klien:
Kode Program File client.php
<?php
require_once(‘nusoap.php’);
$client = new soapclient(‘
http://localhost/soap/server.php&#8217;);
$result = $client->call(‘hello’, array(‘name’ => $_GET['name']));
echo $result;
?>


REST (Representational State Transfer)

 
REST (Representational State Transfer) adalah suatu design arsitektur perangkat lunak yang digunakan untuk  pendistibusian sistem hipermedia seperti WWW (World Wide Web). REST arsitektur terdiri dari client and server. Proses transfer data dimulai ketika client melakukan request ke server, kemudian server memproses permintaan dari client dan meresponse balik dengan mengirimkan mengirimkan data yang sesuai dengan permintaan client.

Apakah REST web service itu?
REST pada dasarnya setiap URL unik adalah representasi dari beberapa objek. Kita dapat memperoleh konten-konten objek tersebut menggunakan HTTP GET, untuk menghapusnya, kita dapat menggunakan POST, PUT, atau DELETE untuk memodifikasi objek (dalam praktiknya, kebanyakan service menggunakan POST untuk ini).

Keuntungan REST
  • bahasa dan platform agnostic
  • lebih sederhana/simpel untuk dikembangkan ketimbang SOAP
  • mudah dipelajari, tidak bergantung pada tools
  • ringkas, tidak membutuhkan layer pertukaran pesan (messaging) tambahan
  • secara desain dan filosofi lebih dekat dengan web
Kelemahan REST
  • Mengasumsi model point-to-point komunikasi - tidak dapat digunakan untuk lingkungan komputasi terdistribusi di mana pesan akan melalui satu atau lebih perantara
  • Kurangnya dukungan standar untuk keamanan, kebijakan, keandalan pesan, dll, sehingga layanan yang mempunyai persyaratan lebih canggih lebih sulit untuk dikembangkan ("dipecahkan sendiri")
  • Berkaitan dengan model transport HTTP
Implementasi REST Web Services memiliki empat dasar prinsip desain yaitu:
  • Gunakan metode HTTP secara eksplisit.
  • Stateless.
  • URI berbentuk seperti direktori.
  • Ditransfer menggunakan XML, JavaScript Object Notation (JSON), atau keduanya.

Contoh Source code untuk REST sebagai berikut :
<?php
require 'Slim/Slim.php';
require 'db.php';

\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim(array(
    'mode' => 'production',
    'log.writer' => new \Slim\Extras\Log\DateTimeFileWriter(array(
        'path' => './logs',
        'name_format' => 'Y-m-d',
        'message_format' => '%label% - %date% - %message%'
        ))
));
     
$app->contentType("application/json");

$app->get('/getProvinsis', 'getProvinsis');
$app->get('/getKabupatens/:id', 'getKabupatens');
$app->get('/getKecamatans/:id', 'getKecamatans');
$app->get('/getDesas/:id', 'getDesas');

// Only invoked if mode is "production"
$app->configureMode('production', function () use ($app) {
    $app->config(array(
        'log.enable' => true,
        'log.level' => \Slim\Log::WARN,
        'debug' => false
    ));
});

// Only invoked if mode is "development"
$app->configureMode('development', function () use ($app) {
    $app->config(array(
        'log.enable' => false,
        'log.level' => \Slim\Log::DEBUG,
        'debug' => true
    ));
});

$app->notFound(function () use ($app) {
   echo 'notFound coy';
});

$app->run();

//All Functions goes here
function getProvinsis()
{
    global $app;

    $sql = "select * FROM provinsi ORDER BY id";
    try {
        $app->etag('getProvinsis');
        $db = getConnection();
        $stmt = $db->query($sql);
        $provinsis = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($provinsis);
    } catch(\PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

function getKabupatens($id)
{
    $sql = "SELECT * FROM kabupaten WHERE id_prov = :id";
     
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("id", $id);
        $stmt->execute();
        $kabupatens = $stmt->fetchAll();
        $db = null;
        echo json_encode($kabupatens);
    } catch (\PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

function getKecamatans($id)
{
    $sql = "SELECT * FROM kecamatan WHERE id_kabupaten = :id";
     
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("id", $id);
        $stmt->execute();
        $kecamatans = $stmt->fetchAll();
        $db = null;
        echo json_encode($kecamatans);
    } catch (\PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

function getDesas($id)
{
    $sql = "SELECT * FROM desa WHERE id_kecamatan = :id";

    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);
        $stmt->bindParam("id", $id);
        $stmt->execute();
        $desas = $stmt->fetchAll();
        $db = null;
        echo json_encode($desas);
    } catch (\PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}







Diposting olehh :
HELMI MAHFUDHATUL HARUM
1100631026 / MI. A