Codding Gun

รู้จักกับ Kong API Gateway

Kong ถืิอว่าเป็น API Gateway ที่เป็น Opensource สามารถใช้งานได้ฟรี และยังมี Enterprise Edition หรือ Cloud Service สำหรับองค์กรที่ต้องการทีม Support

API Gateway คืออะไร

API Gateway คือ ประตูที่จะเข้าสู่ API ซึ่งระหว่างที่เดินทางผ่านประตูนี้จะต้อง

นี่อาจเป็นแค่ส่วนหนึ่งในหน้าที่ของ Gateway เท่านั้น ซึ่งลองจินตนาการดูว่าถ้าไม่มี gateway จะเกิดอะไรขึ้น มันก็จะออกมาแบบในรูปซ้ายที่ทุกอย่างต้องทำซ้ำๆ ในแต่ละ project หรือในต่ละ api ซึ่งถ้าต้องตามแก้จะต้องแก้หลายจุด ในขณะที่ในรูปขวาเราจะนำงานที่ redundant(ซ้ำซ้อน) ไปให้ Kong จัดการเวลาแก้ไขเราก็จะแก้ที่เดียวจบเลย

Kong API Gateway
นอกจากเรื่องของ Extensibility(การเพิ่ม services ใหม่ๆเข้ามา) ที่ง่ายขึ้นแล้วเรายังสามารถ scale ได้ง่ายขึ้นมากๆด้วย เพราะแต่ละ services จะมีขนาดเล็กลงเนื่องจากในแต่ละ service จะมีเฉพาะ Business Logic เท่านั้น ไม่ต้องสนใจส่วนที่เป็น Infrastructure

ส่วนประกอบของ Kong API Gateway

  1. Kong Gateway เป็น Core หลักที่ทำหน้าที่เป็น API Gateway ซึ่งจะคอย routing service(ส่ง request ต่อไปยัง upstream service ที่ได้นิยามไว้ใน Configuration) และนอกจากส่ง request ต่อไปยังปลายทางแล้ว plugins ต่างๆก็จะถูกเรียกใช้งานตอนที่มี request วิ่งเข้ามายัง proxy นี้ การใช้งาน Gateway จะเข้าผ่านทาง port

    • 8000 เป็นการเข้าถึงผ่านทาง Http Protocol
    • 8443 เป็นการเข้าถึงผ่านทาง Https Protocol
  2. Kong Database(Optional) การใช้งาน Kong นั้นจะต้องระบุวิธีการจัดเก็บ Configuration ซึ่ง Kong นั้น support อยู่ 2 รูปแบบด้วยกันคือ

    • แบบมี Database หรือ Imperative รูปแบบนี้จะจัดเก็บ Configuration ลงไปใน Database ซึ่ง Kong จะ support แค่ PostgreSQL เท่านั้น
    • แบบ DBless หรือ Declarative รูปแบบนี้จะใช้ config file(นามสกุล .yaml) แทนการใช้ database ซึ่งการเปลี่ยนแปลงหรือ Update เราจะใช้ decK เป็นตัวช่วย
      Database(Imperative) DBLess(Declarative)
      1. เหมาะกับการใช้คนเข้าไปจัดการ 1. เหมาะกับการทำ Automation
      2. ง่าย เหมาะสำหรับผู้เริ่มต้น 2. ต้องคอย sync ให้ kong.yml ตรงกับ Config ใน Database
      3. การแก้ไขทำได้ยากกว่าเมื่อเวลาผ่านไป 3. อ่านไฟล์ kong.yml จะรู้เลยว่ามีการสร้าง routes หรือติดตั้ง plugins ลงไปที่ไหนบ้าง
  3. Kong Management ส่วนนี้เป็นเครื่องมือที่ใช้จัดการ Kong ซึ่งมีอยู่หลายทางเลือกด้วยกัน

    • Kong API เมื่อเราติดตั้ง Kong เราจะได้เฉพาะ Proxy Service ที่ทำหน้าที่เป็น Gateeway เท่านั้นเราจะไม่มี UI มาช่วยในการจัดการ เราต้องคุยกับ API โดยตรง ซึ่งจะเปิดให้บริการอยู่ที่ port
      • 8001 สำหรับเข้าถึง API ด้วย HTTP protocol
      • 8444 สำหรับเข้าถึง API ด้วย HTTPs protocol
    • Kong Manager ถ้าคุณใช้งาน Kong Enterprise คุณจะได้ Kong Manager มาเป็น UI เราจะจัดการ Kong ได้ง่ายขึ้นมากกว่าเดิมมากๆ
    • Konga ในกรณีที่คุณใช้ Community Edition(ของฟรี) คุณต้องใช้ Konga ที่เป็น Open-Source
    • decK จะเป็น Command Line ที่ช่วยจัดการ Kong ในแบบ Declarative

Kong จะประกอบไปด้วย

การเริ่มใช้งาน Kong คุณต้องเข้าใจ 5 องค์ประกอบหลักของ Kong ก่อน

  1. Services เป็นการระบุที่อยู่ของ upstream services(service ที่ให้บริการจริงๆ)

  2. Routes เป็นการระบุเส้นทางเพื่อเข้าถึง upstream services ทีี่เราได้ระบุไว้ในชั้นตอนก่อนหน้า ซึ่งการกำหนด Route สามารถใช้ได้ทั้ง

    • Host เราสามารถใช้ชื่อ Host ในการนำทางได้ เช่น api.example.com
    • Path นอกจากชื่อ Host แล้วเรายังสามารถใช่ path เป็นตัวนำทางได้เช่น api.example.com/customers หรือ api.example.com/users
    • Method ในบางกรณีเราจะใช้ Method ในการนำทาง เช่น CQRS patterns เราจะแยก service ออกเป็น Command service สำหรับการ Insert, Update, Delete และ Query service สำหรับการอ่านหรือการ query(Read-only) ซึ่งตอน implement เราจะใช้การแยก route ด้วย method โดยใช้ Get Method วิ่งเข้าไปที่ Query service ส่วน Method อื่นๆ(Post, Put, Patch, Delete) จะวิ่งเข้าไปยัง Command service
    • Headers เราสามารถกำหนด Route ด้วยข้อมูลที่อยู่ใน Header ได้ เช่น X-API-Version: 2 จะเป็นการ route ไปยัง service version 2 แต่ถ้าไม่มี Header อาจให้วิ่งไปยัง Version 1

    1 Service สามารถมีได้หลาย routes เป็นความสัมพันธ์แบบ One to Many

  3. Plugins เป็นอีกหนึ่งสิ่งที่ทำให้ kong ได้รับความนิยมมากๆ เพราะ plugins ของ Kong นั้นมีเยอะมากๆ ซึ่งจะแบ่งออกเป็น 7 กลุ่มหลักๆ ดังนี้

    1. Authentication กลุ่มนี้ทำหน้าที่ตรวจสอบสิทธืการเข้าใช้งานระบบ ซึ่ง support ทั้ง JWT,OAuth2 และ LDAP
    2. Security กลุ่มนี้จะดูแลเรื่องความปลอดภัยของระบบ เช่น Bot detection, IP restriction หรือการ Enable CORS
    3. Traffic Control plugins ในกลุ่มนี้จะระบุวิธีการส่ง Request ต่อไปยัง upstream service เช่น ทำ Canary Release, Rate Limiting หรือ Request Size Limiting
    4. Serverless เป็นกลุ่มที่ทำหน้าที่เป็นตัวเชื่อมไปยัง Serverless บน Cloud Service Provider เช่น AWS Lambda, Azure Function หรือ Apache OpenWhisk
    5. Transformation เป็น Plugins ที่ทำหน้าที่แปลง Request และ Response ให้อยู่ในรูปแบบที่ต้องการ เช่น CorrelationID สำหรับ Microservices หรือ gRPC Gateway สำหรับแปลง Request ในรูปแบบของ REST ไปเป็น gRPC
    6. Analytics and Monitoring กลุ่มนี้ถือว่ามีความสำคัญกับการจัดการ API มากๆใน Operation Phase เพราะเราต้องนำ Log และ Metric ส่งไปยัง Monitoring Server ซึ่ง Kong support ทั้ง DataDog, Prometheus และ Open Telemetry
    7. Logging เช่นเดียวกับกลุ่มของ Analytics และ monitoring plugins กลุ่มนี้จะทำการส่ง Log ขึ้นไปยัง Logging server ซึ่ง Kong support ทั้ง Filelog, Http Log และ Kafka Log รวมทั้่งสามารถเชื่อมต่อกับ Cloud service ยอดนิยมอย่าง Loggly ได้่อีกด้วย

    ซึ่งจะเห็นว่าความสามารถของ Kong นั้นคือ Plugins ที่สามารถทำงานได้ครอบจักรวาลนี่แหละ

  4. Consumers จะเก็บสิ่งที่สามารถ reference ไปยัง user ได้ซึ่งมีอยู่ 2 ทางเลือกคือ

    • Username เก็บ username ลงไปในระบบเลยตรงๆ
    • CustomID เลือกเก็บ UUID ที่ชี้ไปยัง user แทนและสามารถใช้ Service ID แทน user ที่เป็น Machine ได้อีกด้วย
  5. Upstreams and Targets ในการสร้าง route และ service ใน Gateway จะเป็นการระบุ service ปลายทางแค่ตัวเดียว แต่ถ้าต้องการจะระบุ upstream services มากกว่า 1 ตัว(Load Balancer) เราจะต้องสร้างเป็น upstream และ targets โดยที่เราต้องกำหนด

    • Targets เป็นการระบุที่อยู่ของ upstreaming service แต่ละตัว โดยที่ต้องกำหนด url และ weight(ยิ่งกำหนด weight มาก Load Balancer ก็จะส่ง request เข้ามาที่ service นี้มาก)
    • Upstreams จะเป็นการรวบรวม tagets ให้อยู่ภายใต้ service เดียวกัน และเราจะระบุ algorithm ในการกระจาย load เข้าไปยัง target แต่ละตัว
      Upstream และ Targets
      Load Balancer ใน Kong เราต้องเพิ่ม upstreams และ targets

    อ่านวิธีการทำ Load Balancing ต่อได้ที่นี่

บทความอื่นๆเกี่ยวกับ Kong API Gateway

Phanupong Permpimol
Follow me