แนวคิดหนึ่งที่น่าสนใจก็คือ Microservice Architecture
เป้าหมายเพื่อออกแบบและสร้างระบบให้แต่ละส่วนแยกกันชัดเจน
เป็นเอกเทศต่อกัน ทั้งในแง่การพัฒนาและติดตั้งระบบ
บางคนอาจจะมองว่านี่มัน SOA ( Service Oriented Architecture ) ก็ได้
แต่ผมว่าไม่ใช่ทั้งหมดนะ
กลับมาดูในโลกของ Java กันหน่อยว่ามี framework อะไรสนับสนุนแนวคิดนี้ไหม ???
ซึ่งหนึ่งในนั้นก็คือ Dropwizard ( Make feature not WAR )
แต่เมื่อขึ้นชื่อว่า framework มันย่อมมีอะไรที่ซ่อนไว้ด้านในมันเยอะอย่างแน่นอน
ดังนั้นมาดูก่อนว่า ข้างในมันมีอะไรบ้าง
แล้วมันเตรียมอะไรไว้ให้เรา
และมันเหมาะกับการนำไปใช้งานหรือไม่
เริ่มต้นมาดูว่า Dropwizrd มันคืออะไร
คือ java framework สำหรับการพัฒนาระบบ RESTful ที่มีประสิทธิภาพสูง
พัฒนาโดยบริษัท Yammer
โดยมันจะพยายามสร้างส่วนที่จำเป็นต่อการสร้าง service คือ
- configuration
- application metric
- logging
- operation tool
- และอื่นๆ อีกมากมาย
ข้างในของ Dropwizard ประกอบไปด้วยอะไรบ้าง
1. Embedded Jetty
เนื่องจากในทุกๆ application ที่สร้างขึ้นมา จะ run ผ่านการ JAR file เท่านั้น
ซึ่งภายในคือ Web application ทำงานบน Jetty
และไม่จำเป็นต้องมีไฟล์ WAR ซึ่งแน่นอนว่า ไม่มีสงครามเกิดขึ้นแน่นอน
ดังนั้นระบบงานที่พัฒนาด้วย Dropwizrd ไม่จำเป็นต้องมีพวก Web Server, Application Server หรือพวก Enterprise Application Server เลยนะ
2. Jersey ( ทำการสร้างตามมาตรฐาน JAX-RS)
สำหรับการสร้าง RESTful web application
ทำให้สามารถสร้าง service จาก Java object ทั่วไป
มีผลให้เราสามารถเขียนระบบได้ง่าย เข้าใจง่าย
และทดสอบระบบได้ง่าย
3. Jackson
สำหรับจัดการข้อมูลในรูปแบบ JSON
ซึ่งทำงานได้รวดเร็ว และใช้งานง่าย
4. Logback และ SLF4J
สำหรับการจัดการ logging ต่างๆ ในระบบ
5. Hibernate Validator
ใช้สำหรับการ validate ข้อมูลเท่านั้น
เช่นความยาวของข้อมูลเป็นต้น
6. Metrics
ใช้สำหรับการ monitoring service ต่างๆ ผ่าน Metric library
เพื่อให้ดูว่าระบบงานแต่ละส่วนทำงานเป็นแกติ หรือมีปัญหาอะไรบ้าง
และยังมี library อื่นๆ มาใช้งานอีก เช่น
- Guava
- Apache HttpClient
- JDBI
- Liquibase
- Freemaker
- Joda Time
ดูเพิ่มเติมได้จากที่ https://dropwizard.github.io/dropwizard/getting-started.html#and-friends
ทำไมต้องเรียนรู้ Dropwizard ด้วยล่ะ ?
1. เริ่มต้นสร้าง project ได้ง่ายมาก เพียงสร้าง maven project และใส่ dependency ตัวเดียวใน pom.xml ก็เริ่มต้นได้เลย
2. มี Application Metric ให้ในตัว ทำให้เราสามารถ monitoring ระบบของเราได้อย่างง่ายดาย
ตรงนี้ถือว่าเป็นความสามารถที่ทำให้มันแจ่มขึ้นหลายเท่าตัว
เช่นเวลาการทำงานของแต่ละ request/response
3. Productivity เนื่องจากมันทำงานบน Embedded Jetty สามารถ run ด้วย java ทั่วไป
ดังนั้นเราไม่ต้องไปผูกติดกับพวกเครื่องมือต่างๆ เช่น IDE, Web server เป็นต้น
รวมทั้งไม่ต้องการ WAR file และไม่ต้องทำการ redeploy เมื่อแก้ไข
ดูเหมือนว่า อะไรๆ ก็ง่ายไปหมด ดังนั้นหยุดอ่าน แล้วลงมือทำกันดีกว่า !!!!
เพื่อให้มันรู้ดำรู้แดงกันไปเลย ….
เริ่มต้นพัฒนาระบบตัวอย่างด้วย Dropwizrd ดีกว่า
ในการเรียนรู้ใช้ Software ดังนี้
- Java 7
- Apache Maven 3
ขั้นตอนการสร้าง project
1. สร้าง Maven project โดยมีเพียงไฟล์ pom.xml ดังนี้
คำอธิบาย
มี dependency ที่กำหนดเพียงตัวเดียว คือ io.dropwizrd
ส่วนที่เหลือคือวิธีการ compile และการ package JAR
เมื่อทุกอย่างเรียบร้อย ลองสั่งให้ Maven ทำการสร้างไฟล์ JAR ด้วยคำสั่ง
$mvn clean package
ผลที่ได้
ในครั้งแรกจะใช้เวลาการทำงานมาก เนื่องจากต้องไป download library ต่างๆ ที่เกี่ยวข้อง
มายังเครื่องของเรา โดยรวมแล้วจะมีประมาณ 59 ไฟล์ (เยอะมากๆ)
Maven จะทำการสร้าง JAR file ขึ้นมา ใน folder /target
2. ต่อมาทำการพัฒนาระบบตัวอย่าง
โดยจะสร้าง RESTful service
ให้เข้าใช้งานผ่าน URI /demo?name=<your name>
แล้วจะให้ส่งค่ากลับมาเป็น JSON message ดังนี้
{“id”:0,”message”:”Hello <your name>”}
ดังนั้นมาเริ่มสร้างตามขั้นตอนของ Dropwizard ดังนี้
2.1 สร้างไฟล์ Configuration ของ service นี้ ซึ่งจะถูกอ่านไปตอนเริ่มต้นการทำงานของ service
โครงสร้างของไฟล์เป็น YAML ดังนี้
คำอธิบาย
กำหนดค่า 2 ส่วนคือ
Server กำหนด port การทำงานของ service ซึ่ง
8080 คือ port การทำงานหลักของ service หรือ application นี้
8081 คือ port การทำงานอื่นๆ เกี่ยวกับการดูแล service เช่น Healthcheck เป็นต้น
Logging กำหนดการจัดการกับ logging message ต่างๆ ใน service
จากตัวอย่างจะแสดง log message ออกมาทาง console
2.2 สร้าง class DemoConfiguration
เพื่อใช้สำหรับอ่านค่าบางอย่างจากข้อ 2.1 เช่น database, template เป็นต้น
แต่ในตัวอย่างนี้ยังไม่ได้ใช้งาน จึงเป็น class ว่างๆ
ทำการ extends จาก class Configuration ดังนี้
2.3 สร้าง class Application
เป็นส่วนการทำงานหลักของ Application/Service ของเรานั่นเอง
ทำการ extends จาก abstract class Application ดังนี้
จะเป็นเพียง class ที่มี method ที่ต้อง implement มาจาก abstract class เท่านั้น
ไม่มีการทำงานใดๆ ทั้งสิ้น
2.4 ทำการสร้าง POJO class สำหรับข้อมูลที่ต้องการส่งกลับ
โดยข้อมูลที่ส่งกลับไปอยู่ในรูปแบบ JSON
ดังนั้นเราสามารถสร้าง POJO class ที่ประกอบไปด้วย property 2 ตัว คือ
id และ message
2.5 สร้าง Resource class สำหรับ Jersey
โดยจะทำการกำหนด endpoint ของ service นั่นเอง
กำหนดให้มี path เข้ามาคือ /demo
และรับ parameter 1 ตัวคือ name
ใน Resource class นี้จะเป็น POJO class ธรรมดา ดังนี้
การทำงานง่ายมากๆ คือเมื่อส่งข้อมูลชื่อเข้ามา
จะนำมาเชื่อมข้อความ Hello เพื่อส่งกลับไปเท่านั้นเอง
2.6 ทำการ Register resource จากข้อ 2.5 ใน Application
แก้ไขในไฟล์ DemoApplication.java ใน method run() ดังนี้
มาถึงตรงนี้โครงสร้างของ project เป็นดังรูป
2.7 เมื่อทุกอย่างเรียบร้อยแล้วทำการสร้างไฟล์ JAR ด้วยคำสั่ง
$mvn clean package
มีผลการทำงานดังนี้
2.8 ทำการ run service ที่สร้างขึ้นมาด้วยคำสั่ง
$java -jar target/demo_dropwizard-0.0.1-SNAPSHOT.jar server demo_config.yml
ผลการทำงานเป็นดังนี้
2.9 ทดสอบการใช้งานผ่าน browser
โดยไปที่ url http://localhost:8080/demo?name=UP1
ผลการทำงานเป็นดังรูป
เพียงเท่านี้ก็สามารถสร้าง RESTful service ขึ้นมาได้แล้ว
โดยไม่ต้องไป deploy บนพวก Web Server, Application Server เลย
สามารถ run ได้อย่างง่ายดาย
แต่มีขั้นตอนการทำงานที่เยอะพอสมควร เนื่องจากมันเป็นขั้นตอนการทำงาน
ที่ถูกกำหนดด้วย framework นั่นเอง
ผลลัพธ์ที่ได้ก็ถือว่า ดูดีใช่ย่อย แต่อย่าเอาไปเทียบกับภาษาอื่นๆ นะ มันคนละเรื่อง
ทำให้เราสนใจเฉพาะไปที่ feature ที่ต้องการพัฒนาจริงๆ
โดยไม่ต้องไปพะวงเรื่องอื่นๆ
Make feature not WAR ….
ปล.
ผลลัพธ์จากการ start service ในข้อ 2.8 บอกอะไรเราบางอย่างนั่นก็คือ
service/application ของเรายังไม่มี Health check นะ
เพื่อให้สำหรับการ monitoring service ของเรานั่นเองว่ายังทำงานปกติหรือไม่
ดังนั้นผมจึงเพิ่มเข้า Health Check แบบง่ายๆ เข้าไป
หลังจากนั้นทำการสร้างไฟล์ JAR และไปทดสอบจะได้ผลดังรูป
สามารถเข้าไปดู code ได้ใน Github :: Demo Dropwizard
ต่อไปมาดูกันว่า หลังจากที่เรียนรู้พื้นฐานแล้ว
เราจะนำไปใช้เพื่อจัดการข้อมูลบน persistence ต่างๆ ได้อย่างไร
เช่น CRUD application เป็นต้น
รวมไปถึงเรื่องการ monitoring, logging และการวัด performance ….
Reference Resources
https://dropwizard.github.io/dropwizard/getting-started.html