Showing posts with label Microservices. Show all posts
Showing posts with label Microservices. 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:





Saturday, March 18, 2017

Mengenal Teknologi Containerization dengan Docker

Pada tulisan ini, Nostra akan sharing tentang salah satu teknologi yang sedang hype, yaitu Containerization. Tulisan ini bukan cuma untuk kalian para DevOps saja, tetapi juga berguna untuk para Application Developer. Mengapa demikian? simak tulisan ini sampai akhir.

Kalau kita bicara tentang Containerization, tentu kita perlu tau terlebih dahulu apa itu Containerization dan apa pilihan selain hal tersebut? Berangkat dari pertanyaan itu, kami akan membahas sekilas tentang Software Architecture. Setiap pengembangan aplikasi ataupun sistem pasti melewati tahap design, dimana pada fase tersebut akan dilakukan berbagai rancangan-rancangan mengenai apa yang akan dibuat. Rancangan pada fase tersebut tidak terbatas pada rancangan UI/UX saja, tetapi juga rancangan arsitektur dari sistem/aplikasi tersebut. Salah satu software architecture adalah microservices, well pembahasan tentang software architecture mungkin akan kami sajikan pada lain kesempatan.

Apa sih microservices itu?
Secara sederhana arsitektur microservices adalah sebuah rancangan dimana aplikasi tersusun atas banyak fungsi-fungsi (services) yang dapat berdiri sendiri.


Pemisahan fungsi tersebut akan membuat sistem/aplikasi menjadi loose coupled dan highly scalable. Mengapa menjadi highly scalable? Hal tersebut dikarenakan dengan arsitektur microservices kita dapat melalukin scaling sesuai kebutuhan dari masing-masing fungsi/service, sehingga ketika terdapat beberapa service yang butuh scaling maka kita cukup melakukan scaling pada fungsi tersebut saja. Keuntungan lain dari arsitektur seperti ini adalah kita dapat melakukan release aplikasi dengan siklus yang lebih cepat, seperti melakukan release setiap satu service selesai dikembangkan.

Lalu bagaimana antar-services tersebut dapat berkomunikasi? Well secara sistem mereka akan saling berkomunikasi dengan menggunakan interfaces yang telah disediakan pada setiap services, dimana komunikasi tersebut dilakukan menggunakan protokol yang ringan sehingga dapat berlangsung secara cepat, seperti menggunakan JSON/REST maupun ProtoBuff/gRPC.

Setelah membahas sekilas tentang microservices, mari kita masuk ke dalam pembahasan mengenai containerization itu sendiri. Well dalam mengelola aplikasi tentunya kita membutuhkan server, dimana umumnya pada server tersebut kita akan membangun Virtual Machines (VM) yang menjadi pijakan aplikasi kita untuk dapat berjalan. Beberapa tahun terakhir muncul sebuah pendekatan baru yang menjadi pesaing environment VMs tersebut, yaitu teknologi Containerization. Sebenarnya teknologi ini sudah lama ada, namun baru menjadi hype ketika Docker memperkenalkan produk mereka kepada dunia.

Apa sih Containerization itu?
Containerization itu sendiri adalah pendekatan dimana kita menjalankan multiple instances (containers) pada satu Operating System (OS) yang sama, dimana containers tersebut akan memiliki shared kernel.
Serupa dengan VM, dimana pada satu Host OS kita dapat menjalankan berbagai aplikasi lain yang terisolasi dari Host kita. Perbedaan utama antara virtualization dan containerization adalah pada virtualization kita menyalakan OS di dalam OS, sehingga secara resource dan performance akan lebih berat dibandingkan dengan containerization yang melakukan isolasi dari masing-masing aplikasi ke dalam virtual environment dengan shared kernel milik host. Tetapi bukan berarti virtualization adalah teknologi yang buruk, sebenarnya kedua teknologi tersebut memiliki tujuan yang sedikit berbeda. Kalau kita ingin memiliki environment yang sangat terisolasi satu sama lain, maka sebaiknya kita menggunakan VM. Apabila kita tidak perlu isolasi 100% maka containerization bisa menjadi pertimbangan.

Well sekilas sudah kita berbicara tentang arsitektur dan containerization, mari kita mulai membahas Docker. Docker adalah sebuah platform containerization yang sangat populer dan semakin populer. Docker memberikan kemudahan untuk menggunakan ataupun membangun 'isolated' environment untuk aplikasi. Penggunaan containerization dapat membantu kita dalam memahami konsep microservices, dimana satu container hanya untuk satu fungsi saja.



Bagaimana penggunaan Docker itu sendiri?
Docker dapat kita jalankan melalui terminal dengan command yang cukup sederhana, seperti pada gambar berikut.

Menyalakan dan mematikan sebuah container dapat dilakukan dengan command 'start' dan 'stop' melalui command line, demikian juga untuk melihat informasi container apa saja yang sedang berjalan dengan command 'docker ps'. 

Untuk memulai menggunakan Docker pun sesederhana melakukan download dan install docker, kemudian Docker dapat digunakan melalui command line. Serupa dengan virtualization yang membuat VM melalui image dari OS, containerization pada docker pun membutuhkan image untuk dapat menyalakan sebuah containers. Sebagai contoh, untuk dapat menjalankan 'docker start mysql' kita perlu memiliki image dari container tersebut terlebih dahulu, bisa melalui Docker Hub ataupun membuatnya sendiri dengan menggunakan Dockerfile. Setelah memiliki image terkait, kita bisa menjalankannya dengan menggunakan perintah 'docker run', dimana pada momen tersebut kita dapat melakukan berbagai konfigurasi seperti port forwarding, pemberian nama untuk container yang dibuat, bahkan melakukan pengaturan environment variable dari container tersebut.


Demikian hal-hal paling minimum yang perlu diketahui untuk memulai petualangan ke negeri Docker. Masih banyak command pada Docker yang dapat dieksplorasi, seperti 'docker save' dan 'docker load' yang sangat berguna dalam development. Fungsi dua command tersebut sangat sederhana, namun sangat membantu developer dalam satu tim untuk memiliki konfugurasi yang sama. Contoh sederhananya adalah ketika kita mengembangkan aplikasi, kita bisa menggunakan docker container untuk MySQL dan melakukan berbagai konfigurasi terkait database (mungkin mengatur user, privillege, dll). Karena kita menjalankan MySQL Containers, maka dengan menjalankan command 'docker save' kita bisa membagikan image tersebut pada rekan satu tim, sehingga mereka cukup menggunakan 'docker load' dan akan memiliki image dari MySQL containers yang telah dikonfigurasi, sehingga satu tim memiliki environment MySQL yang sama.

Sekian dulu untuk malam ini, semoga bermanfaat.
Selamat melakukan eksplorasi ke negeri Docker!

P.S.
Keuntungan lain dari penggunaan Docker adalah kita dapat menjalankan aplikasi yang mungkin tidak tersedia untuk OS tertentu, seperti tidak tersedianya Oracle Database untuk macOS. Berkat adanya images dari Oracle Database yang berjalan di atas Linux, maka pengguna macOS bisa tersenyum karena hal tersebut berarti macOS dapat menjalankan Oracle Database.






Referensi:
o https://jaxenter.com/containerization-vs-virtualization-docker-introduction-120562.html
o https://www.quora.com/What-is-the-difference-between-Docker-and-Vagrant-When-should-you-use-each-one
o http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-for-creating-an-isolated-environment
o http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/
o https://docs.docker.com
o https://docs.docker.com/engine/reference/run/
o https://docs.docker.com/engine/reference/builder/
o https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/