Sunday, December 16, 2018

Monitoring, SLA, and Alert in OSB

Di blog kali ini, saya akan berbicara tentang beberapa fitur Out of the Box yang disediakan oleh OSB sehubungan dengan monitoring, SLA agreements, dll. Disini saya akan menjelaskan dasarnya sehingga audiens yang dituju dapat menemukan manfaatnya. 

Pada saat ini saya yakin bahwa anda tahu bahwa ada banyak fungsi yang hanya dapat diterapkan pada console web OSB yang tidak dapat dilakukan melalui IDE.

OSB Monitoring

Digunakan untuk mendapatkan statistik pada format tabel, kita dapat menggunakannya dengan mengaktifkan monitoring pada Proxy Service dan Business Service

Configuring monitoring:

  • Setelah Proxy Service selesai didevelop dan dideploy, start server dan buka OSB Console untuk meng-enable monitoring. (Monitoring hanya dapat dienable melalui sbconsole)
  • Melalui Project Explorer, kemudian pilih Proxy Service yang ingin dienable monitoringnya.
  • Klik pada ProxyService dan kemudian klik pada "Operational Settings" tab.
  • Monitoring - Operational features.
  • Create session menggunakan Change Center.
  • Enable monitoring dengan klik checkbox "Monitoring". Aggregation Interval adalah periode dimana statistik agregat yang terkait dengan service dihitung untuk ditampilkan di dashboard Oracle Service Bus Console. Secara default disimpan pada 10 menit.
  • Update setting-an dan aktivasi session.
  • Setelah dienable, kita dapat melihat monitoring statistik dari dashboard. Klik Operations pada sbconsole, dan list dari semua entity ditampilkan di sisi kanan pada halam bawah tab Service Health.


Defining SLA (Service Level Agreement)

SLA adalah sebuah fitur dari OSB yang digunakan untuk memberikan informasi operasional ketika service berjalan atau tidaknya sesuai ketentuan SLA. Sebagai contoh, waktu eksekusi service tidak boleh berjalan lebih lama dari 50 ms atau service harus dijalankan 500 kali selama periode tertentu.

Manajer SLA memungkinkan pengguna untuk mengkonfigurasi aturan SLA. Hal ini digunakan untuk memonitor pelanggaran SLA dengan bantuan data yang disediakan oleh agregator dan mengirim pemberitahuan yang dikonfigurasi dalam tindakan aturan peringatan.

Berikut ini adalah tujuan dari peraturan peringatan SLA:
  • Peraturan peringatan SLA digunakan untuk menentukan kondisi apa yang akan memicu  sebuah peringatan.
  • SLA Alert Destination digunakan untuk menentukan apa yang harus dilakukan saat kita mendapat alert trigger.
Apa yang akan kita lakukan di bagian berikut adalah mengkonfigurasi aturan Alert (menentukan kondisi berdasarkan peringatan yang dipicu) dan tujuan siaga (yang akan memberitahu OSB apa yang harus dilakukan ketika mendapatkan sebuah peringatan). Sebelum menetapkan ketentuan untuk Alert Rule, penting bahwa kita harus mengkonfigurasi Alert Destination terlebih dahulu.

Sekarang, kita akan melakukan konfigurasi yang akan mengirimkan peringatan yang dipicu melalui email. Cara menetapkan Alert Destination adalah email jika ada pelanggaran SLA. Langkah pertama adalah mengkonfigurasi Alert Destination yang akan kita gunakan dalam peringatan SLA. Dan untuk pemberitahuan email yang berhasil dikirim, kita membutuhkan SMTP Server dalam melakukan konfigurasi. (Hal ini dapat dilakukan melalui IDE atau sbconsole)

Setelah SMTP Server diatur, langkah selanjutnya adalah membuat Alert Destination. Alert Destination pada dasarnya berisi daftar penerima yang akan dikonfigurasi dalam alur Proxy Service. Konfigurasikan Alert Destination dengan memberikan detail yang diperlukan. Di bagian penerima, kita dapat menyebutkan alamat email yang ingin dikirimi alertnya. Selanjutnya, kita menggunakan Alert Destination untuk Level Agreement Alerts. Kita dapat membuat rule pada Business Service.


References:
  • https://docs.oracle.com/middleware/1213/osb/administer/GUID-2EECE6E7-A783-465C-A041-A500CC93FD62.htm#OSBAG2056 
  • http://oraclesoaosbbpmapi.blogspot.com/2017/07/osb-monitoring-configurationslapipeline.html




Getting Started Using ZK Framework



ZK Framework

Hello everyone, Today i will be showing some ZK framework. ZK framework is an open source AJAX Web application framework written in java that enables graphic user interface for web application.

Here some of ZK components you can try at home:




The components above shows how to create user input, the code above shows how to implement it. Using textbox to create an input for user to type and also a button to submit what ever user have entered.






The Components above shows how to implement a textbox and a date field. To implement a textbox you will need <textbox> tag and for the date you will need a <dateBox> tag.





The components above shows how to implements a gird in ZK. First you need to define a <grid> tag, then inside that <grid> tag you will need to add <Columns> first  and inside that tag you will need to add the amount of column  you need. For this example i have 5 column. After the columns has been added, then you can implement the rows. The same way as you add the column you will first add a <rows> tag and inside that tag you will need a <rows> tag.





The components above shows how to create a list of data. Firstly you will need to create a <listhead>, this tag is for creating the title of the list. For this example i have put "Model", "Make" and "Type".
After the <listhead> tag, you will need to create a <listitem> tag. In that list item you will need a <listcell> tag in order to shows the information and also a "label".



The components above shows how to create a tab in ZK. First you need to define <tabbox> tag, inside that tag you will need a <tab> tag, you can implement as much tab as you want, for this example i have put in 3 which are "our product", "Live demo" and "Online Documentation". You can also add a <style> tag to make some customization in your tabs.



These are some components that is in ZK framework and there are plenty more by visiting the ZK official website.
In that website you can get different type of components and you can test them by using ZKfiddle.com or you can try using eclipse to show your result.

Thank you.







Eureka Service Registry Service Discovery


Eureka Serviced Registry and Service Discovery

Hello Everyone, in this blog i will be showing you how to setup Eureka Service Registry using spring-boot.

Eureka service registry and service discovery:

- Is a REST (Representational State Transfer) base service.
- This can used to connect Eureka Server and Eureka Client.
- Eureka can be used as a load balancer
- Being able to monitor your service that has been register

Eureka Architecture



Without Eureka

From the diagram above, this shows when the service is not being registered using Eureka. To obtain the information about the employee, the producer has to use HTTP.get in order to retrieve the information. If the Employee-consumer is down, then the producer would not be able to retrieve the information because the connection between the producer and the consumer has been cut.


With Eureka


From the diagram above, this shows when the services has been registered using Eureka Service Registry.
As you can observed that both services has been registered to Eureka service registry, by doing this method it will improve performance and also making less modification to your code. If for some reason that the Employee-Consumer has failed, then you still be able to retrieve the data because the service has been registry in Eureka Service registry and the Employee-produce still can obtain the data.

How to set up the Eureka Service Registry

For this example i will create 3 maven project:
- Employee Produce 
- Employee Consumer 
- Eureka Server

Each of the maven project, you will need to add these dependencies:





Also you will need to add this java annotation in your main class:




In your Employee-Producer and Employee-Consumer you have to add the following:


You must add a "properties" file in order to register the service to the Eureka Service Registry:


The port number must be the same as the Eureka server port in order to register the service.


And lastly, in your Employee producer and Employee discovery you must have a properties name called "bootsrap.properties" in order to name your service.



in your Eureka Server you need to add a properties file which contain the server port




Result




Once you have those 3 maven project running, you can see the registered service is your Eureka server. The image above shows the registered service that i created which is "EMPLOYEE-CONSUMER" and "EMPLOYEE-PRODUCER"




The code above is how you retrieve the data from the employee-consumer to the employee-customer. Instead of writing the URL Path, you can create this object

List<ServiceInstance> instances=discoveryClient.getInstances("employee-producer");
ServiceInstance serviceInstance=instances.get(0);

String baseUrl=serviceInstance.getUri().toString();

baseUrl=baseUrl+"/employee" 


and add the name of the service you have registered, so for this example i put in the "employee-produce" as the name of my service  and also add which method you wanted to call which is "employee" for this example.



This is the result that i tested using postman. In the employee consumer i made an employee object and added a couple of data. That data is then save in the Eureka Service registry waiting for the employee producer to consume.
Then using postman, i type in the address for the client server to retrieve all the employee data as shown and the retrieving method is by using Eureka Service Registry. 


Introduction Asynchronous Program with CompletableFuture

Apa itu Asynchronous Program?

Asynchronous program adalah cara menulis kode non-pemblokiran dengan menjalankan tugas pada thread yang terpisah (dimana unit kerja berjalan secara terpisah) dari thread aplikasi utama dan memberitahu thread utama tentang progres, penyelesaian, atau kegagalan.

Mari kita pahami dengan sebuah contoh....

Artikel Berita:
Misalnya, kita memiliki produk yang membawa informasi yang relevan kepada pelanggan seperti berita bisnis, informasi saham, dll. Salah satu modul produk ini adalah membuang berita dari berbagai sumber dan memahami kontennya, yang berarti kita akan mengekstraksi berbagai artikel berita, informasi saham dari berbagai sumber, Yahoo, Business Insider, Reuters, dll.

Disini kita perlu menghubungi banyak layanan di internet untuk mendapatkan berita yang relevan bagi pelanggan. Apa yang tidak ingin kita lakukan adalah memblokir proses perhitungan untuk mendapatkan informasi yang relevan dari layanan di atas. Misalnya, kita tidak perlu menunggu data dari Yahoo Finance untuk mulai memproses data yang berasal dari Business Insider. Ini merupakan sisi lain dari multitask-programming. Sebaliknya yang benar-benar ingin kita capai adalah menghindari pemblokiran thread dan membuang-buang komputasi resources sambil menunggu yang mungkin cukup lama untuk mendapatkan sebuah result dari remote service atau dari interogasi basis data.

CompletableFuture

Digunakan untuk pemrograman asynchronous di Java. CompletableFuture diperkenalkan di Java 8 yang menyediakan abstraksi untuk tugas async dalam pemrograman event driven. Ini biasanya ditujukan untuk menjalankan operasi yang berjalan lama (http request, query database, operasi file atau perhitungan yang rumit).

CompletableFuture memiliki 2 manfaat utama:
  • Ini dapat diselesaikan secara eksplisit dengan memanggil method complete() tanpa menunggu yang sinkron. Ini memungkinkan nilai jenis apapun avalaible in future dengan nilai kembalian default, meskipun komputasi tidak selesai, menggunakan hasil default/intermediate results.
  • Dengan puluhan metode baru, juga memungkinkan kita untuk membangun pipeline data process dalam serangkaian action. Kita dapat menemukan sejumlah pola untuk CompletableFutures seperti membuat CompletableFuture dari sebuah task.

Berikut intro dari pengertian Asynchronous dan CompletableFuture, sekarang kita akan memasuki demonstrasi dari Asynchronous Program with CompletableFuture.

Create representasi dari GitHub User

Untuk memodelkan representasi pengguna, kita membuat kelas representasi resources. Menyediakan objek Java biasa fields, constructors, and accessors:

src/main/java/hello/User.java


Spring menggunakan library Jackson JSON untuk mengonversi respon JSON GitHub ke dalam objek User. Anotasi @JsonIgnoreProperties digunakan untuk mengabaikan atribut apapun yang tidak tercantum di kelas. Ini akan membuat kita mudah untuk panggilan REST dan menghasilkan objek domain. Disini kita akan mengambil nama dan URL blog.

Create GitHubLookupService

Selanjutnya, kita perlu membuat sebuah service query GitHub untuk menemukan informasi user.

src/main/java/hello/GitHubLookupService.java


Kelas GitHubLookupService menggunakan Spring's RestTemplate untuk memanggil point REST, lalu mengonversi responnya menjadi objek User. Spring Boot secara otomatis menyediakan RestTemplateBuilder yang mengkustomisasi default dengan bit konfigurasi otomatis (yaitu MessageConverter).

Metode findUser ditandai dengan anotasi @AsyncSpring, yang menunjukkan bahwa proses akan berjalan pada thread yang terpisah. Jenis pengembalian method adalah CompletableFuture<User> sebagai pengganti User, persyaratan untuk asynchronous service. Code ini menggunakan metode completionFuture untuk  mengembalikan instance CompletableFuture yang sudah selesai dengan hasil query GitHub.

Ada juga CommandLineRunner yang meng-inject GitHubLookupService dan memanggil service tersebut 3 kali untuk menunjukkan bahwa method dijalankan secara asynchronous.

src/main/java/hello/AppRunner.java


Kesimpulan:

Kita baru saja mengembangkan service asinkron yang memungkinkan kita untuk meningkatkan multiple calls at once (dapat menjalankan beberapa proses sekaligus).

References:

Building Reactive Rest API using Spring Webflux Part 2

Setelah membahas teori pada blog sebelumnya, pada part 2 ini akan dijelaskan bagaimana membuat reactive rest api menggunakan Spring WebFlux. Pada contoh ini saya akan membuat blog service 

Buatlah project dengan membuka alamat Spring Initializr, dan tambahkan beberapa depedencies sebagai berikut :



  • Reactive Web : Dependency ini untuk Spring WebFlux
  • Reactive MongoDB : Dependency ini untuk reactive driver untuk database MongoDB (NoSQL)
  • Lombok : Dependency ini hanya optional yang digunakan agar tidak perlu membuat setter getter, constructor, toString(), hashCode(), equals() pada class tertentu seperti model atau DTO
Lalu generate project, dan project akan didownload berupa zip, kemudian  extract lalu buka menggunakan Intellij IDEA (Bisa juga eclipse atau NetBeans).

Saya akan membuat reactive rest api dengan 2 cara yaitu menggunakan annotations dan Functional

Menggunakan annotations

Dalam membangun reactive rest api menggunakan Spring WebFlux dapat juga mengikuti stye yang sama seperti Spring MVC yaitu dengan mengunakan annotasi.
Untuk membuat blog service, saya mendefiniskan beberapa kelas dan interface :
  • Blog: Sebuah model class yang merepresentasikan blog pada service ini
  • BlogRepository : Sebuah interface yang nantinya akan men-generate query-query untuk blog menuju dan dari MongoDB
  • BlogServiceImpl  : Sebuah class yang digunakan untuk berinteraksi dengan BlogRepository untuk CRUD ke MongoDB
  • BlogService : Ketika membuat aplikasi, direkomendasikan untuk membuat layer ini sebagai interface antara class controller dan class service impl
Membuat sebuah class model bernama Blog.java 


Class Blog adalah POJO class sederhana yang berisi id, title, content dan author. Ada beberapa anotasi yang digunakan pada class ini diantaranya :
  • @Document : digunakan untuk mengidentifikasi itu sebagai Document MongoDB, Spring Data akan memetakan Document ke Collection di MongoDB
  • @Data : digunakan untuk men-generate setter getter, tostring(), equals() dan hashCode()
Membuat sebuah interface yang bernama BlogRepository.java


BlogRepository adalah interface Spring Data, yang berarti bahwa kita mendefinisikan interface dan Spring Data akan menghasilkan kode yang mengimplementasi interface itu. Pada interface ini, interface ini meng-extends ReacticveMongoRepository, yang mendefiniskan metode-metode reactive yang mengembalikan mono atau flux.
  • Mono<Book> save()
  • Flux<Book> saveAll()
  • Flux<Book> findById()
  • Mono<Boolean> existById()
  • Flux<Book> findAll()
  • Flux<Book> findAllById()
  • Mono<Long> count()
  • Mono<Void> delete()
  • Mono<Void> deleteById()
  • Mono<Void> deleteAll()
  • Flux<Book> insert()
Query method yang mengembalikan satu elemen seperti contohnya findById mengembalikan Mono<Blog>, Query metho yang mengembalikan lebih dari satu elemen seperti findAll mengembalikan Flux<Book> dam metode untuk delete blog mengembalikan Mono<Void> yang artinya tidak ada pengembalian tetapi ketika operasi selesai akan mempublikasikan pemberitahuan jika operasi telah diselesaikan.

Membuat sebuah interface yang bernama BlogService.java


Membuat class bernama BlogServiceImpl.java yang mengimplementasi Blogservice



Anotasi @Service digunakan untuk mengidentifikasi bahwa class ini adalah class service yang mewakili fungsi bisnis Dalam contoh  service diatas, fungsi bisnis hanya melakukan operasi crud ke repository, Jika kita perlu menambahkan logika yang lebih kompleks pada query atau pada object, disinilah kita melakukannya.

Membuat class bernama BlogController.java


Dari code diatas, sekilas tidak ada perbedaan yang signifikan jika dibanding dengan Spring MVC. Satu-satunya perbedaan adalah pada semua method mengembalikan tipe reactive yaitu mono dan flux dan juga menggunakan driver MongoDB yang reactive. Meskipun nyaris tidak ada perbedaan tetapi implementasinya sangat berbeda. Spring WebFlux akan memanggil metode handler, akan menangkap respons secara reactive dan kemudian memanfaatkan Reactor untuk menunggu respons yang akan di publikasikan, semua secara asynchronous.


Kesimpulan :
Spring WebFlux adalah Spring Reactive Framework yang menggunaan library Reactor untuk mengolah request dari web secara asynchronous atau non-blocking. Spring WebFlux diperkenalkan di Spring Framework 5, framework ini akan terus berkembang namun framework dan library-library cukup untuk membangun aplikasi web yang sangat scalable dan reactive.

Sekian pembahasan tentang membangun reactive rest api menggunakan Spring WebFlux, semoga membantu bagi teman-teman yang sedang mempelajari framework ini. Terimakasih :))


Referensi :