Showing posts with label hotswap. Show all posts
Showing posts with label hotswap. Show all posts

Sunday, June 18, 2017

Update Konfigurasi Aplikasi ketika Runtimte dengan Spring Cloud

Halo kali ini Nostra akan sharing hal menarik lagi nih!

Kalian udah familiar kan dengan Spring? Seperti yang kita tau Spring punya banyak banget project, dan kesempatan kali ini Nostra mau sharing tentang Spring Cloud. Sebelum kita mulai membahas Spring Cloud, Nostra mau sharing dulu nih latar belakang dari topik ini.

Jadi begini, saat ini tren teknologi khususnya aplikasi adalah menggunakan arsitektur Microservices. Nah Spring Cloud adalah kumpulan projects dari Spring untuk memfasilitasi arsitektur tersebut. Secara spesifik sharing ini akan membahas tentang Spring Cloud Config.

Apasih benefits dari Spring Cloud Config?
Oke jadi kan Microservices adalah arsitektur dimana kita punya banyak services dengan fungsi masing-masing dan konfigurasi yang berbeda-beda. Spring Cloud Config memberikan kemudahan untuk maintain seluruh konfigurasi dari services tersebut dengan mengumpulkan seluruh konfigurasi pada "config server" atau sederhananya pada satu service tersendiri. Keuntungan lainnya adalah kita bisa mengubah konfigurasi tersebut pada config server dan kemudian services terkait cukup memanggil satu API dari Spring Actuator, yaitu dengan menggunakan method POST ke alamat http://{service-url}:{services-port}/refresh. API Call ke alamat tersebut akan memberikan balikan, apa saja yang berubah dari konfigurasi milik service tersebut.
Contoh Kembalian '/refresh'
Wow, jadi gimana cara implementasi Spring Cloud Config ini?
Spring Cloud Config memiliki tiga komponen utama, yaitu config server, client, dan file config yang disimpan dengan Git. Mekanisme yang digunakan Spring Cloud Config untuk mengetahui perubahan pada client config adalah dengan membaca commit pada Git untuk config file terkait. Melalui Git setiap commit akan mengubah versi dari file tersebut, dimana pada contoh '/refresh' tersebut kita bisa melihat bahwa terjadi perubahan pada 'config.client.version' dimana sebenarnya config file itu hanya memiliki config 'message' dan telah diubah.
Config File
Config Server
Service yang akan menjadi config server harus menggunakan anotasi '@EnableConfigServer' pada aplikasi, dimana untuk dapat menggunakan anotasi tersebut kita memasukkan dependensi terhadap Spring Cloud Config Server. Setelah kita menggunakan anotasi tersebut, selanjutnya kita perlu menyatakan pada config dari config server ini, yaitu mengenai port berapa yang akan digunakan dan dimana config dari services akan disimpan.
Contoh Penggunaan Anotasi '@EnableConfigServer'
Dependensi Terhadap Spring Cloud Config Server
Contoh Config Server Properties
Client
Lalu bagaimana cara konfigurasi client untuk mengambil konfigurasi pada config server? Hal ini dilakukan melalui properties yang ada pada client. Apabila kita telah berhasil menghubungkan client dengan config server maka kita dapat mengakses seluruh konfigurasi untuk client dengan menyimpannya pada config server. Bagaimana cara client bisa reload perubahan yang terjadi pada konfigurasi di config server? Well untuk melakukannya kita cukup menggunakan anotasi '@RefreshScope' pada bean yang mengakses konfigurasi pada config server.
Contoh Properties pada Client
Contoh Penggunaan Anotasi '@RefreshScope'
Oke, kalau kalian melihat kembali contoh-contoh di atas maka kalian akan menemukan ada sedikit trick disini, yaitu pada client terdapat property 'spring.application.name' dan itu isinya sama seperti nama file konfigurasi yang dimonitor pada configu server. Jadi Spring Cloud Config ini dapat menentukan config file mana yang diperuntukkan kepada suatu service, yaitu dengan membandingkan isi dari 'spring.application.name' dengan nama config file di Git yang dimonitor oleh config server.

et voila, cukup sederhana cara implementasinya akan tetapi perlu diperhatikan bahwa ketiga komponen tersebut harus terhubung agar dapat berjalan sebagaimana diinginkan.

That's all folks. Selamat mencoba dan berkarya!

Regards.


Sumber:





Sunday, March 19, 2017

Java HotSwap via Spring Loaded

Pada postingan sebelum nya saya sempat membahas JRebel, yaitu sebuah tools/plugin untuk hot swap pada aplikasi java. Dan kali ini saya akan membahas tentang Spring Loaded, yang bisa dibilang sejenis dengan JRebel karena berfungsi untuk melakukan hot swap.

Spring-loaded adalah sebuah JVM agent untuk reload perubahan pada class sementara JVM running. Spring-loaded memungkinkan kita untuk melakukan hot swap sehingga membantu kita dalam meningkatkan produktivitas dengan mengurangi waktu redeploy.

Experiment

Environment yang saya gunakan untuk percobaan ini adalah:
  • IntelliJ IDEA sebagai IDE 
  • Springboot REST getting started sebagai sample project
  • Maven untuk compile dan running
Langkah pertama adalah kita perlu menambahkan plugin pada pom.xml

Karena akan dirunning via IntelliJ IDEA maka perlu ditambah running configuration dengan menggunakan menu Run > Edit Configurations

Akan muncul window Run/Debug Configuration, dan kita bisa menambahkan konfigurasi running dengan klik icon + pada kiri atas window dan pilih Maven

Maka akan muncul tampilan seperti berikut:


Kita rename nama konfigurasi dengan nama spring-loaded. Isi bagian Command Line dengan spring-boot:run lalu klik OK

Running project dengan klik icon Run pada bagian kanan atas IntelliJ IDEA.

Setelah aplikasi running, kita coba akses REST nya via browser dengan url http://localhost:8080/greeting

Saat nya kita gunakan fitur dari spring-loaded ini, yaitu dengan melakukan perubahan pada code.
Kita rubah class GreetingController.java menjadi seperti berikut:


Selanjutnya kita akan mereload perubahan ini ke aplikasi yang sedang berjalan tanpa harus melakukan restart aplikasi. Caranya dengan meng-compile ulang code sehingga menggenerate file-file .class sesuai dengan code terbaru, yaitu dengan menggunakan menu Build > Make Project

Setelah proses Make Project selesai kita bisa mengecek REST yang tadi via browser. Respon REST yang didapat akan berbeda dengan yang awal, karena kita sudah melakukan perubahan pada code nya.

Proses Make Project memakan waktu yang lebih singkat dibandingkan dengan restart aplikasi. Hal ini karena proses Make Project hanya melakukan compile class java menjadi file .class saja, sedangkan proses start aplikasi nya tidak dilakukan.

Limitation

Setelah saya coba dengan beberapa skenario perubahan code, ternyata spring-loaded memiliki beberapa batasan sehingga perlu dilakukan restart aplikasi. Berikut beberapa batasan yang sudah saya temukan pada percobaan dengan environment di atas:
  • Tidak bisa mengganti value pada @RequestMapping("/greeting"), jadi apa bila kita merubah path atau endpoint /greeting menjadi /hello maka tidak akan bisa ter-reload.
  • Tidak bisa menganti nama method pada rest controller, kita bisa melakukan penambahan method secara langsung pada class controller tetapi untuk method yang sudah terpasang annotation @RequestMapping tidak bisa kita edit.
  • Saat menambahkan class domain baru, harus benar saat pertama kali hot swap, karena perubahan selanjutnya pada class domain tidak akan ter-reload saat hot swap.
Baru sekian skenario yang saya coba, mungkin masih ada beberapa batasan lain dari spring-loaded ini. Dan mungkin juga ada beberapa settingan konfigurasi untuk bisa mengoptimalkan spring-loaded sehingga meminimalisir batasan-batasan tersebut.

Kesimpulan

Bila dibandingkan dengan JRebel, spring-loaded belum bisa menyamai level JRebel. Tetapi mengingat bahwa Jrebel itu berbayar/berlisensi dan hanya memberikan masa trial selama 14 hari saja, spring-loaded yang bersifat free dan juga opensource rasanya lebih bisa diterima meskipun dengan keterbatasannya.

Meskipun pada beberapa case kita perlu restart aplikasi, menggunakan tools hotswap pasti akan lebih mengurangi waktu development dibandingkan dengan cycle normal development (compile & restart).

Jadi kenapa tidak kita gunakan spring-loaded ini selama masa development agar tingkat produktivitas sedikit meningkat.


Referensi:
https://github.com/spring-projects/spring-loaded
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html