使用Apache APISIX+Nginx實現地理路由 - frankel
地理路由是根據使用者的物理位置轉發 HTTP 請求,從他們的 IP 推斷。這樣做的原因有很多,這裡有幾個:
有些應用程式確實隨著業務的發展而增長。當這種情況發生時,就會出現對國際化和本地化的需求。
i18n應該由技術棧原生處理,例如在Java中。l10n更多是臨時性的,但也不應該是一個問題。
當業務規則因國家而異時,問題就會出現,主要是由於法律的原因。其他原因包括夥伴關係。想象一下,一個在許多國家有分支機構的電子商務商店。你可以選擇交付夥伴,但根據不同的國家,可用的合作伙伴是不同的。雖然保持單一程式碼庫總是一個明智的選擇,但即使是最好的設計也只能減緩許多業務規則帶來的混亂。在某一時刻,將上帝應用程式拆分成多個依賴國家的應用程式是不可避免的。
有時,你甚至沒有選擇。一個國家決定你必須在他們的領土上儲存你的資料庫,所以你不能再分享它,必須把儲存和應用程式都拆開。2015年,我在俄羅斯親眼目睹了這一點:我們不得不為俄羅斯部署一個定製版本的電子商務應用程式。
最後,你也可能想只為一個國家部署一個新的應用程式版本。在這種情況下,你不應該(只)監測技術指標,而是隨著時間的推移監測業務指標。然後,你將決定是否根據這些指標將新版本擴充套件到其他國家,或者在進一步部署之前對最新版本進行更多的工作。
為地理路由設定 Apache APISIX
Apache APISIX 不提供地理路由,但它建立在 Nginx 之上。後者提供了地理路由功能,儘管不是預設的。
以下說明基於 Docker,以允許每個人都遵循它們,而不管他們的平臺如何。
我們需要幾個步驟來在 Apache APISIX 上設定地理路由:
- 建立自定義 Docker 映像
- 新增所需的庫模組
- 新增其依賴項
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上找到。
相關文章
- 最小可行產品API的實現 - frankelAPI
- Apache CXF實現Web Service(5)—— GZIP使用ApacheWeb
- apache路由埠配置Apache路由
- 電信網路使用路由實現了路由
- 高德地圖-地理圍欄功能實現地圖
- 前端兩種路由實現和使用場景前端路由
- 使用動態路由實現許可權管理路由
- 哪些語言能更優雅地實現裝飾器模式? - frankel模式
- 地理探測器R語言實現:geodetectorR語言
- 使用Apache Ignite實現無死鎖事務Apache
- 使用 Apache Fury 實現極快的序列化Apache
- 前端路由實現原理前端路由
- 使用 navigateTo 實現靈活的路由導航路由
- Vlan間路由實驗(單臂路由實現法)薦路由
- web前端技術分享:使用react實現簡易路由Web前端React路由
- 使用 LDAP 目錄協議實現 Domino 郵件路由LDA協議路由
- 前端路由的實現原理前端路由
- 前端路由實現原理(history)前端路由
- 利用Elasticsearch實現地理位置、城市搜尋服務Elasticsearch
- 使用org.apache.tools.zip實現zip壓縮和解壓Apache
- http 框架的路由實現原理HTTP框架路由
- 前端路由的原理和實現前端路由
- Flutter 區域性路由實現Flutter路由
- Hybris UI的Route(路由)實現UI路由
- ActiveMQ + Camel 實現訊息路由MQ路由
- codeigniter路由實現原理路由
- 使用ensp搭建路由拓撲,並使用isis協議實現網路互通實操路由協議
- 使用ensp搭建路由拓撲,並使用ospf協議實現網路互通實操路由協議
- 使用Apache的Base64類實現Base64加解密Apache解密
- react全家桶實現招聘app-路由實現(二)ReactAPP路由
- Apache APISIX透過頁面配置路由ApacheAPI路由
- laravel8路由問題+apache,/根路由報404Laravel路由Apache
- Angular 使用 RouteReuseStrategy (路由複用策略) 實現後臺 TAB 標籤Angular路由
- 使用KubernetesIngress來實現類似Istio條件路由路由
- 行業動態 | 通過使用Apache Cassandra實現實時供應鏈管理行業Apache
- CentOS 下 Apache + Subversion 實現版本控制CentOSApache
- 用apache JCS實現物件緩衝Apache物件
- Apache中URLRewrite技術的實現Apache