# Microservices

## What Are Microservices?

> *Microservices* are independently releasable services that are modeled around a business domain

ว่าง่าย ๆ มันคือเราแยก Service ตาม Business domain ให้มันแยกกัน สามารถทำงานแยกกันได้ ซึ่งต่างคนจะต้องต่างทำงานได้เอง แล้วค่อยคุยกันผ่าน Network มันเป็นวิธีการที่เราจะออกแบบ Architecture นึงละกัน

ถ้ามองจากข้างนอก Service ในนั้นแต่ละอันจะเป็นเหมือน Black box ที่มันจะมี business ของมันเอง หมายความว่า **เราจะหลีกเลี่ยงการใช้ Database ร่วมกันให้ได้มากที่สุด**&#x20;

#### Information Hiding

> Hide as much as possible inside a component and exposing little as posible via external interface

ทำให้เราสามารถแยก Service ออกจากกันให้ได้มากที่สุด และถ้ามีอะไรเปลี่ยน ก็เปลี่ยนง่าย กระทบน้อย เพราะเราซ่อน Implementation ไว้ใน Service เหลือให้เห็นแค่ External Interface พอข้างนอกหรือข้างในเปลี่ยนอะไร ถ้า Interface ยังเหมือนเดิม ก็ไม่กระทบไร

Hexagonal Architecture ก็คล้าย ๆ กัน คือแยก External Interface ออกมา ทำให้แอพเราจริง ๆ สามารถรันได้อยู่บนหลาย External Interface&#x20;

#### Service Oriented Architecture กับ Microservice

Service Oriented Architecture (SOA) คือวิธีการดีไซน์ที่เอาหลาย ๆ Service มาทำอะไรบางอย่าง เอาไว้สร้าง Reuusability ของ software เช่น ใน service เดียว มี user ใช้งานได้หลาย application ซึ่งเราสามารถปรับ (replace) service ได้โดยที่ไม่มีใครรู้ ถ้านิยาม (interface) เรายังเหมือนเดิม บางคนอาจจะซอยออกมาเป็น service ย่อย ๆ แยก database กัน แต่ถ้ายัง deploy ทุกอย่างพร้อมกัน ก็ไม่ใช่ microservice อยู่ดี

Microservice จะคล้าย ๆ กัน เป็นวิธีการที่ทำให้เราออกแบบ soa ได้วิธีนึง&#x20;

#### Key concepts

1. Independent Deployability

   คือเราสามารถ change -> deploy -> release โดยที่ไม่ได้ยุ่งกับ service อื่น สามารถ Manage แยกได้&#x20;

   ซึ่งการจะทำแบบนี้ได้มันต้อง loosely coupled มากพอ เราเลยต้อง Explicit, well-defined, stable contracts กับ services ต่าง ๆ ซึ่งการทำแบบนี้เราต้องคิดถึงเรื่อง boundaries ของมันตั้งแต่แรกเลย
2. Modeled Around a Business Domain

   เทคนิคอย่าง DDD ทำให้เราสามารถออกแบบโครงสร้างได้ง่ายขึ้น ซึ่งที่เราจะทำก็คล้ายๆกันก็ได้ในการออกแบบ service boundaries&#x20;

   การจะสร้าง change ในหลาย ๆ service มันแพง ใช้แรงงานมากกว่า single service (หรือ monolith)&#x20;
