26 February 2012

Menjadikan Apache sebagai Proxy Web Server

Pembaca yang budiman, jika beberapa waktu yang lalu, kita mencoba membuat Web Server Balancer Apache2 dan Tomcat5.5 dengan menggunakan ModJK. Kali ini kita akan mencoba membuat sebuah proxy web server dengan menggunakan Apache2.
Dewasa ini penggunaan Load Balancer ataupun Proxy pada sebuah Web Server adalah sebuah kebiasaan baru dalam rangka menyiasati tingginya pengunjung terhadap sebuah web aplikasi yang kita buat. Proxy atau Load Balancer mampu meringankan kerja sebuah server web aplikasi dengan cara mendistribusikan request-request HTTP terhadap sebuah web aplikasi, sehingga kerja sebuah Web Server menjadi lebih ringan.
Belum lagi banyaknya framework atau web aplikasi yang terkadang didistribusikan secara bundled dengan web server terintegrasi didalamnya. Sehingga amat sangat mungkin dalam satu mesin server kita memiliki begitu banyak web server yang berjalan.
Mari kita mulai percobaan ini. Skenario kita kali ini adalah membuat sebuah Proxy Web Server yang akan menjadi gateway beberapa Web Server lainnya. Dalam percobaan ini saya akan menggunakan sebuah server Apache2 sebagai gateway-nya, sebuah web server Tomcat sebagai salah satu web server aplikasi dan sebuah web server JBoss yang berisi web aplikasi Liferay sebagai salah satu web server aplikasi juga.
Adapun skenario yang akan kita susun seperti dibawah ini:
  1. Web server Apache2 sebagai proxy akan listen pada port 80.
  2. Web server Tomcat akan berisi sebuah aplikasi bernama TestingApp, dan Tomcat ini akan listen pada port 6060. Untuk web aplikasi TestingApp ini, hanya akan berisi sebuah file index.html dengan tulisan "Testing App"  pada tag body-nya, dan sebuah file standar web.xml pada folder WEB-INF. Atau jika pembaca bingung silahkan download file berikut ini dan kemudian extract-lah pada [Tomcat_Install_dir]/webapps/.
  3. Web aplikasi Liferay yang akan dijalankan oleh web server JBoss akan listen pada port 8080.
  4. Semua HTTP request akan menuju pada port 80. Jika alamat URL yang di request oleh client adalah http://localhost/TestingApp maka Apache2 akan meneruskan request tersebut ke web server Tomcat dengan aplikasi TestingApp.
  5. Dan jika alamat URL yang diakses oleh client adalah http://localhost/portal, maka Apache2 akan meneruskan request tersebut ke web server Jboss yang berisi web aplikasi Liferay.
Saya akan mempersingkat langkah-langkah percobaan kali ini dengan cara menganggap pembaca sekalian sudah menginstall ketiga web server tersebut. :P. Sehingga jika kita melakukan testing pada masing-masing server tersebut akan terlihat seperti pada gambar berikut ini:

Testing Apache2

Testing Liferay'portal'


Testing Tomcat 'TestingApp'
Semua web server tersebut sudah berjalan pada port masing-masing. Langkah selanjutnya adalah kita akan membuat semuanya menggunakan port 80 (http default port) dengan cara menjadikan Apache sebagai web server proxy-nya, sehingga jika client mengetikkan URL http://localhost/TestingApp, maka ia akan diarahkan ke web server Tomcat, dan jika client mengetikkan URL http://localhost/portal, maka ia akan diarahkan ke web server JBoss yang berisi web aplikasi Liferay tersebut.
Cara agar Apache2 bisa berlaku sebagai web server proxy adalah dengan meng-enable-kan module mod_proxy.so dan module mod_proxy_http.so. ini bisa dilakukan dengan cara meng-edit file httpd.conf yang ada pada [Apache_install_dir]/conf. seperti contoh berikut ini:

LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so


Dalam konfigurasi tersebut kita membuang tanda # pada dua baris Load Module, yang artinya kita meng-enable-kan dua module tersebut pada Apache2. Langkah selanjutnya adalah kita menambahkan baris-baris berikut ini pada baris terakhir file httpd.conf yang tadi.

ProxyPass /TestingApp http://localhost:6060/TestingApp
ProxyPassreverse /TestingApp http://localhost:6060/TestingApp

ProxyPass /portal http://localhost:8080/portal
ProxyPassreverse /portal http://localhost:8080/portal


Silahkan pembaca pahami sendiri arti dari baris-baris diatas. Setelah semua konfigurasi tersebut kita lakukan, maka langkah selanjutnya adalah kita tinggal me-restart Apache2 yang kita miliki dan cobalah kita akses url-url yang saya contohkan tadi diatas dengan menghilangkan port-portnya, seperti gambar berikut ini.

Testing Tomcat 'TestingApp' tanpa port


Testing JBoss Liferay 'portal' tanpa port
Jika semuanya sudah bisa dilakukan maka, percobaan kita kali ini bisa kita katakan sudah berhasil. Silahkan pembaca gunakan sebagaimana perlunya, dan silahkan di kembangkan sesuai dengan kebutuhan.
Terima kasih dan semoga bermanfaat.

Menteng, 26 Februari 2012

Josescalia
 

21 January 2012

Menggunakan TestNG dalam penggunaan Framework Spring dan Hibernate

Pembaca yang budiman, saat saya menulis artikel ini, saya sudah kurang lebih 2 bulan terdaftar sebagai karyawan baru pada sebuah perusahaan IT Consultant di Jakarta. Tapi bukan itu yang ingin saya share dalam tulisan kali ini. Dalam perusahaan ini, saya diharapkan bisa mengikuti development stack yang berlaku diperusahaan ini. Salah satunya adalah penggunaan Spring Framework dan Hibernate.
Sejak saya mengenal dunia pemrograman Java, terus terang saya akui bahwa saya memang tidak pernah melibatkan framework hibernate sebagai sebuah metode ORM(Object Relational Mapping) dalam development stack project-project yang pernah saya buat. Kalau Spring Framework, saya memang sudah aktif menggunakannya sejak dua tahun lalu. Keadaan ini membuat saya sedikit harus beradaptasi terhadap framework hibernate ini.
Saya sering menemui kesulitan yang sangat menguras emosi jika code-code dalam dao layer yang saya hadapi mulai menggunakan Hibernate Criteria. mungkin bagi pembaca yang biasa menggunakan framework hibernate, Criteria adalah makanan sehari-hari, jadi tidak akan pernah ada kesulitan, saya sangat yakin dengan hal tersebut. Sementara saya, benar-benar baru sentuh framework hibernate ini, jadi buat saya ini sangat menguras emosi saya.
Untuk mengetahui sebuah method dalam dao layer itu sudah berfungsi dengan baik atau belum, terkadang sangat tidak efektif sekali jika saya melakukan test dengan cara mendeploy seluruh aplikasi hanya untuk mengetest sebuah fungsi dao yang saya buat dalam dao layer. Dan akhirnya saya memutuskan untuk mengujji fungsi-fungsi dao layer ini menggunakan unit-test, sehingga saya tidak perlu men-deploy keseluruhan aplikasi.
Oke, dibawah ini adalah langkah-langkah dalam membuat unit test guna pengujian fungsi-fungsi dao layer yang dibuat dengan menggunakan Spring Framework dan Hibernate:
  1. Buat file hibernate configuration, Spring Context, dan semua file pendukung dalam dan letakkan dalam folder test/resources seperti gambar berikut ini:                                                                                                                                                                                                                                                                   
  2. Buat sebuah file bernama TestDao dan letakkan di dalam folder test/java. Adapun isi file tersebut seperti contoh berikut ini: 
 package com.mojo.maven.test;  
   
 import com.mojo.maven.dao.NewsCategoryDao;  
 import com.mojo.maven.dao.NewsDao;  
 import com.mojo.maven.model.News;  
 import com.mojo.maven.model.NewsCategory;  
 import org.apache.log4j.Logger;  
 import org.hibernate.SessionFactory;  
 import org.hibernate.classic.Session;  
 import org.hibernate.context.ManagedSessionContext;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.test.context.ContextConfiguration;  
 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;  
 import org.testng.annotations.AfterMethod;  
 import org.testng.annotations.BeforeMethod;  
 import org.testng.annotations.Test;  
   
 @ContextConfiguration(locations={"classpath*:maven1ApplicationContext-test.xml"})  
 public class TestDao extends AbstractTestNGSpringContextTests{  
   private Logger logger = Logger.getLogger(TestDao.class);  
   
   @Autowired  
   public SessionFactory sessionFactory;  
   private Session session;  
   
   @Autowired  
   private NewsDao newsDao;  
   
   @Autowired  
   private NewsCategoryDao newsCategoryDao;  
   
   /**  
    * Inisialisasi hibernate context sebelum test  
    */  
   @BeforeMethod  
   void init() {  
     logger.debug("init session factory");  
     session = sessionFactory.openSession();  
     ManagedSessionContext.bind(session);  
   }  
   
   /**  
    * cleanup hibernate context setelah test  
    */  
   @AfterMethod  
   void destroy() {  
     logger.debug("destroy session factory");  
     session.close();  
     ManagedSessionContext.unbind(sessionFactory);  
   }  
   
   @Test  
   public void testGetNews(){  
     News news = newsDao.getById(1);  
     logger.info("News ID : " + news.getId());  
     logger.info("News Title : " + news.getNewsTitle());  
     logger.info("News URL : " + news.getNewsUrl());  
     logger.info("News Category : " + news.getNewsCategory().getCategoryName());  
     logger.info("News Category Description : " + news.getNewsCategory().getCategoryDescription());  
   }  
 }  
   
 .......  
 .......  
   

Yang harus kita perhatikan pada class tersebut adalah, class tersebut memiliki annotation @ContextConfiguration dan meng-extends class AbstractTestNGSpringContextTests yang memang diperuntukkan sebagai basis class untuk melakukan test dengan menggunakan Framework TestNG. Dalam annotation @ContextConfiguration didefinisikan pula lokasi dari Spring Context sehingga compiler dapat menemukan letak file Spring Context yang akan digunakan dalam test itu sendiri.
Hal berikutnya yang harus kita perhatikan adalah dua method yang ada dalam class tersebut, yaitu method void init() dan method void destroy(). Pada method void init, diberikan pula annotation @BeforeMethod yang berfungsi sebagai inisialisasi hibernate context sebelum method test lainnya dijalankan. Sementara  method void destroy() diberikan diberikan annotation @AfterMethod yang berfungsi menutup session hibernate setelah method test selesai di eksekusi.
Demikianlah yang bisa saya share untuk sementara ini. Jika memang percobaan diatas dirasakan masih kurang, silahkan pembaca semua mengembangkannya lagi agar lebih sempurna.



Semoga bermanfaat.

Josescalia

04 December 2011

Membuat Sendiri Local Ip Checker dengan Java

Dewasa ini penggunaan wireless atau access point sebagai sebuah rangkaian jaringan komputer merupakan suatu hal yang sudah biasa dan wajar. Bahkan tanpa adanya sebuah wireless router, sebuah jaringan komputer tidaklah lengkap.
Dalam tata cara penggunaannya wireless router ada 2 jenis, yang pertama menerapkan IP statis untuk client-nya dan yang kedua menerapkan IP dinamis untuk client-nya. Penggunaan IP statis maksudnya adalah, perangkat komputer yang akan terhubung dengan sebuah jaringan harus memiliki konfigurasi IP yang dilakukan setting-nya secara manual. Sementara penggunaan IP dinamis, adalah wireless router yang secara otomatis akan memberikan sebuah IP kepada sebuah perangkat pada saat perangkat tersebut hendak terhubung kedalam jaringan yang dimiliki oleh wireless router tersebut.
Penggunaan IP dinamis pada jaringan komputer wireless menerapkan teknologi DHCP (dynamic host configuration protocol), yang memungkinkan kita bisa saja mendapatkan IP berbeda dalam kesempatan melakukan hubungan dengan jaringan tersebut. Maksudnya begini, suatu kali kita terhubung ke jaringan wireless tersebut dan mendapatkan IP address sebagai 192.168.1.100 dan lain waktu kita terhubung kembali dengan jaringan yang sama, bisa saja kita mendapatkan IP address yang lain misalnya 192.168.1.101 dan seterusnya.
Ada kalanya jika perangkat komputer kita terhubung dalam sebuah jaringan komputer wireless berbasis DHCP, kemudian tiba-tiba ada seseorang yang bertanya berapa IP yang kita gunakan, pastinya kita akan cari tahu dengan cara yang khusus, bahkan tidak sedikit dari kita yang malah tidak tahu bagaimana mencari tahu IP address tersebut.
Sekarang mari kita permudah kasus tersebut, dengan cara membuat sebuah program kecil dengan bahasa pemrogaman java yang tugasnya memberi tahu kita, berapa sebenarnya IP address yang sedang kita gunakan dalam jaringan wireless DHCP yang ada. Perhatikan kode berikut ini:

  1. import java.net.InetAddress;
  2. /**
  3. *
  4. * @author Josescalia
  5. */
  6. public class ComputerInfo {
  7. public static void main(String[] args) {
  8. try {
  9. InetAddress ownIP = InetAddress.getLocalHost();
  10. System.out.println("IP Address System ini : " + ownIP.getHostAddress());
  11. } catch (Exception e) {
  12. System.err.print("Exception caught =" + e.getMessage());
  13. }
  14. }
  15. }
Jika kode tersebut di kompilasi kemudian hasil kompilasinya di eksekusi maka program tersebut akan bisa memberi tahu kita berapa IP address yang sedang kita pakai dalam terhubung ke jaringan. Sederhana sekali bukan, tapi amat bermanfaat buat kita yang mungkin senang menggunakan komputer jinjing dan sering berhubungan dengan wireless yang menggunakan DHCP sebagai media penghubung ke jaringan yang ada.
Oke, berdasar dari ide tersebut, saya mencoba membuat program sederhana ini dengan versi desktop yang sudah siap digunakan di sini, itu juga jika mungkin anda juga berkenan menggunakanya :P. Cara menggunakannya adalah dengan meng-klik dua kali file run_program.bat. Dan pastikan Java Runtime Environment versi 1.6 ke atas sudah terinstall dalam komputer anda.
Bagi pembaca yang penasaran dengan kode yang saya buat, silahkan juga download source code-nya dari sini.

 
Semoga bermanfaat.


Menteng, 04 Desember 2011
Josescalia