Showing posts with label mysql. Show all posts
Showing posts with label mysql. Show all posts

Saturday, June 30, 2018

Rest API using Play Framework in Java

Halooo . . .
Kali ini saya membuat tulisan mengenai Rest API menggunakan Play Framework khususnya java pada play framework

Sebelumnya, apa itu play framework?
Play Framework adalah framework open souce aplikasi web yang ditulis dengan Scala dan juga pemrograman lainnya seperti Java.
Biasanya pemrograman yang menggunakan java membutuhkan waktu untuk proses build dan deploy. Nah, dengan menggunakan framework ini, hasil coding tersebut hanya cukup kita save dan refresh browser atau postman untuk melihat hasil coding yang kita kerjakan.
Terkadang ada juga pemrograman yang menggunakan java harus restart server terlebih dahulu, padahal yang di edit hanya sedikit line code.

Typesafe Activator merupakan platform yang bisa digunakan untuk membuat dan menjalankan project play framework. Untuk download typesafe activator dapat di download pada link berikut: http://typesafe.com/activator
atau jika anda menggunakan mac, cukup gunakan perintah berikut pada terminal anda :
brew install typesafe-activator

Tanpa basa-basi kita create new project dulu ya . .
  1.  Create new Project

    Pertama buka terminal terlebih dahulu, dan pergi ke direktori dimana kita akan create project baru kita
    Gambar 1

    Kemudian ketik perintah : activator new 

    Gambar 2
    Maka akan muncul beberapa pilihan seperti gambar di atas (Gambar 2). dan kita akan memilih nomor 5

    Gambar 3
    Pada gambar diatas (Gambar 3) project sudah berhasil di create dengan nama project (play-java) 

    Untuk menjalankannya : activator run
    Gambar 4
    untuk testing di postman atau di browser : //localhost:9000

    Gambar 5 Tampilan awal Play Framework
  2.  Konfigurasi database
    Tambahkan code-code berikut pada file:

    Pada file build.sbt :



  3. Pada file plugins.sbt : 

            

     Pada file application.conf :
  4. Models
    Selanjutnya kita akan membuat model
    package models;
    import com.avaje.ebean.Model;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "anggota")
    public class Anggota extends Model {
        @Id    
        private Integer id_anggota;
        private String nama_anggota;
        private String alamat_anggota;
    
        public Integer getId_anggota() {
            return id_anggota;    }
        public void setId_anggota(Integer id_anggota) {
            this.id_anggota = id_anggota;    }
    
        public String getNama_anggota() {
            return nama_anggota;    }
    
        public void setNama_anggota(String nama_anggota) {
            this.nama_anggota = nama_anggota;    }
    
        public String getAlamat_anggota() {
            return alamat_anggota;    }
    
        public void setAlamat_anggota(String alamat_anggota) {
            this.alamat_anggota = alamat_anggota;    }
    }
    
  5. Controller
    Dan ini untuk controller
    package controllers;
    import repository.AnggotaRepository;
    import com.fasterxml.jackson.databind.JsonNode;
    import models.Anggota;
    import org.springframework.beans.factory.annotation.Autowired;
    import play.libs.Json;
    import play.mvc.Controller;
    import play.mvc.Result;
    
    import java.util.List;
    public class AnggotaController extends Controller {
    
        @Autowired    AnggotaRepository anggotaRepository;
        public Result viewAnggota(String nama){
            List<Anggota> anggotas = anggotaRepository.cocoTasks(nama);
    
    return ok(Json.toJson(anggotas));
    } public Result listAnggota(){ List<Anggota> anggotas = anggotaRepository.cocoList();
    return ok(Json.toJson(anggotas));
    } public Result createAnggota() { JsonNode json = request().body().asJson();
    Anggota anggota = new Anggota();   
    anggota = (Anggota)Json.fromJson(json,Anggota.class);  
    anggota.save();
    return ok(Json.toJson(anggota));
    } public Result updateAnggota(){
    JsonNode json = request().body().asJson();
    Anggota anggota = new Anggota(); anggota = (Anggota)Json.fromJson(json, Anggota.class); anggota.update(); return ok(Json.toJson(anggota));
    } public Result delete(Integer id_anggota){ Anggota anggota = anggotaRepository.findById(id_anggota); if(anggota==null){   return notFound(Json.toJson("Anggota not Found"));  } anggota.delete(); return ok(Json.toJson("Anggota "+id_anggota+"has been deleted")); } }
  6. Repository
    Dalam project sederhana ini, saya buat file repository. Dimana dalam file ini berisi query-query data yang saya gunakan
    package repository;
    import com.avaje.ebean.Model;import models.Anggota;
    import java.util.List;
    public class AnggotaRepository {
    
        public static Model.Finder<Integer, Anggota> find = 
            new Model.Finder<Integer, Anggota>(Integer.class, Anggota.class);
    
        public static   List<Anggota> cocoTasks(String nama){
            return  find                .query().where()
                    .ilike("nama_anggota","%"+nama+"%")
                    .orderBy("id_anggota").findList();
        }
        public static List<Anggota> cocoList(){
            return  find.orderBy("id_anggota").findList();
        }
    
        public static Anggota findById(Integer id_anggota){
            return find.byId(id_anggota);    }
    }
    
    
    
    
  7. Mapping
    Action-action yang sudah kita code dalam controller dapat kita mapping. Untuk mapping dapat di kita lakukan pada file play-java/conf/routes
    # Routes
    # This file defines all application routes (Higher priority routes first)
    # ~~~~
    
    # An example controller showing a sample home page
    GET     /                           controllers.HomeController.index
    
    GET  /anggota/nama_anggota=:nama_anggota  controllers.AnggotaController.viewAnggota(nama_anggota:String)
    GET   /list-anggota                       controllers.AnggotaController.listAnggota()
    POST  /create-anggota                     controllers.AnggotaController.createAnggota()
    POST  /update-anggota                     controllers.AnggotaController.updateAnggota()
    DELETE  /delete-anggota/:id_anggota       controllers.AnggotaController.delete(id_anggota:Integer)
    
    # An example controller showing how to use dependency injection
    GET     /count                      controllers.CountController.count
    # An example controller showing how to write asynchronous code
    GET     /message                    controllers.AsyncController.message
    
    # Map static resources from the /public folder to the /assets URL path
    GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)
  8. Demo
    - Action Create
    Gambar 6. Action Create

    - Action View
    Gambar 7. List Anggota

    Gambar 8. search by nama anggota

    - Action Update
    Gambar 9. Action Update

    - Action Delete
    Gambar 10. Action Delete


    Begitu lah sharing singkat mengenai Rest API using Play Framework
    Sekian dari saya dan semoga tulisan ini bermanfaat.
    Terima kasih,

    Salam

    Reference :
    - https://www.playframework.com/documentation/
    - http://www.baeldung.com/rest-api-with-play
    - https://www.youtube.com/watch?v=qKxgtmuPjHQ

Saturday, March 17, 2018

LoadBalancing Percona-MySQL with HAproxy and ClusterCheck

         Untuk postingan kali ini saya akan membahas tentang bagaimana cara loadbalancing 3 nodes Percona-xtradb MySQL cluster dengan menggunakan haproxy dan clustercheck. Untuk lebih mengenal apa itu percona-xtradb dapat mengunjungi halaman dokumentasi resminya di percona-xtradb official. Untuk loadbalancing ketiga nodes ini kita membutuhkan clustercheck, xinetd dan HAproxy. 


Kita akan bahas satu persatu, clustercheck adalah shell script yang akan check status node percona-mysql apakah ready to accept request. Jika ready, clustercheck akan respon HTTP code 200 (OK), jika tidak HTTP error 503 (Service Unavailable) akan dikirim. Xinetd (xtended Internet daemon) adalah opensource daemon yang dapat membuka koneksi untuk request pada jaringan dengan menyediakan sebuah service. Xinetd akan kita gunakan untuk membuka service pada port 9200 yang akan digunakan clustercheck untuk report status node percona-mysql. Haproxy yang menjadi balancer akan check ke port 9200 yang telah disediakan oleh xinetd pada setiap node untuk menentukan apakah node tersebut dapat digunakan.

Prerequisites :
- Centos 7 64bit
- Git installed
- Percona-XtraDB cluster sudah di setup dan sync di ketiga nodes.

Next kita masuk ke konfigurasi, lakukan step berikut di ketiga node :

  • Install xinetd

  • Add user untuk clustercheck

  • Clone repository clustercheck dan copy clustercheck file ke /usr/bin

  • Create file mysqlchk ke /etc/xinetd.d

  • Add service mysqlchk ke /etc/services

  • Verifikasi konfigurasi, bila return = 0, node tersebut sudah sync 

  • Restart service xinet.d, jika sudah maka di setiap node akan listen di port 9200/xinetd
  • Setelah semua step diatas selesai dilakukan di setiap node, kita beralih ke haproxy.
  • Konfigurasi /etc/haproxy/haproxy.cfg dan sesuaikan hostname setiap node


Selesai, 3 node percona-mysql tersebut akan di loadbalancing oleh HAproxy yang akan melakukan check melalui port 9200. Dari sisi aplikasi, endpoint yang digunakan untuk menembak percona-mysql adalah ip dan port yang di set pada HAproxy. Selamat mencoba guys.

Referensi :

Sunday, September 17, 2017

Deploy Stateless and Stateful Application in Kubernetes

Halo sobat Nostra, artikel selanjutnya kita akan membahas tentang bagaimana cara deploy sebuah aplikasi pada Kubernetes, baik itu aplikasi yang bersifat stateless maupun stateful. Dalam tutorial ini, diasumsikan bahwa Kubernetes sudah berjalan dengan baik pada environtment anda baik itu yang di setup sendiri di local anda, cloud, dan environment yang lain. Untuk mengecek status dari kubernetes yang sudah kita setup sebelumnya kita dapat menjalankan perintah: kubectl get nodes

1. Output perintah kubectl get nodes
Pada tampilan gambar 1. menampilkan berapa nodes yang sedang kita gunakan dalam kubernetes cluster kita. Dari output diatas kita dapat melihat bahwa status dari masing-masing node adalah "Ready" yang artinya kubernetes cluster sudah siap untuk digunakan. 
Sebelum kita deploy sebuah aplikasi di Kubernetes, saya akan jelaskan sedikit terkait apa itu aplikasi stateless dan stateful. Aplikasi yang bersifat stateless adalah sebuah aplikasi dimana sistem tersebut tidak menyimpan state dari user untuk request selanjutnya contohnya adalah aplikasi halaman landing page sebuah website, sementara aplikasi yang bersifat stateful adalah sebuah aplikasi yang menyimpan data dari setiap request yang diminta oleh user. Dan stateful application umumnya membutuhkan storage untuk menyimpan data dari user. Pada tutorial kali ini, saya akan deploy mysql-server namun yang bersifat stateless.
1. Stateless application

Pada kubernetes, ketika kita ingin deploy sebuah aplikasi kita harus membuat file.yaml nya terlebih dahulu untuk aplikasi tersebut.
2. mysql service

Berikut adalah contoh file simple service deployment untuk kubernetes dimana pertama kita menetukan versi api yang kita gunakan untuk objek tersebut. Kedua kita menentuka objek apa yang akan kita deploy, dalam hal ini kita akan deploy sebuah sevice terlebih dahulu dimana namanya adalah "wordpress-mysql". Selanjutnya adalah kita tentukan port berapa yang digunakan oleh container dalam deployment tersebut. Misalnya untuk mysql adalah 3306. 
 Setelah kita membuat service untuk  mysql, selanjutnya kita akan membuat deployment untk mysql tersebut. 
Seperti pada gambar 3, pertama terlebih dahulu kita membuat versi API yang kita gunakan untuk deploment tersebut. Lalu selanjutnya jenis objek yang akan kita gunakan, karena kita membuat sebuah deployment, maka kita masukkan value "Deployment". 
3. mysql deployment
Lalu selanjutnya ada beberapa label, yang kita gunakan pada file tersebut seperti "wordpress", nantinya label tersebut akan digunakan pada objek lain. Selanjutnya adalah menentukan image yang akan kita gunakan pada deployment tersebut. Bagian ini kita masukkan pada bagian container, serta beberapa environment lain yang jika dibutuhkan. Seperti pada file tersebut, adalah saya tambahkan environment untuk MYSQL_ROOT_PASSWORD, dimana password tersebut sudah terlebih dahulu disimpan ke dalam sebuah objek berupa secret. Lalu pada bagian terakhir, kita tentukan port container yang akan kita gunakan.
Selanjutnya kita akan coba jalankan deployment mysql tersebut pada kubernetes.
Untuk menjalankan deployment pada kubernetes dapat dilakukan dengan cara :
$ kubectl create -f "namafile.yaml" 



Selanjutnya kita akan cek bagaimana status deployment yang sudah kita buat.








Dari gambar diatas, tampil bahwa container sudah berjalan dengan baik. Selanjutnya kita akan masuk ke dalam container untuk melihat apakah deployment tersebut bersifat stateless atau tidak. Pada gambar dibawah ini, kita masuk ke dalam container dengan menjalankan perintah: $ kubectl exec -it "nama_container" bash. 
Lalu kita akan diarahkan pada sebuah container mysql, kita coba membuat database di dalam container dengan menjalankan perintah " create database testingaja". Lalu pod tersebut di hapus. 





Setelah pod tersebut dihapus, kubernetes akan otomatis create container yang sama dengan container sebelumnya seperti yang tampil pada gambar dibawah ini. Lalu kita masuk ke dalam container yang baru dengan cara sama dengan sebelumnya. Lalu kita cek databasenya, dan ternyata database yang sebelumnya kita create tidak ada. Ini adalah contoh deployment yang bersifat stateless, dimana data dari user tidak akan tersimpan secara permanen


2. Stateful Application
Untuk stateful deployment, pertama kita membutuhkan sebuah volume terlebih yang kita create, lalu volume tersebut di claim oleh deployment yang membutuhkan volume tersebut.
Berikut adalah contoh sederhana untuk membuat volume pada kubernetes.
Yang akan membuat 2 buah volume, dimana storage yang disediakan adalah 10Gb. Dan lokasi path sebagai tempat penyimpanan untuk setiap data yang di mount adalah folder /home/nostra/pv-1 maupun /home/nostra/pv-2 dari host kubernetes. 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-1
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/nostra/pv-1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-2
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/nostra/pv-2

File : local-volume.yaml --> Untuk menjalankannya : $kubectl create -f local-volume.yaml

Lalu selanjutnya kita akan membuat objek claim volume yang digunakan untuk claim volume yang sudah kita create sebelumnya.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

File : mysql-pv-claim.yaml --> Untuk menjalankannya: $kubectl create -f mysql-pv-claim.yaml
Selanjutnya kita akan create untuk deployment dari mysql.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim


File : wordpress-mysql.yaml --> Untuk menjalankannya: $kubectl create -f wordpress-mysql.yam

Setelah kita create deployment tersebut, kita akan coba masuk ke dalam container. Dan coba lihat kembali apakah database tetat tersimpan walaupun pod nya di hapus.





































Pada gambar diatas tampak bahwa kita sudah membuat sebuah database pada satu container, dengan nama database "testinglagi". Lalu selanjutnya kita akan hapus database tersebut, dan cek apakah database "testinglagi" masih ada.




























Dari gambar tampak bahwa, database yang sebelumnya kita create masih tersimpan. Berarti pada tutorial ini tampak jelas bagaimana caranya deploy sebuah aplikasi yang bersifat stateless dan stateful pada Kubernetes. Semoga tulisan ini bermanfaat bagi teman-teman sekalian.
Terimakasih.

Saturday, March 14, 2015

MySQL tidak bisa login dengan user root

Kadang kala ada saatnya kita perlu meng-crack user root di MySQL database, yang biasanya disebabkan keisengan kita untuk melihat isi dari aplikasinya. Ataupun kita sendiri lupa dengan password rootnya. Nah lho... :)

Berikut ada contoh aplikasi yang di package dalam XAMPP, sedangkan aplikasi menggunakan PHP dan database MySQL sebagai persistance-nya. Dan user root untuk MySQL di lock. Wuih...

Berikut snapshoot dari XAMPP Security :


Ok, sekarang saatnya meng-crack user root nya. Berikut langkah-langkahnya :

  • Shutdown MySQL Database. Caranya : 
    • Klik Control Panel 
    • Klik Administration Tools 
    • Klik Services
    • Klik MySQL
    • Klik Stop



  • Sekarang saatnya menambahkan skip-grant-tables di my.ini. Caranya :
    • Edit file di my.ini di folder c:/xampp/mysql/bin/my.ini
    • Tambahkan skip-grant-tables di bagian [mysqld]. Letakkan di bawah #skip-networking.
    • Simpan filenya
  • Jalankan MySQL Database. Langkahnya sama seperti diatas, bedanya kita memilih tombol start.
  • Buka mysql command. Caranya :
    • Klik menu command prompt.
    • Ketik cd /xampp/mysql/bin lalu tekan enter.
    • Ketik mysql lalu tekan enter.
  • Ketik perintah-perintah berikut :
    • UPDATE mysql.user SET Password=PASSWORD('password1') WHERE User='root';
    • FLUSH PRIVILEGES;
    • exit;
Wooola... Kita sudah bisa login MySQL dengan user root dengan password : password1.
Jangan lupa hapus skip-grant-tables di my.ini dengan kondisi MySQL Database mati.

Mudah-mudahan informasi yang singkat ini berharga untuk kita semua.



Thanks.