使用Apache APISIX+Nginx實現地理路由 - frankel

banq發表於2022-11-07

地理路由是根據使用者的物理位置轉發 HTTP 請求,從他們的 IP 推斷。這樣做的原因有很多,這裡有幾個:
有些應用程式確實隨著業務的發展而增長。當這種情況發生時,就會出現對國際化和本地化的需求。
i18n應該由技術棧原生處理,例如在Java中。l10n更多是臨時性的,但也不應該是一個問題。

當業務規則因國家而異時,問題就會出現,主要是由於法律的原因。其他原因包括夥伴關係。想象一下,一個在許多國家有分支機構的電子商務商店。你可以選擇交付夥伴,但根據不同的國家,可用的合作伙伴是不同的。雖然保持單一程式碼庫總是一個明智的選擇,但即使是最好的設計也只能減緩許多業務規則帶來的混亂。在某一時刻,將上帝應用程式拆分成多個依賴國家的應用程式是不可避免的。

有時,你甚至沒有選擇。一個國家決定你必須在他們的領土上儲存你的資料庫,所以你不能再分享它,必須把儲存和應用程式都拆開。2015年,我在俄羅斯親眼目睹了這一點:我們不得不為俄羅斯部署一個定製版本的電子商務應用程式。

最後,你也可能想只為一個國家部署一個新的應用程式版本。在這種情況下,你不應該(只)監測技術指標,而是隨著時間的推移監測業務指標。然後,你將決定是否根據這些指標將新版本擴充套件到其他國家,或者在進一步部署之前對最新版本進行更多的工作。

為地理路由設定 Apache APISIX
Apache APISIX 不提供地理路由,但它建立在 Nginx 之上。後者提供了地理路由功能,儘管不是預設的。
以下說明基於 Docker,以允許每個人都遵循它們,而不管他們的平臺如何。
我們需要幾個步驟來在 Apache APISIX 上設定地理路由:

  1. 建立自定義 Docker 映像
    • 新增所需的庫模組
    • 新增其依賴項
  2. 配置 Apache APISIX

    Nginx 地理路由需要該ngx_http_geoip_module模組。但是如果我們嘗試透過包管理器安裝它,它也會安裝nginx,這與nginx嵌入在 Apache APISIX 中的例項衝突。由於我們只需要這個庫,我們可以從相關的 Docker 映象中獲取它:

    FROM nginx:1.21.4 as geoiplib
    
    FROM apache/apisix:2.15.0-debian
    
    COPY --from=geoiplib /usr/lib/nginx/modules/ngx_http_geoip_module.so \      
                         /usr/local/apisix/modules/ngx_http_geoip_module.so
    


    常規包安裝會安裝所有依賴項,甚至是我們不想要的依賴項。因為我們只複製庫,所以需要手動安裝依賴。這很簡單:

    RUN apt-get update \
     && apt-get install -y libgeoip1
    


    Nginx 提供了兩種啟用模組的方法:透過命令列或在nginx.conf配置檔案中動態啟用。前者是不可能的,因為我們無法控制,所以後者是我們唯一的選擇。為了在啟動時使用模組更新 Nginx 配置檔案,Apache APISIX 在其配置檔案中提供了一個鉤子:

    /usr/local/apisix/conf/config.yaml

    nginx_config:
      main_configuration_snippet: |
        load_module     "modules/ngx_http_geoip_module.so";
    


    以上將生成以下內容:

    /usr/local/openresty/nginx/conf/nginx.conf
    # Configuration File - Nginx Server Configs
    # This is a read-only file, do not try to modify it.
    master_process on;
    
    worker_processes auto;
    worker_cpu_affinity auto;
    
    # main configuration snippet starts
    load_module     "modules/ngx_http_geoip_module.so";
    
    ...
    


    GeoIP 模組依賴於Maxmind GeoIP 資料庫。我們在上一步中隱式安裝了它;我們必須配置模組指向它:

    /usr/local/apisix/conf/config.yaml
    nginx_config:
      http_configuration_snippet: |
        geoip_country   /usr/share/GeoIP/GeoIP.dat;
    



    從此時起,透過 Apache APISIX 的每個請求都是地理定位的。它翻譯為 Nginx 新增額外的變數。根據文件:

    使用此資料庫時可以使用以下變數:
    • $geoip_country_code兩個字母的國家/地區程式碼,例如"RU", "US"。
    • $geoip_country_code3三個字母的國家程式碼,例如"RUS", "USA". $geoip_country_name國家名稱,例如"Russian Federation", "United States"。


    結論
    地理路由是成功的應用程式和業務的必要條件。Apache APISIX 沒有提供開箱即用的功能。在這篇文章中,我展示瞭如何使用 Nginx 的強大功能進行簡單的設定。
    這篇文章的完整原始碼可以在Github上找到。

  3. 相關文章