มาสร้าง CRUD Microservice ด้วย Micronaut กันเถอะ
ในปัจจุบัน JVM-base framework ที่ใช้สำหรับสร้าง Microservice นั้นมีมากมายและที่เป็นที่นิยมที่สุดก็คือ Spring framework และอื่นๆ แต่ก็มี framework ใหม่ๆ เกิดขึ้นตลอดเวลา และ framework ใหม่ก็มาแรงในช่วงนี้ก็คือ Micronaut ที่ทำให้สร้าง Application ได้ง่ายและข้อดีหลายอย่าง ดังนั้นในบทความนี้จะมาลองใช้ Micronaut ในการสร้าง CRUD Microservice
Micronaut คืออะไร
เป็น JVM-base framework สำหรับสร้าง lightweight, modular application พัฒนาโดย OCI บริษัทเดียวกันที่สร้าง Grails ซึ่ง Micronaut เป็น framework ล่าสุดที่ออกแบบเพื่อสร้าง microservice เร็ว และ ง่าย มาาาากๆ
Micronaut มีคุณสมบัติบางอย่าง ที่เหมือน framework ยอดนิยมอย่าง Spring และมีคุณสมบัติใหม่ๆ อีก โดยเฉพาะอย่างยิ่ง รองรับ Java, Grooby และ Kotlin ด้วย และมีหลายวิธีที่จะสร้าง application
คุณสมบัติหลัก
หนึ่งในคุณสมบัติที่สุดยอดของ Micronaut คือมีกลไลที่สามารถ inject dependency ในขณะ compile time ซึ่ง framework ส่วนใหญ่จะ reflection และ proxy ในตอน run time โดยที่ Micronaut จะ build dependency ของมันในตอน compile time ผลคือทำให้ application มีความเร็วกว่าในการเริ่มต้น (startup) และมีไฟล์ขนาดเล็กกว่า (memory footprints)
อีกหนึ่งคุณสมบัติคือมันเป็น first class รองรับ reactive programming สำหรับทั้ง client และ server และรองรับ reactive implementation อื่นได้ทั้ง RxJava และ Project Reactor
Micornaut มีหลากหลายคุณสมบัติที่ทำให้มันเป็น framework ที่สุดยอดสำหรับพัฒนา clould-native application โดยที่รองรับ service discovery ที่หลากหลาย อย่างเช่น Euraka และ Consul อีกทั้งทำงานได้กับ distributed tracining system ที่แตกต่างกันได้ อย่างเช่น Zipkin และ Jaeger
มาเริ่มกันเลย
ก่อนอื่นจะต้องติดตั้ง Micronaut ก่อน ซึ่งสามารถติดตั้งได้ด้วย SDKMAN ด้วยคำสั่ง
$ sdk install micronaut
อย่าลืมติดตั้ง SDKMAN กันก่อนนะครับ
ซึ่งการติดตั้งจะติดตั้ง binary file ทั้งหมดที่จำเป็นสำหรับการ build, test และ deploy Micronaut applicatoin โดยจะมี CLI มาให้ที่จะทำให้ง่ายต่อการสร้างโปรเจคใหม่
วางแผนกันก่อน
CRUD Microservice ที่จะสร้างขึ้นเป็นเป็น Microservice ที่เก็บข้อมูลของ Customer ดังนั้น จะมี endpoint ที่ดำเนินการกับ customers resource ดังนี้
- GET /customers — เรียกดูรายการ Customer ทั้งหมด
- GET /customers/{id} — เรียกดู Customer โดย user id
- POST /customers — สร้าง Customer ใหม่
- PUT /customers/{id} — แก้ไข Customer โดย user id
- DELETE /customers/{id} — ลบ Customer โดย user id
สร้าง Micronaut Project
มาเริ่มสร้างโปรเจคกันด้วย Micronaut CLI ดังนี้
$ mn create-app com-iphayao-microservice-demo
| Generating Java project.....
| Application created at .../com-iphayao-microservice-demo
โดยคำสั่งนี้จะสร้าง Micronaut project ที่ชื่อว่า com-iphayao-microservice-demo
ซึ่งจะสร้าง package com.iphayao.microservice.demo
ให้ที่เป็น Gradle project เป็นค่าเริ่มต้น แต่เราก็สามารถเลือกใช้ Maven ก็ได้เช่นกัน
และเปิดโปรเจคโดยใช้ IDE นั้นก็คือ IntelliJ IDEA
เพิ่ม dependency ของ Hibernate และ H2 ใน build.gradle
เพื่อใช้ H2 local database และ ORM ด้วย Hibernate
compile "io.micronaut.configuration:hibernate-jpa"
compile "io.micronaut.configuration:hibernate-validator"
compile "io.micronaut.configuration:jdbc-hikari"
runtime "com.h2database:h2:1.4.196"
เนื่องจากจะใช้งาน H2 local database จะต้อง config datasource และ jpa ในไฟล์ application.yml
ดังนี้
สร้าง Customer Entity
เป็น data model สำหรับ Customer
สร้าง Repository Access
โดยสร้าง interface เพื่อระบุ operation สำหรับ access ไปที่ Database
และสร้าง implementation ของ CustomerRepository
สร้าง Customer Controller
สร้าง Controller เพื่อรับ request method ต่างๆ โดยที่เรียก CustomerRepository
ครอบคลุม CRUD operation
ซึ่ง Micronaut จะ inject CustomerRepository
ให้ในตอน compile time ผ่าน constructor ของ CustomerController
และใช้ใน method อื่นๆ
ลอง Run Application
หลังจากที่ได้สร้างส่วนต่างๆ ของ application ไปแล้ว ก็ลอง run application ที่เป็น gradle ด้วยคำสั่ง ./gradlew run
จะเห็นได้ว่า Micronaut จะรันผ่าน random port ดังนั้นเพื่อ fix port สามารถ config ได้ใน application.yml
ด้วยการ uncomment ส่วนของ server
และรอง run ใหม่จะเห็นได้ว่าจะ fix port เป็น 8080
ทดสอบ Microservice
หลังจาก run application แล้วก็มาลองใช้ Postman ทดสอบว่าทำงานได้ตามที่ต้องการไหม โดย request ไปที่ http://localhost:8080/customers
ด้วย body ที่เป็นข้อมูลของ customer
POST /customers
GET /customers/1
PUT /customers/1
DELETE /customers/1
สรุป
จาก Micronaut Microservice (Application) ที่เราได้สร้างขึ้นนั้นทำงานได้เป็นอย่างที่เราวางแผนไว้ ซึ่งการใช้ Micronaut framework นั้นดูแล้วจะง่ายกว่า Spring Boot พอสมควร เพราะใช้ annotation น้อยกว่าและชื่อของ annotation ก็กระชับกว่ามาก แต่สำหรับ Database access application นั้น Micronaut ไม่ได้รองรับมากเท่ากับ Spring framework ที่มี Spring Data ที่มี boilerplate code สำหรับ implementation แบบง่าย ทำให้ต้อง implement Repository ขึ้นมาเอง แต่อย่างไรก็ตาม Micronaut เป็น framework น้องใหม่ที่มาแรงและอาจจะแรงมากๆ ในอนาคตแน่นอน