全新一代API閘道器,帶視覺化管理,文件賊友好!

MacroZheng發表於2021-07-06

SpringBoot實戰電商專案mall(50k+star)地址:github.com/macrozheng/…

摘要

提到API閘道器,大家比較熟悉的有Spring Cloud體系中的Gateway和Zuul,這些閘道器在使用的時候基本都要修改配置檔案或自己開發功能。今天給大家介紹一款功能強大的API閘道器apisix,自帶視覺化管理功能,多達三十種外掛支援,希望對大家有所幫助!

簡介

apisix是一款雲原生微服務API閘道器,可以為API提供終極效能、安全性、開源和可擴充套件的平臺。apisix基於Nginx和etcd實現,與傳統API閘道器相比,apisix具有動態路由和外掛熱載入,特別適合微服務系統下的API管理。

核心概念

我們先來了解下apisix的一些核心概念,對我們接下來的使用會很有幫助!

  • 上游(Upstream):可以理解為虛擬主機,對給定的多個目標服務按照配置規則進行負載均衡。
  • 路由(Route):通過定義一些規則來匹配客戶端的請求,然後對匹配的請求執行配置的外掛,並把請求轉發給指定的上游。
  • 消費者(Consumer):作為API閘道器,有時需要知道API的消費方具體是誰,通常可以用來做身份認證。
  • 服務(Service): 可以理解為一組路由的抽象。它通常與上游是一一對應的,路由與服務之間,通常是多對一的關係。
  • 外掛(Plugin):API閘道器對請求的增強操作,可以對請求增加限流、認證、黑名單等一系列功能。可以配置在消費者、服務和路由之上。

安裝

由於官方提供了Docker Compose部署方案,只需一個指令碼即可安裝apisix的相關服務,非常方便,這裡我們也採用這種方案來部署。

  • 首先下載apisix-docker專案,其實我們只需要使用其中的example目錄就行了,下載地址:github.com/apache/apis…

  • 接下來我們把example目錄上傳到Linux伺服器上去,來了解下這個目錄裡面的東西;
drwxrwxrwx. 2 root root   25 Jun 19 10:12 apisix_conf   # apisix配置檔案目錄
drwxrwxrwx. 2 root root   71 Jun 24 09:36 apisix_log    # apisix日誌檔案目錄
drwxrwxrwx. 2 root root   23 Jun 23 17:10 dashboard_conf  # 視覺化工具apisix-dashboard配置檔案目錄
-rwxrwxrwx. 1 root root 1304 Jun 19 10:12 docker-compose-alpine.yml # docker-compose 部署指令碼(alpine)版本
-rwxrwxrwx. 1 root root 1453 Jun 19 10:12 docker-compose.yml # docker-compose 部署指令碼
drwxrwxrwx. 2 root root   27 Jun 19 10:12 etcd_conf # ectd配置檔案目錄
drwxrwxrwx. 3 root root   31 Jun 23 17:06 etcd_data # ectd資料目錄
drwxrwxrwx. 2 root root  107 Jun 19 10:12 mkcert
drwxrwxrwx. 2 root root   40 Jun 19 10:12 upstream # 兩個測試用的Nginx服務配置
複製程式碼
  • docker-compose.yml中我們可以發現,該指令碼不僅啟動了apisix、apisix-dashboard、etcd這三個核心服務,還啟動了兩個測試用的Nginx服務;
version: "3"

services:
  # 視覺化管理工具apisix-dashboard
  apisix-dashboard:
    image: apache/apisix-dashboard:2.7
    restart: always
    volumes:
    - ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
    ports:
    - "9000:9000"
    networks:
      apisix:
  
  # 閘道器apisix
  apisix:
    image: apache/apisix:2.6-alpine
    restart: always
    volumes:
      - ./apisix_log:/usr/local/apisix/logs
      - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
    depends_on:
      - etcd
    ##network_mode: host
    ports:
      - "9080:9080/tcp"
      - "9443:9443/tcp"
    networks:
      apisix:
  
  # apisix配置資料儲存etcd
  etcd:
    image: bitnami/etcd:3.4.15
    user: root
    restart: always
    volumes:
      - ./etcd_data:/bitnami/etcd
    environment:
      ETCD_ENABLE_V2: "true"
      ALLOW_NONE_AUTHENTICATION: "yes"
      ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
      ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
    ports:
      - "2379:2379/tcp"
    networks:
      apisix:

  # 測試用nginx服務web1,呼叫返回 hello web1
  web1:
    image: nginx:1.19.0-alpine
    restart: always
    volumes:
      - ./upstream/web1.conf:/etc/nginx/nginx.conf
    ports:
      - "9081:80/tcp"
    environment:
      - NGINX_PORT=80
    networks:
      apisix:

  # 測試用nginx服務web2,呼叫返回 hello web2
  web2:
    image: nginx:1.19.0-alpine
    restart: always
    volumes:
      - ./upstream/web2.conf:/etc/nginx/nginx.conf
    ports:
      - "9082:80/tcp"
    environment:
      - NGINX_PORT=80
    networks:
      apisix:

networks:
  apisix:
    driver: bridge
複製程式碼
  • docker-compose.yml檔案所在目錄下,使用如下命令可以一次性啟動所有服務;
docker-compose -p apisix-docker up -d
複製程式碼
  • 啟動成功後,使用如下命令可檢視所有服務的執行狀態;
docker-compose -p apisix-docker ps
複製程式碼
              Name                            Command               State                       Ports                     
--------------------------------------------------------------------------------------------------------------------------
apisix-docker_apisix-dashboard_1   /usr/local/apisix-dashboar ...   Up      0.0.0.0:9000->9000/tcp                        
apisix-docker_apisix_1             sh -c /usr/bin/apisix init ...   Up      0.0.0.0:9080->9080/tcp, 0.0.0.0:9443->9443/tcp
apisix-docker_etcd_1               /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:2379->2379/tcp, 2380/tcp              
apisix-docker_web1_1               /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9081->80/tcp                          
apisix-docker_web2_1               /docker-entrypoint.sh ngin ...   Up      0.0.0.0:9082->80/tcp 
複製程式碼
  • 接下來就可以通過視覺化工具來管理apisix了,登入賬號密碼為admin:admin,訪問地址:http://192.168.5.78:9000/

  • 登入之後看下介面,還是挺漂亮的,apisix搭建非常簡單,基本無坑;

使用

apisix作為新一代的閘道器,不僅支援基本的路由功能,還提供了豐富的外掛,功能非常強大。

基本使用

我們先來體驗下apisix的基本功能,之前已經啟動了兩個Nginx測試服務web1web2,接下來我們將通過apisix的路由功能來訪問它們。

  • 首先我們需要建立上游(Upstream),上游相當於虛擬主機的概念,可以對真實的服務提供負載均衡功能;

  • 建立web1的上游,設定好名稱、負載均衡演算法和目標節點資訊;

  • 再按照上述方法建立web2的上游,建立完成後上游列表顯示如下;

  • 再建立web1的路由(Route),路由可以用於匹配客戶端的請求,然後轉發到上游;

  • 再選擇好路由的上游為web1

  • 接下來選擇需要應用到路由上的外掛,apisix的外掛非常豐富,多達三十種,作為基本使用,我們暫時不選外掛;

  • 再建立web2的路由,建立完成後路由列表顯示如下;

進階使用

apisix通過啟用外掛,可以實現一系列豐富的功能,下面我們來介紹幾個實用的功能。

身份認證

使用JWT來進行身份認證是一種非常流行的方式,這種方式在apisix中也是支援的,可以通過啟用jwt-auth外掛來實現。

  • 首先我們需要建立一個消費者物件(Consumer);

  • 然後在外掛配置中啟用jwt-auth外掛;

  • 啟用外掛時配置好外掛的keysecret

  • 建立成功後消費者列表時顯示如下;

  • 之後再建立一個路由,路由訪問路徑匹配/auth/*,只需啟用jwt-auth外掛即可;

  • 在請求頭Authorization中新增JWT Token後即可正常訪問;

  • 當然apisix支援的身份認證並不只這一種,還有下面幾種。

限流功能

有時候我們需要對閘道器進行限流操作,比如每個客戶端IP在30秒內只能訪問2次介面,可以通過啟用limit-count外掛來實現。

  • 我們在建立路由的時候可以選擇配置limit-count外掛;

  • 然後對limit-count外掛進行配置,根據remote_addr進行限流;

  • 當我們在30秒內第3次呼叫介面時,apisix會返回503來限制我們的呼叫。

跨域支援

如果你想讓閘道器支援跨域訪問的話,可以通過啟用cors外掛來實現。

  • 我們在建立路由的時候可以選擇配置cors外掛;

  • 然後對cors外掛進行配置,配置好跨域訪問策略;

  • 呼叫介面測試可以發現介面已經返回了CORS相關的請求頭。

總結

體驗了一把apisix這個全新一代的API閘道器,有視覺化管理的閘道器果然不一樣,簡單易用,功能強大!如果你的微服務是雲原生的話,可以試著用它來做閘道器。

其實apisix並不是個小眾框架,很多國內外大廠都在使用了,如果你想知道哪些公司在使用,可以參考下面的連線。

github.com/apache/apis…

參考資料

apisix的官方文件非常友好,支援中文,簡直是業界良心!過一遍官方文件基本就能掌握apisix了。

官方文件:apisix.apache.org/zh/docs/api…

專案原始碼地址

github.com/apache/apis…

本文 GitHub github.com/macrozheng/… 已經收錄,歡迎大家Star!

相關文章