Photo by Garett Mizunaka on Unsplash

ปัญหาหนึ่งของ Java Application อย่าง Spring Boot Web Service ที่ต้องทำงานบน JVM นั้นคือใช้ทรัพยากรของระบบอย่างมาก และเป็นจุดด้อยที่สำคัญมากสำหรับระบบที่ทำงานเป็นแบบ Microservice บน Cloud เพราะทำให้มีค่าใช้จ่ายมาก เมื่อเทียบกับภาษาใหม่อย่าง Golang ที่ compile เป็น machine code ที่ทำงานได้เลยโดยไม่ต้องใช้ Virtual Machine เพื่อให้ Application ทำงานได้ แต่ในโลกของ Java ก็มีเครื่องมือหนึ่งที่สร้างมาเพื่อแก้ปัญหานนี้ นั้นคือ GraalVM โดย Oracle ที่จะทำให้ Java Application ทำงานบน GraalVM และแปลงเป็น machine code และทำงานได้โดยไม่ต้องใช้ JVM ทำให้ใช้ทรัพยากรของระบบลดลงมาก (GraalVM เคลมว่าใช้ memory ลดลง 5 เท่า) ดังนั้น ในบทความนี้จะมาสร้าง Spring Boot Web Service ให้ทำงานบน GraalVM ซึ่งแปลง application ให้เป็น machine code โดยที่ Spring มี Spring Native สร้างมาเพื่อรองรับการทำงานบน GraalVM ด้วย

GraalVM

GraalVM เป็น high-performance runtime ที่มีการปรับปรุงความสามารถและประสิทธิภาพของ application อย่างมีนัยสำคัญ ซึ่งเป็นแนวคิดสำหรับ Microservice โดยที่ออกแบบมาสำหรับ application ที่เขียนด้วย Java, JavaScript และ ภาษาที่เป็น LLVM-based อย่าง C และ C++ รวมทั้ง dynamic language อื่นๆ อีกด้วย…


Photo by Oliver Hale on Unsplash

จากที่ Spring team ได้ ประกาศว่าจะทำโครงการ Spring Authorization Server เมื่อประมาณเมษาปีนี้ (2020) โดยจะแยก OAuth2 Authorization Server ออกจาก Spring Security ทำให้ version ใหม่ๆ ไม่สมารถสร้าง OAuth2 Authorization Server ได้แล้ว และใครที่ใช้อยู่อาจจะต้องยังไม่อัพเดต Spring Security version ใหม่ และรอว่าเมื่อไหร่โครงการนี้จะเสร็จ และแล้วโครงการนี้ก็คลอดมาให้เราลองใช้แต่ยังอยู่ในขั้นทดลองอยู่ และมั่นใจว่าจะออกมา version ที่ใช้งานจริงได้ในไม่ช้านี้

ในบทความนี้จะมาลองใช้งาน Spring Authorization Server ก็ออมาให้ทดลองใช้กัน โดยจะสร้าง OAuth2 Authorization Server ด้วย Spring Authorization Server และ Resource Server ที่จะต้อง authorize ด้วย OAuth2 JWT โดยอ้างอิงจากตัวอย่างที่ Spring Security team สร้างไว้

เท้าความกันหน่อย มาปกป้อง Microservice ด้วย OAuth2 ใน Spring Boot

Create Authorization Server Project

เราใช้ Spring Intializr สร้าง project เลือกเฉพาะ Spring Web และ Spring Security เท่านั้นในตอนสร้าง project เพราะเราจะไปเพิ่ม Spring Authorization Server ทีหลัง ในบทความนี้จะใช้ Gradle project


Photo by Everaldo Coelho on Unsplash

หลายคนพัฒนา Reactive RESTful web service ด้วย Spring WebFlux จำเป็นต้องเลือกใช้ NonSQL database เพราะว่ารองรับ Reactive ไม่สามารถใช้งาน Relational Database อย่าง MySQL หรือ PostgreSQL ได้ แต่ตอนนี้ เราสามารถใช้ R2DBC เป็น ตัวเชื่อมระหว่าง Reactive API กับ Relational DB ได้แล้ว ในบทความนี้จะมาลองใช้งาน R2DBC เชื่อมต่อกับ PostgreSQL อย่างง่ายๆ ดูว่าใช้อย่างไร

R2DBC

ย่อมาจาก Reactive Relational Database Connectivity ซึ่งเป็นตัวเชื่อมต่อระหว่าง Reactive Programming APIs และ Relational Database โดยใช้ Reactive Streams spec รองรับ fully-reactive non-blocking API และรองรับ blocking อย่าง JDBC ซึ่งสามารถทำงานได้กับ SQL Database ได้หลากหลาย และทำให้เปลี่ยนจากโมเดล “one thread per connection” ไปเป็นระบบที่สามารถ scale ได้

เมื่อก่อนเป็น Experiment dependency ของ Spring framework อยู่ แต่ตอนนี้ได้พัฒนาเสร็จสมบูรณ์แล้วและ release มาพร้อม Spring Boot 2.3.0


Photo by Colin Watts on Unsplash

Spring Boot 2.2 เพิ่มการรองรับ feature อย่าง Lazy Initialization ที่จะทำให้เริ่มต้น application ได้เร็วขึ้น ผมก็เลยสงสัยว่ามันจะจริงหรอและอยากจะเข้าใจว่ามันทำได้อย่างไร ในบทความนี้เลยจะมาลองใช้งาน Lazy Initialization ของ Spring Boot กันดู

Lazy Initialization

เป็นเทคนิคสำหรับเลื่อนการสร้าง object ไปจนกว่าจะมีการใช้งานมันจริงๆ ซึ่งใน Spring ก็เป็นการเลื่อนการสร้าง bean จากที่เดิมทีต้องสร้างตอนที่ application เริ่มต้นทำงาน ไปจนกว่า bean นั้นๆ จะมีการเรียกใช้ ก็จะสร้างขึ้น ทำให้มีประโยชน์ตรงที่ตอนเริ่มต้น application จะรวดเร็วกว่าปรกตินิดหน่อย เพราะไม่ต้องสร้าง bean ที่เป็น lazy initialization

ซึ่ง Spring Boot รองรับ Lazy initialization ตั้งแต่ version 2.2.0 เป็นต้นมา ดังนั้นถ้าเราต้องการใช้งาน Lazy initialization ก็ต้องเลือกสร้าง project ที่ใช้ Spring Boot ตั้งแต่ version 2.2.0 เป็นต้นไป

ใน Spring framework ใช้ @Lazy annotation มาระบุว่าจะให้ bean ระดับไหนทำงานแบบ Lazy initialization ซึ่งจะลองใช้งานในตัวอย่าง

ใช้ start.spring.io สร้าง Spring Boot project โดยเลือก Spring Boot version ตั้งแต่ 2.2.0 เป็นต้นไป (ซึ่งในตอนเขียนบทความนี้ version 2.2.5 เป็น version ล่าสุด) และเลือก dependency เป็น Spring Web


Photo by Battlecreek Coffee Roasters on Unsplash

Java Developer อย่างผมยังไม่เข้าใจว่า JVM (Java Virtual Machine) มันโหลด class เข้าไปทำงานได้อย่างไรน๊าา อ่อใช้ Java Class Loader นี่เอง ในบทความนี้จะมาทำความเข้าใจไปด้วยกันว่าไอ้ Java Class Loader เนี๊ยะมันทำงานอย่างไร เพื่อที่จะเป็น Java Developer ที่เข้าใจใน Java มากขึ้น

Java Class Loader

เป็นส่วนหนึ่งของ JRE (Java Runtime Environment) ที่โหลด Java Class ต่างๆ ในขณะทำงาน (Dynamically) ให้กับ JVM โดยทั่วไปแล้ว Class จะถูกโหลดได้ตามความต้องการ (On Demand) เท่านั้น ซึ่งระบบ Java runtime system ไม่จำเป็นต้องรู้เกี่ยวกับ file sytem เพราะใช้ Class Loader

ซึ่ง Java Class จะไม่จำเป็นต้องโหลดทั้งหมดในครั้งเดียว แต่เมื่อจำเป็นต้องใช้ classใดๆ โดยแอพพลิเคชัน ถึงคราวที่ Java Class Loader จะถูกเรียกใช้โดย JRE และ Class Loader จะโหลด class นั้นๆ เข้าไปในหน่วยความจำ dynamic

โดยมีหลักการของ Class Loader ดังนี้

  • Delegate Model — จะส่งต่อการร้องขอการโหลด Class ไปยัง Parent Class Loader โดยที่มันจะโหลด Class ก็ต่อเมื่อ Class Loader แม่ (Parent) หาไม่เจอ
  • Visibility Principle —…


Photo by Muukii on Unsplash

หลากหลาย Application Service จะต้องมีการส่งอีเมล์ (Email) โดยระบบอัตโนมัตเพื่อแจ้งให้ User ทราบเกี่ยวกับบางสิ่งบางอย่าง ดังนั้น Developer ก็จะต้องสร้างระบบที่ส่งอีเมล์ได้ และมีรูปแบบที่หลากความหลากหลาย ซึ่ง Spring framework ก็ได้มีเครื่องมือให้ Developer ได้ใช้งาน นั้นคือ Spring Email ที่เพิ่มเติมจาก Java Mail จะทำให้เราสร้างระบบที่ส่งอีเมล์ได้ และผนวกเข้ากับพลังของ Template Engine อย่าง Thymeleaf ที่ Spring Developer คุ้นเคยก็ทำให้เราสร้างระบบที่ส่งอีเมล์ได้ที่สมบูรณ์ยิ่งขึ้น

ในบทความนี้จึงจะมาลองสร้าง RESTful Service ที่ส่งอีเมล์ได้ ด้วย Spring Boot + Spring Email + Thymleaf กัน

Create Project

เราจะใช้ start.spring.io ในการสร้าง project โดยเลือก dependency เป็น Spring Web , Java Mail Sender และ Thymeleaf


Photo by Jay Clark on Unsplash

หลายคนเขียนโปรแกรมด้วย Java ก็จะรู้จักกับ Gargage Collection ที่ทำงานบน JVM ที่มีประโยชน์อย่างมากในการจัดการหน่วยความจำโดยอัตโนมัติ ในบทความนี้จะมาทำความเข้าใจเกี่ยวกับ Garbage Collection ของ Java กันมากยิ่งขึ้น

Garbage Collection

เป็นกระบวนการจัดการหน่วยความจำโดยอัตโนมัติของการเขียนโปรแกรมด้วย Java ซึ่งจะ compile จาก Java code ไปเป็น bytecode ที่ทำงานบน Java Virtual Machine (JVM) เมื่อโปรแกรมที่ทำงานบน JVM จะมีการสร้าง object บน Heap memory ซึ่งเป็นส่วนของหน่วยความจำที่จัดใว้ให้กับโปรแกรม จนท้ายที่สุดบาง object จะไม่ได้ใช้งาน ดังนั้น Garbage Collection จะหา object ที่ไม่ใช้งานเหล่านี้ และลบออกจากหน่ยวความจำเพื่อทำให้หน่วยความจำส่วนนั้นว่าง


Photo by Leon Contreras on Unsplash

ในการ release project ของ Java นั้นมีเครื่องมือหลากหลายตัวที่สร้างมาเพื่อรองรับการ release นี้ แต่ Maven tools เป็น build tools ที่ใช้งานกันอย่างแพร่หลาย (น่าจะมากที่สุดของ Java) ก็มี plugin ที่มารองรับการ release นี้เช่นกัน ในบทความนี้เราจะมาลองใช้ Maven Release plugin มา release Spring Boot project แบบง่ายๆ ดู

Maven Release Plugin

เป็น plugin ที่ใช้สำหรับการ Release project ด้วย maven ซึ่งเป็น plugin ที่ช่วยเราได้มากสำหรับงานที่เป็นงานที่ทำซ้ำๆ และ งาน manual ซึ่งการ release project ด้วย maven release plugin ประกอบด้วย 2 ขั้นตอน คือ prepare และ perform

ซึ่ง Maven ที่รองรับ Release plugin นี้จะต้องเป็น version 3.0.4 ขึ้นไป เนื่องจากจะมีการตั้งค่าบางอย่างที่เกี่ยวข้อง

เป้าหมายหลักของ Release plugin นี้คือการมี mechanism มาตรฐาน สำหรับการ release project โดยที่จะมีฟังก์ชันพื่นฐานที่จะสร้าง Release และอับเดต SCM ของ project ให้ด้วย

Create Project

ก่อนที่จะลองใช้ Maven Release plugin เราก็ต้องสร้า project ก่อน โดยในบทความนี้จะใช้ Spring Boot project ที่เป็น Maven ซึ่งใช้เป็นโครง…


Photo by JESHOOTS.COM on Unsplash

Strategy Pattern เป็น pattern ตัวสุดท้ายของกลุ่ม Behavioral pattern ของ GoF ที่ผมจะมาทบทวนในซีรี่ย์นี้ เป็น pattern ที่ง่ายและมีประโยชน์มากสำหรับการประยุกต์ใช้งาน กับระบบที่ต้องการความหลากหลายของวิธีแต่ไม่ต้องแก้ไข เสมอๆ ถ้ามีวิธีการใหม่ๆ ที่ต้องใช้ ในบทความนี้ จะทบทวนและใช้ Strategy Pattern แก้ไขปัญหาอะไรได้บ้าง


Photo by Anthony DELANOIX on Unsplash

State Pattern เป็นหนึ่งในกลุ่มของ Behavioral ที่จัดกลุ่มโดย GoF หลายท่านอาจจะเคยได้ใช้ Pattern นี้จัดการสถานะของระบบกันบ้างแล้ว ซึ่งในบทความนี้จะมาทบทวนและทดลองใช้ State Pattern ว่าสามารถแก้ปัญหาอะไรได้บ้าง

Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store