Showing posts with label spring. Show all posts
Showing posts with label spring. Show all posts

Sunday, September 9, 2018

Heroku Java




HEROKU?
Heroku merupakan salah satu PAAS (Platform As A Service), yaitu cloud computing service dimana developer diberikan keleluasaan untuk mengatur applications dan data. Sedangkan urusan lain, seperti runtime, middleware, OS, virtualization, servers, storage, dan networking dimaintain oleh vendor (dalam kasus ini heroku). Jadi anda sebagai web developer hanya perlu membuat codes untuk mengatur applications dan data, kemudian codes dideploy pada heroku. Dalam kasus ini heroku bertugas sebagai continuous integration tool.


Kenapa Butuh HEROKU?
Setidaknya ada 3 alasan yang membuat kita membutuhkan heroku. pertama karena kita ingin aplikasi (website) kita terlihat handal dengan menggunakan “.com”. kedua karena kita perlu continuous integration tool untuk menjalankan website. Terakhir, yang merupakan alasan terpenting adalah karena kita tidak punya credit card. 
Note: karena heroku tidak perlu credit card, tentunya heroku punya fitur “FREE”.
Q : Apakah ada PAAS lain yang menyediakan free-trial seperti heroku?
A : Tentu saja ada, tetapi sebagian memerlukan credit card. Misalnya 2 cloud computing service yang sangat terkenal AWS EC2 dan Google Compute Engine, perlu credit card pada free-trial nya.

GCE free-trial needs your credit card

AWS EC2 free-trial needs your credit card


Orang-orang yang Memerlukan bantuan HEROKU
  • Seorang web developer yang memiliki ide bisnis dan ingin menunjukkan dengan transaksi dan sistem yang nyata.
  • Seorang web developer yang ingin CVnya terlihat bagus dengan projects yang dapat diperlihatkan.
  • Seorang web developer yang memiliki pengatahuan devOps rendahan.
  • Seorang web developer yang ingin belajar framework baru dan belajar konsep dasar devOps.

Bagaimana Memanfaatkan Bantuan HEROKU di Java?
1.       Membuat account heroku pada https://signup.heroku.com/dc
2.       Memiliki Java 8 dan Maven 3 yang telah terinstall dengan baik dan benar
3.       Mendownload dan Menginstall Heroku CLI, tetapi Heroku CLI perlu Git. Jadi kita perlu Git yang telah terinstall juga
4.       Clone java project yang dapat dideploy ke heroku dengan menggunakan Git (bisa dengan command atau tools, seperti source tree, git kraken, dll)
Clone Sample Code
5.       Masuk ke directory dari project yang telah di clone
Go to Project Directory
6.       Membuat heroku app, sehingga heroku dapat menerima dan menjalankan code yang telah dideploy. dalam kasus ini kita akan menjalankan contoh code yang baru saja di clone.
Heroku membuat random name secara default, misal yang kita dapatkan adalah “gentle-forest-78670”. Jika ingin mendapatkan nama yang kita tentukan sendiri gunakan command “heroku create <name>”.
Web Interface Before Deploying Code


7.       Deploy code yang sudah di clone
Code Deployment Via CLI

8.       Secara default ketika kita menjalankan step 6, heroku sudah mengaktifkan satu mesin untuk meng-handle service kita, tapi ada baiknya kita meyakinkan bahwa mesin benar-benar sudah aktif.
Activate Service

9.       Cek hasil deploy dengan mengakses URL yang telah diberikan heroku, atau menggunakan shortcut command.
Command to Open Website
Website Interface After Deployment

Misal kita ingin melakukan perubahan, maka kita tinggal ubah code, lalu commit dan push code ke heroku master.
Note: commit dan push disarankan menggunakan CLI, karena memerlukan permission
Change 1 Line of Code
Commit and Push Change
Website Interface After Change


Jadi sebagai web developer, kita dapat melakukan percobaan, pengembangan, riset, dan sebagainya tanpa perlu khawatir dengan urusan devOps dan credit card.


Sunday, September 17, 2017

Optimasi Application Startup pada Aplikasi yang Memiliki Banyak Spring Batch Job

Hi Again, beberapa waktu lalu Nostra udah pernah sharing nih tentang Spring Batch yaitu tentang membaca database dan flat file. Pada kesempatan ini Nostra akan sharing sedikit tentang optimasi waktu (start up time) dari aplikasi yang memiliki banyak Spring Batch Job.

First of all, mari kita bahas gimana sih cara implementasi Spring Batch? Well sesuai dengan instruksi pada Spring.io, langkah paling mudah untuk mengimplementasikan Spring batch adalah dengan menggunakan Spring Boot dan menambahkan dependency sebagai berikut:
Selanjutnya kita perlu menambahkan configuration files untuk masing-masing Spring Batch Job, salah satu contohnya adalah sebagai berikut:
Kemudian jangan lupa untuk menambahkan @EnableBatchProcessing pada Application.java agar proses Spring Batch dapat berjalan.


Quick Facts
Tahukah anda bahwa @EnableBatchProcessing akan menjalankan seluruh Spring Batch Job pada Application Context sebelum Application Started? Tahukah anda bahwa itu akan berefek kepada lamanya proses Starting Application hingga siap digunakan? Tahukah anda apabila anda telah menyusun proses Spring Batch yang akan berjalan sesuai dengan scheduler maka dapat dipastikan scheduler pasti akan berjalan ketika aplikasi dinyalakan?

Mungkin bagi sebagian aplikasi, Quick Facts tersebut bukanlah sebuah masalah tetapi belum tentu untuk sebagian aplikasi lainnya. Sesuai dengan judul, tulisan ini akan membahas bagaimana solusi dari masalah-masalah tersebut.

Solusinya adalah dengan menambahkan konfigurasi pada application.properties maupun application.yaml, sehingga Spring Batch Job tidak akan dijalankan pada waktu menyalakan aplikasi.
Kita dapat melakukannya dengan satu dari dua cara di atas. 

Oh iya Spring Batch juga bisa kita gunakan untuk melakukan inisialisasi data pada DB (database). Akan tetapi jika kita mengimplementasikan dua cara di atas, maka besar kemungkinan proses inisialisasi tersebut tidak berjalan sebagai semestinya.

Mari kita bahas satu per satu.
Solusi pertama akan membuat seluruh Spring Batch Job tidak dijalankan ketika menyalakan aplikasi, bagaimana melakukan proses inisialisasi DB? kita bisa mengakalinya dengan membuat sebuah class baru yang akan memanggil Spring Batch Jobs tersebut.
Mengapa kita menggunakan custom JobParameters? Nice question. The answer is hal tersebut diperlukan untuk menjalankan proses Spring Batch Job ketika job tersebut sudah pernah dijalankan sebelumnya. dengan adanya parameter berupa current time maka setiap Spring Batch Job yang dijalankan akan bersifat unik. Cara lain untuk membuat Spring Batch Job bisa dijalankan ketika sudah ada yang pernah completed adalah dengan menambahkan satu baris pada BatchConfiguration sepert ini.

Kembali ke pembahasan sebelumnya, sekarang mari kita bahas solusi kedua. Solusi kedua memungkinkan kita untuk memilih Job mana saja yang akan dijalankan ketika kita menyalakan aplikasi dengan catatan bahwa Job tersebut bisa dijalankan (dapat dijalankan ketika job yang sama sudah pernah berjalan sebelumnya).

Okay folks, sekian dulu sharingnya tentang optimasi Spring Batch ini. Goodluck!


References:
o http://blog.nostratech.com/2017/03/spring-batch-reading-from-database.html
o http://blog.nostratech.com/2017/03/spring-batch-reading-from-flatfile.html
o http://projects.spring.io/spring-batch/
o https://docs.spring.io/spring-batch/reference/htmlsingle/#domainJob
o https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html






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


Jasper Report - Table from List Java


Pada kesempatan yang lalu saya pernah membahas mengenai penggunaan jasper pada java yang dapat dibaca di sini. Disana saya sudah menjelaskan mengenai bagian- bagian yang terdapat pada jasper. Serta bagaimana penggunaanya pada java

Pada kesempatan beberapa waktu saya berkesempatan bermain kembali dengan jasper dan masih menggunakan java untuk penggunaannya. Pada kesempatan kali ini saya akan memberikan contoh penggunaan jasper menggunakan table dengan javabean datasource.

Table tentunya merupakan bagian yang sering ada pada report. Jasper tentunya juga support dengan fitur ini. Penggunaan table pada jasper sebenarnya sangat mudah apabila menggunakan datasource karena sudah ada wizard untuk hal tersebut. Maka dari itu saya tidak akan membahas penggunaan table pada jasper menggunakan datasource melainkan menggunakan java.

Apabila sebelumnya dengan mengirim list sebagai JRDataSource dan langsung dapat digunakan pada detail band. Untuk menggunakan list pada table data dalam bentuk JRDataSource perlu dikirim sebagai bagian dari param.

Mari kita siapkan template reportnya.
    • Buat parameter pada report dengan nama ObjectDataSource dan Class : net.sf.jasperreports.engine.data.JRBeanCollectionDataSource





    • Membuat sebuah datasource yang akan digunakan pada table ( bisa langsung ketika config tablenya juga )

    •  Ambil table dari pallet dan menjalankan wizardnya seperti berikut




    • Membuat field pada datasource yang digunakan untuk table tersebut sesuai dengan object java kita.



    • Tata dalam table.



    • Setelah selesai saya membersihkan band yang ada pada report dan hanya menyisakan band title dan detail saja. Berikut struktut akhir dari template yang digunakan


    Berikut adalah cara pemanggilan reportnya untuk pembuatan report dalam format pdf dari java.

    
    
        List<SimpleReportVO> detail = new ArrayList<>();    
        SimpleReportVO data1 = new SimpleReportVO();    
        data1.setName("Roti Tawar");    
        data1.setPrice(1000);
    
        detail.add(data1);
    String dest = "D://report/report.pdf"; String template = "D://report-template.jasper"; try{ JRDataSource ds = new JRBeanCollectionDataSource(detail); HashMap params = new HashMap();
            params.put("ObjectDataSource", ds);        
            JasperPrint jp  = JasperFillManager.fillReport(template ,
                    params, new JREmptyDataSource());
            JasperExportManager.exportReportToPdfFile(jp, dest);
        }catch (Exception e){
            logger.info(e.getMessage());    
        }

    Object Java : 
    import lombok.Data;
    
    
    @Data
    public class SimpleReportVO {
        private String name;
        private int price;}

    Hasil darinya seperti berikut :



    Demikian cara penggunaan table pada jasper report dari list java. Semoga berguna..
    Sampai bertemu di kesempatan berikutnya.
    Happy Coding :)


    Sunday, December 18, 2016

    Custom Spring Annotation @PreAuthorize

    Anotasi @PreAuthorize biasanya di pakai untuk memvalidasi token yang digunakan oleh sebuah request saat memanggil REST API. Anotasi ini biasanya dipasang dalam sebuah class rest controller, dan penggunaannya seperti berikut :


    Dalam dokumentasi spring dijelaskan beberapa opsi yang bisa kita gunakan, diantaranya seperti isAuthenticated(), hasRole([role]), permitAll dan lain sebagainya.

    Jika kita perhatikan lebih lanjut pada log aplikasi, sebenarnya @PreAuthorize isAuthenticated() ini melakukan sebuah query dan logic. Dari log mode debug bisa dilihat bahwa isAuthenticated() melakukan query ke tabel access_token untuk mengecek apakah token terdaftar dan expired date nya belum berakhir.


    Dan ternyata kita bisa membuat sebuah method yang bisa di masukan kedalam anotasi @PreAuthorize seperti isAuthenticated(), yaitu dengan cara menambahkan anotasi @Component pada class java yang method nya akan digunakan.

    Berikut contoh implementasinya:


    Bisa dilihat pada code diatas bahwa dalam anotasi @PreAuthorize berisi @nostraEmployee.check('NOSTRA'). Cara penggunaannya adalah dengan menambahkan '@' lalu nama class nya yang diawali dangan huruf lower case, dan selanjutnya '.' diikuti nama methodnya. 
    Dalam contoh kali ini nama class nya adalah NostraEmployee dan method yang ingin digunakan adalah method check, maka isi dari @PreAuthorize adalah "@nostraEmployee.check('NOSTRA')"

    Dan berikut adalah code untuk class NostraEmployee :


    Jadi dengan menambahkan annotation @Component pada suatu class kita bisa menggunakan method didalamnya pada anotasi @PreAuthorize. Dan didalam method tersebut kita bisa menambahkan logic tambahan dalam mengauthentikasi token yang mengakses REST API kita.