Showing posts with label microservice. Show all posts
Showing posts with label microservice. Show all posts

Friday, September 16, 2016

Memantau aplikasi Java dengan Monit

Latar Belakang


Pertama kali mendengar Monit sekitar setahun yang lalu ketika pertama kali menghadapi aplikasi yang sering crash karena tidak mampu menerima lonjakan request secara tiba-tiba.

Ketika itu senior kami mengenalkan Monit, saat itu kami menggunakan Monit untuk selalu memastikan bahwa aplikasi kami selalu berjalan, dan apabila crash maka Monit akan menjalankannya kembali.

Microservice


Sekarang kami sedang membangun aplikasi berbasis microservice, aplikasi kami memiliki beberapa modul yg memiliki fungsi berbeda. Untuk membantu memonitoring modul-modul tersebut kami mencoba untuk menggunakan Monit.

Sebelum benar-benar menggunakan Monit kami google-google dulu, dan ternyata Monit memiliki fasilitas monitoring, start dan stop dari halaman web. Yeeayyy :)

Instalasi pada ubuntu


Kebetulan kami menggunakan OS ubuntu 14.04 dan 16.04, gunakan command seperti dibawah ini untuk instalasi Monit:
sudo apt-get install monit

Setelah selesai menginstall Monit otomatis akan dijalankan, edit file /etc/monit/monitrc :
 set httpd port 2812 and
     allow 0.0.0.0/0.0.0.0  # allow all host to connect to the server and 
     allow admin:monit      # require user 'admin' with password 'monit' 

Kemudian restart Monit :
  • Ubuntu 16.04
  • sudo systemctl restart monit.services
  • Ubuntu 14.04
  • sudo service monit restart
Setelah restart, bisa cek halaman webnya ke host tersebut dengan port 2182, masukkan username & password bila diminta.

Aplikasi Java dan Monit


Untuk dapat memonitor aplikasi Java dengan Monit, diperlukan shell script untuk start dan stop yang isinya kira-kira sebagai berikut :
  • Start App
  • echo $$ > /home/ubuntu/app/app.pid;
    exec /usr/bin/java -jar app.jar
  • Stop App
  • kill $(cat /home/ubuntu/app/app.pid);
    rm /home/ubuntu/app/app.pid

Kemudian buat file app pada directory /etc/monit/conf.d, yang isinya kira-kira sebagai berikut :
check process app with pidfile /home/ubuntu/app/app.pid
start program = "/home/ubuntu/app/start-app.sh"
stop program = "/home/ubuntu/app/stop-app.sh"
if cpu > 20% for 5 cycles then alert
if totalmem > 256 MB for 5 cycles then alert
if children > 2 then alert
Lalu restart Monit, dan buka web monitoringnya, dan tunggu beberapa saat Monit akan mengecek apakah aplikasi tersebut sedang berhenti atau tidak, bila berhenti maka Monit akan menjalankannya.

Untuk memberhentikan atau menjalankan aplikasi tersebut kita bisa melakukannya melalui web Monit. Sekian dan semoga bermanfaat. :)

Tuesday, March 15, 2016

Implementasi microservice dengan Java EE pada KumuluzEE

Melanjutkan blog sebelumnya, kali ini kita akan membuat REST API menggunakan standar Java EE pada framework KumuluzEE.

  1. Tambahkan modul jax-rs untuk membuat REST
  2. <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-jax-rs</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
  3. Tambahkan modul cdi untuk context dependency injection
  4. <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-cdi</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
  5. Tambahkan modul jpa untuk ORM ke database
  6. <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-jpa</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
  7. Tambahkan library HSQLDB untuk database
  8. <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.3.2</version>
    </dependency>
  9. Tambahkan library Lombok
  10. <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.6</version>
    </dependency>
  11. Tambahkan directory META-INF pada directory resources, dan buat file persistence.xml
  12. <?xml version="1.0" encoding="UTF-8" ?>
    
    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
                 version="2.1">
    
        <persistence-unit name="schools" transaction-type="RESOURCE_LOCAL">
    
            <class>org.nostra.kumuluz.models.Students</class>
    
            <properties>
                <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
                <property name="javax.persistence.jdbc.url"
                          value="jdbc:hsqldb:mem:unit-testing-jpa:9001:blog" />
                <property name="javax.persistence.jdbc.user" value="sa" />
                <property name="javax.persistence.jdbc.password" value="" />
    
                <property name="javax.persistence.schema-generation.database.action" value="create"/>
                <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
                <property name="javax.persistence.schema-generation.drop-source" value="metadata"/>
            </properties>
    
        </persistence-unit>
    </persistence>
  13. Buat domain model Students
  14. @Data
    @Entity
    @NamedQuery(name="Students.findAll", query="SELECT s FROM Students s")
    public class Students {
    
        @Id
        private String id;
    
        private String firstName;
    
        private String lastName;
    
        private Date dob;
    
        @PrePersist
        public void prePersist(){
            id = UUID.randomUUID().toString();
        }
    }
    
  15. Ubah main class App menjadi seperti dibawah ini
  16. @ApplicationPath("/v1/")
    public class App extends javax.ws.rs.core.Application {
    }
    
  17. Buat resource (REST) API untuk Students
  18. @Path("/students")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @RequestScoped
    public class StudentsResource {
    
        @PersistenceContext(unitName = "schools")
        private EntityManager em;
    
        @GET
        public Response getStudents() {
    
            TypedQuery query = em.createNamedQuery("Students.findAll", Students.class);
    
            List studentses = query.getResultList();
    
            return Response.ok(studentses).build();
        }
    
        @GET
        @Path("/{id}")
        public Response getStudents(@PathParam("id") String id) {
    
            Students b = em.find(Students.class, id);
    
            return Response.ok(b).build();
        }
    
        @POST
        public Response createStudents(Students b) {
    
            b.setId(null);
    
            em.getTransaction().begin();
    
            em.persist(b);
    
            em.getTransaction().commit();
    
            return Response.status(Response.Status.CREATED).entity(b).build();
        }
    }
    
  19. Buat file beans.xml pada directory META-INF untuk mengaktifkan context dependency injection
  20. <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
      http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/beans_1_2.xsd"
           bean-discovery-mode="annotated">
    
    </beans>
  21. Kemudian build menggunakan perintah Maven
  22. mvn clean package
  23. Jalankan aplikasi dengan perintah :
  24. java -cp target/classes:target/dependency/* com.kumuluz.ee.EeApplication

Test REST API dengan cara :
  1. Call Http POST method ke http://localhost:8080/v1/students untuk insert data ke database
  2. curl -X POST 'http://localhost:8080/v1/students' \
    -H 'Content-Type:application/json' \
    -d '{"firstName":"agus","lastName":"winarno","dob":"1984-08-17"}'
    
    {
    "id":"c8fe9c5f-3004-419d-b457-706f2ff02ac9",
    "firstName":"agus",
    "lastName":"winarno",
    "dob":461548800000
    }
  3. Call Http GET method atau Buka browser dengan url http://localhost:8080/v1/students
  4. Call Http GET method atau Buka browser dengan url http://localhost:8080/v1/students/{id}
Sekarang kita sudah dapat membuat microservice dengan Java EE API, semoga bermanfaat :)
Bitbucket link :
Referensi :

KumuluzEE

KumuluzEE merupakan framework pertama yang menggunakan standar Java API untuk membangun aplikasi berarsitektur microservice yang dibangun oleh sebuah software house bernama Kumuluz dari Slovenia.

KumuluzEE termasuk salah satu dari pemenang Duke’s Choice Award 2015 di San Fransisco.

Keuntungan dari framework ini untuk Java developer ialah tidak perlu mempelajari hal-hal / cara kerja baru seperti pada umumnya framework Java misalnya Spring, karena KumuluzEE menggunakan standar Java EE specification.

Komponen

Saat ini KumuluzEE sudah memiliki support untuk :
  • Servlet 3.1
  • JSP 2.3
  • EL 3.0
  • CDI 1.2
  • JPA 2.1
  • JAX-RS 2.0
  • Bean Validation 1.1
  • JSON-P 1.0
Dan pada release berikutnya akan mensupport :
  • Websocket 1.1
  • JSF 2.2
  • JAX-WS 2.2

Quick Start

Nah, sekarang kita coba membuat microservice menggunakan KumuluzEE :
  1. Gunakan Maven untuk men-generate project
  2. mvn -B archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DgroupId=org.nostra.kumuluz \
    -DartifactId=blog
  3. Edit file pom.xml, tambahkan properties untuk KumuluzEE
  4. <properties>
        <kumuluzee.version>1.0.0</kumuluzee.version>
    </properties>
  5. Tambahkan modul core dari KumuluzEE
  6. <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-core</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
    Modul core ini belum cukup untuk menjalankan aplikasi. Untuk itu perlu ditambahkan server seperti Jetty/Tomcat untuk menerima request dan diteruskan ke komponen Java EE untuk diproses.
  7. Tambahkan modul servlet jetty dari KumuluzEE
  8. <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-servlet-jetty</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
    Dua modul tersebut merupakan syarat minimum untuk dapat menjalankan microservice dengan standar Servlet dan file statis.
  9. Tambahkan directory webapp pada directory resources, dan buat file index.html
  10. <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <title>Kumuluz</title>
    </head>
    <body>
    <p>Hello from KumuluzEE</p>
    </body>
    </html>
  11. Tambahkan juga plugin maven untuk meng-copy library jar (dependency) ke directory target
  12. <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  13. Kemudian build menggunakan perintah Maven
  14. mvn package
  15. Jalankan aplikasi dengan perintah :
  16. java -cp target/classes:target/dependency/* com.kumuluz.ee.EeApplication
Buka browser dengan url : http://localhost:8080, maka akan tampil file index.html.

Sekian, kita lanjut di blog KumuluzEE berikutnya :)