Spring Cloud Gateway: ตั้งค่าแบบ YML และ Custom Route ด้วย Java
Spring Cloud Gateway คืออะไร?
Spring Cloud Gateway เป็น API Gateway ที่ทำหน้าที่เป็นประตูหน้าบ้าน (entry point) สำหรับระบบ microservices ช่วยในการกำหนดเส้นทาง (Routing), แทรกตัวกรอง (Filter), ตรวจสอบความปลอดภัย, และจัดการโหลดแบบ reactive บนพื้นฐานของ Spring WebFlux
จุดเด่นของ Spring Cloud Gateway คือการรองรับ reactive programming เต็มรูปแบบ รองรับ scalability สูงและ latency ต่ำ เหมาะกับระบบที่ต้องรับส่งคำร้องพร้อมกันจำนวนมาก
การกำหนด Route ใน Spring Cloud Gateway
Spring Cloud Gateway รองรับการตั้งค่า route ได้ 2 รูปแบบหลัก ๆ คือ:
- 1. กำหนดด้วยไฟล์
application.yml
(เหมาะสำหรับ static route) - 2. เขียนด้วย Java Configuration (เหมาะสำหรับ dynamic หรือ logic-based route)
1. การตั้งค่าแบบ YML (Static Route)
เหมาะสำหรับระบบที่มี route คงที่ เปลี่ยนแปลงไม่บ่อย อ่านง่าย และจัดการในรูปแบบ declarative
spring:
cloud:
gateway:
routes:
- id: customer_route
uri: http://localhost:8081
predicates:
- Path=/api/customers/**
filters:
- AddRequestHeader=X-Request-Foo, Bar
- id: order_route
uri: http://localhost:8082
predicates:
- Path=/api/orders/**
ข้อดีของการใช้ YML
- แยกความรับผิดชอบระหว่าง config กับ logic
- ง่ายต่อการ deploy บนระบบ CI/CD
- สามารถตรวจสอบ/เปลี่ยน config โดยไม่ต้องแก้ไข code
ข้อเสียของการใช้ YML
- ต้อง restart application ทุกครั้งเมื่อมีการเปลี่ยนค่า
- ไม่สามารถกำหนด routing logic ที่ซับซ้อนได้
2. การตั้งค่าแบบ Java Code (Dynamic Route)
เหมาะกับ use case ที่ routing มีเงื่อนไขซับซ้อน เช่น การอ่านค่าจากฐานข้อมูล, ใช้ environment variable, หรือ routing ตาม header/payload แบบ runtime
@Configuration
public class GatewayRoutes {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("customer_route", r -> r
.path("/api/customers/**")
.filters(f -> f.addRequestHeader("X-Request-Foo", "Bar"))
.uri("http://localhost:8081"))
.route("order_route", r -> r
.path("/api/orders/**")
.filters(f -> f.addRequestParameter("orderId", "999"))
.uri("http://localhost:8082"))
.build();
}
}
ข้อดีของ Java Config
- ควบคุม logic ได้อย่างละเอียด
- สามารถเขียน route แบบ dynamic ตาม context ที่เปลี่ยนแปลงได้
- ใช้ร่วมกับ Java bean อื่น ๆ ได้ง่าย เช่น service, repository
ข้อเสียของ Java Config
- ไม่เหมาะกับทีม DevOps ที่ไม่ใช่นักพัฒนา
- ต้อง compile ใหม่ทุกครั้งเมื่อมีการเปลี่ยน route
เปรียบเทียบ YML vs Java Route
หัวข้อ | YML Config | Java Code |
---|---|---|
ความง่ายในการอ่าน | ✅ ง่าย | ⚠ ต้องมีพื้นฐาน Java |
ความยืดหยุ่น | ⚠ จำกัด | ✅ สูง |
เหมาะกับ dynamic logic | ❌ | ✅ |
สามารถใช้ร่วมกับ bean/service | ❌ | ✅ |
ต้อง build ใหม่เมื่อเปลี่ยน route | ไม่ต้อง | ต้อง |
บทส่งท้าย
หากระบบของคุณมีเส้นทางการเรียกบริการ (routing) คงที่และไม่เปลี่ยนแปลงบ่อย การใช้ YML จะช่วยให้ระบบสะอาดและง่ายต่อการดูแล
แต่หากคุณต้องการความยืดหยุ่นและสามารถประมวลผล routing logic ที่ซับซ้อนได้ การใช้ Java Config จะช่วยให้คุณควบคุม gateway ได้อย่างเต็มที่
แนะนำ: สำหรับระบบที่ซับซ้อน ใช้ร่วมกันทั้ง 2 รูปแบบได้ โดยกำหนด default route ใน YML และ override บางส่วนด้วย Java