- vừa được xem lúc

Kong Gateway là gì? Dùng Kong Gateway triển khai API Gateway cho hệ thống Microservices

0 0 29

Người đăng: Le Quoc Khoi

Theo Viblo Asia

API Gateway là gì? Tại sao hệ thống microservices lại cần API Gateway?

Thực trạng một Microservices:

API Gateway?

Khi có Gateway API

Lợi ích của việc sử dụng API Gateway

  • Che dấu được cấu trúc của hệ thống microservices với bên ngoài
  • Phần code phía frontend sẽ gọn gàng hơn
  • Dễ dàng theo dõi và quản lý traffic.
  • Requests caching và cân bằng tải.
  • Thêm một lớp bảo mật nữa cho hệ thống.
  • Thay thế authentication services

Bất lợi khi sử dụng API Gateway

  • Tăng thời gian response
  • Có thể gây nghẽn cổ chai
  • Tốn thêm tiền

Kong Gateway

Kong là gì?

Kong Gateway cũng giống như các API Gateway khác, nó nhẹ, được dùng cho microservices, có độ trễ thấp, hiệu suất cao và scalability.

Ưu điểm của Kong

Khả năng mở rộng dễ dàng

Kong server là stateless, chúng ta có thể thêm hoặc xóa bao nhiêu nodes tùy ý, miễn là chúng trỏ vào 1 datastores. Kong Datastore có thể chọn 1 trong 2 loại DB

  • Postgres: khi muốn xây dựng một hệ thống Api Gateway tập chung, đơn giản, hiệu năng tốt. Mặc định thì Kong sẽ sử dụng Postgres làm datastore.
  • Cassandra: Dùng cassandra khi muốn xây dựng một hệ thống api gateway phân tán, tính khả dụng cao, chịu tải tốt, dễ dàng scale. Cassandra sẽ chạy tốt nhất trên các server có cấu hình mạnh.

Hiệu năng khủng

Trong các bài test performance thì Kong là một trong những API Gateway có hiệu năng cao nhất, nó có thể xử lý được một lượng rất lớn requests / s

Nhiều plugins

Kong hỗ trợ rất nhiều plugins tùy vào chức năng như authen, logging, traffic control, analytics & monitoring...giúp quản lý cũng như theo dõi các microservices được hiệu quả và dễ dàng hơn thay vì chỉ đảm nhận mỗi việc routing requests.

Miễn phí

Kong có bản miễn phí, nhưng không có GUI.

Kiến trúc

Object Describe
Service Là ID dùng để tham chiếu đến các API và microservice mà nó quản lý
Routes Điều hướng cách request gửi tới Services khi nó tới API gateway. 1 Service có thể có nhiều Routes
Consumers Đại diện cho end users của API. Nó control ai được access vào API. Nó chó thể ghi log lại
Admin API RESTful API
Plugins Các Plugins tích hợp vào Kong
Rate Limiting plugin Limit số lượng HTTP requests tới trong 1 khoảng thời gian
Proxy Caching plugin Proxy Cache - cái tên nói lên công dụng
Key Auth plugin Có thể thêm key vào Service hoặc Route
Load Balancing Có 2 method là DNS-based or vòng tròn (ring-balancer)

Hiểu được Traffic flow

Mặc định Kong listen port 8000 (HTTP) hoặc 8443 (HTTPS) (có thể config). Nó nhận request API từ client và Routes chúng đến API destination. Trong lúc đó, các policy được áp dụng.

Yêu cầu phần cứng

Size Cấu hình phần cứng Số config Độ trễ Thông lượng Dùng cho
Small CPU 1-2core, RAM 2-4GB < 100 < 100ms < 500 RPS Môi trường Development
Medium CPU 2-4core, RAM 4-8GB < 1000 < 20ms < 2500 RPS Production clusters
Large CPU 8-16core, RAM 16-32GB < 10000 < 10ms < 10000 RPS Mission-critical clusters

Cài đặt

Lưu ý: Kong không work với Postgres 12

# ---------- INSTALL POSTGRESS 9.6 --------------#
yum -y install epel-release wget vim net-tools htop
# Install the repository RPM:
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # Install PostgreSQL:
yum install -y postgresql96-server # Optionally initialize the database and enable automatic start:
/usr/pgsql-9.6/bin/postgresql96-setup initdb
systemctl enable postgresql-9.6
systemctl start postgresql-9.6 sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '_@.com';"
sudo -u postgres psql -c "CREATE USER kong;"
sudo -u postgres psql -c "CREATE DATABASE kong OWNER kong;"
sudo -u postgres psql -c "ALTER USER kong WITH PASSWORD '_@.com';"
rm -rf /var/lib/pgsql/9.6/data/pg_hba.conf
cat <<EOT >> /var/lib/pgsql/9.6/data/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 password
# IPv6 local connections:
host all all ::1/128 password
EOT
systemctl restart postgresql-9.6 # ---------- INSTALL KONG --------------#
# Kong Repo
rm -f /etc/yum.repos.d/bintray-kong-kong-community-edition-rpm.repo
cat <<EOT >> /etc/yum.repos.d/bintray-kong-kong-community-edition-rpm.repo
#bintray--kong-kong-community-edition-rpm - packages by from Bintray
[bintray--kong-kong-community-edition-rpm]
name=bintray--kong-kong-community-edition-rpm
baseurl=https://kong.bintray.com/kong-community-edition-rpm/centos/7
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOT # Install Kong From Repo
yum -y update
yum -y install kong-community-edition cat <<EOT >> /etc/kong/kong.conf
proxy_listen = 0.0.0.0:8003, 0.0.0.0:8443 ssl
admin_listen = 0.0.0.0:8004, 0.0.0.0:8444 ssl database = postgres
pg_host = 127.0.0.1
pg_port = 5432
pg_user = kong
pg_password = _@.com
pg_database = kong
EOT kong migrations bootstrap /etc/kong/kong.conf
ulimit -n 4096
cat <<EOT >> /etc/systemd/system/kongd.service
[Unit]
Description= kong service
After=syslog.target network.target [Service]
User=root
Group=root
Type=forking
ExecStart=/usr/local/bin/kong start -c /etc/kong/kong.conf --vv
ExecReload=/usr/local/bin/kong reload
ExecStop=/usr/local/bin/kong stop [Install]
WantedBy=multi-user.target
EOT
systemctl daemon-reload
systemctl enable kongd
systemctl start kongd

My config

/etc/hosts

127.0.0.1 kongapi kongadmin
proxy_listen = 0.0.0.0:8003, 0.0.0.0:8443 ssl
admin_listen = 0.0.0.0:8004, 0.0.0.0:8444 ssl

Expose your Services with Kong Gateway

Khi cấu hình quyền truy cập vào API, bạn cần phải chỉ định một Services . Trong Kong Gateway, Service là một thực thể đại diện cho external upstream API. Thuộc tính chính của 1 Service là URL Trước khi making request, bạn có thể add Route cho nó. Route là cách thức các yêu cầu được gửi đến Service khi chúng đến với Kong

Add a Service

Service name: get_simple_html
Service API
"curl -i -X POST http://kongadmin:8004/services \ --data name=get_simple_html \ --data url='https://httpbin.org/html'"
Return: 201
End point
http://kongadmin:8004/services/get_simple_html
Route: /html
Route API
curl -i -X POST http://kongadmin:8004/services/get_simple_html/routes \ --data 'paths[]=/html' \ --data 'name=simple_html'
Verify
curl -i -X GET http://kongapi:8003/html -H "accept: text/html"
Route: /simple_html
Route API
curl -i -X POST http://kongadmin:8004/services/get_simple_html/routes \ --data 'paths[]=/simple_html' \ --data 'name=simple_html_2'
Verify
curl -i -X GET http://kongapi:8003/simple_html -H "accept: text/html"

Add a Service

Service name: post_sample
Service API
curl -i -X POST http://kongadmin:8004/services \ --data name=post_sample \ --data url='https://httpbin.org/post'
Return: 200
End point
http://kongadmin:8004/services/post_sample
Route: /post_sample
Route API
"curl -i -X POST http://kongadmin:8004/services/post_sample/routes \ --data 'paths[]=/post_sample' \ --data 'name=post_sample'"
Verify
curl -i -X POST http://kongapi:8003/post_sample -H "accept: application/json"

Rate limiting

Limit 5 time per minute on Route get_simple_html

API
"curl -i -X POST http://kongadmin:8004/routes/simple_html_2/plugins \
--data ""name=rate-limiting"" \
--data ""config.minute=5"" \
--data ""config.policy=local"""
Verify

Request lần thứ 6 sẽ lỗi

curl -i -X GET http://kongapi:8003/simple_html -H "accept: text/html"

Request lần thứ 6 vẫn được vì không rate limit router này.

curl -i -X GET http://kongapi:8003/html -H "accept: text/html"

Limit 5 times per minute on Service post_example

API
"curl -i -X POST http://kongadmin:8004/services/post_sample/plugins \
--data ""name=rate-limiting"" \
--data ""config.minute=5"" \
--data ""config.policy=local"""
Verify
curl -i -X POST http://kongapi:8003/post_sample -H "accept: application/json"

Authentication

Setup Key Authentication on Service post_sample

API
"curl -i -X POST \ --url http://kongadmin:8004/services/post_sample/plugins/ \ --data 'name=key-auth'"
Verify

Lúc này không có key thì không valid được

curl -i -X POST http://kongapi:8003/post_sample -H "accept: application/json"
Return: HTTP/1.1 401 Unauthorized
Create a consumer
"curl -i -X POST \ --url http://kongadmin:8004/consumers/ \ --data ""username=khoiplus&custom_id=khoiplus_id"""
Get Plugin ID
curl -X GET http://kongadmin:8004/services/post_sample/plugins/

Tìm Plugin ID: a03a5575-557d-4ef4-ac5d-035e0f5f3352

Get consumer ID
"curl -i -X GET \ --url http://kongadmin:8004/consumers/ \ --data ""username=khoiplus"""

Tìm consumer ID: khoiplus_id

Create a key
curl -X POST \
http://kongadmin:8004/consumers/khoiplus/key-auth -d 'key=SerectKey'

key là key value là SerectKey

Config
"curl -i -X PATCH \ --url http://kongadmin:8004/plugins/a03a5575-557d-4ef4-ac5d-035e0f5f3352 \ --data ""config.key_names=key"""
Using the Key
curl -i -X POST http://kongapi:8003/post_sample -H "key:SerectKey"

Load balancing

BlueGreenDeployment

CanaryRelease

Demo Load balancer on example_service

Service API
"curl -i -X POST http://kongadmin:8004/services \ --data name=example_service \ --data host='example_service_lb'"
Return: 201
End point
http://kongadmin:8004/services/example_service
Route: /example_service
Route API
"curl -i -X POST http://kongadmin:8004/services/example_service/routes \ --data 'paths[]=/example_service' \ --data 'name=example_service'"
Add a new upstream
"curl -X POST http://kongadmin:8004/upstreams \ --data name=example_service_lb"
Change host on service
"curl -X PATCH http://kongadmin:8004/services/example_service \ --data host='example_service_lb'"
Add target 1 to host
"curl -X POST http://kongadmin:8004/upstreams/example_service_lb/targets \ --data target='mockbin.org:80'"
Add target 2 to host
"curl -X POST http://kongadmin:8004/upstreams/example_service_lb/targets \ --data target='httpbin.org:80'"
Test
curl -i http://kongapi:8003/example_service

IP Restriction

https://docs.konghq.com/hub/kong-inc/ip-restriction/

API

"curl -X POST http://kongadmin:8004/services/get_simple_html/plugins \ --data ""name=ip-restriction"" \ --data ""config.allow=54.13.21.1"" \ --data ""config.allow=143.1.0.0/24"""

Proxy caching

Kong Gateway mang lại hiệu suất cao thông qua bộ nhớ đệm. Caching lưu cache trong Redis

Thiết lập Proxy Caching globally

curl -X POST http://kongadmin:8004/plugins/ \ --data "name=proxy-cache" \ --data "config.cache_ttl=300" \ --data "config.strategy=memory"

Thiết lập Proxy Caching cho Service

curl -i -X POST http://kongadmin:8004/example_service/plugins \
--data name=proxy-cache \
--data config.content_type="application/json" \
--data config.cache_ttl=300 \
--data config.strategy=memory

Thiết lập Proxy Caching cho Route

curl -X POST http://kongadmin:8004/routes/ mocking/plugins \ --data "name=proxy-cache" \ --data "config.cache_ttl=300" \ --data "config.strategy=memory"

Thiết lập Proxy Caching cho Consumer

curl -X POST http://kongadmin:8004/consumers/<consumer>/plugins \ --data "name=proxy-cache" \ --data "config.cache_ttl=300" \ --data "config.strategy=memory"

Xác thực Proxy Cache

curl -i -X GET http://kongadmin:8004/mock/request
Return không có cache
HTTP/1.1 200 OK ... X-Cache-Key: d2ca5751210dbb6fefda397ac6d103b1 X-Cache-Status: Miss X-Content-Type-Options: nosniff ... X-Kong-Proxy-Latency: 25 X-Kong-Upstream-Latency: 37
Return khi có cache
HTTP/1.1 200 OK ... X-Cache-Key: d2ca5751210dbb6fefda397ac6d103b1 X-Cache-Status: Hit ... X-Kong-Proxy-Latency: 0 X-Kong-Upstream-Latency: 1

Xoá bộ nhớ cache

curl -i -X DELETE http://kongadmin:8004/proxy-cache

Hydrid mode

https://docs.konghq.com/2.1.x/hybrid-mode/

Bạn cần một bộ cân bằng tải trước cụm Kong để phân phối traffic. Kong Cluster chỉ là những node Kong dùng chung với nhau 1 cấu hình. Trong Hydrid Mode, Cache không hoạt động. Ở normal, Kong yêu cầu CSDL Postgres, để lưu trữ cấu hình của nó như Routes Services và Plugin. Chế độ Hydrid được gọi là DB-less mode. Control Plane (CP) / Data Plane Separation (DP)

Control Plane (CP)

Nơi config được quản lý và Admin API

Data Plane Separation (DP)

Phục vụ traffic và proxy Mỗi DP node kết nối với 1 trong CP nodes Thay vì vào CSDL load config thì bây giờ DB giữ kết nối với CP để nhận cấu hình mới nhất.

Lợi ích

  • Giảm mạnh lưu lượng truy cập trên CSDL, vì chỉ có CP mới cần kết nối CSDL
  • Tăng cường bảo mật, trong trường hợp DP bị xâm nhập, attacker cũng không làm ảnh hưởng các node khác.
  • Dễ dàng quản lý, admin tương tác với Admin API trên CP node và giám sát trạng thái toàn cụm Kong.

Plugin

https://docs.konghq.com/hub

Log in Kong

/usr/local/kong/logs/

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 500

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 701

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 335

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 421

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414