使用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路由埠配置Apache路由
- 前端兩種路由實現和使用場景前端路由
- 使用 navigateTo 實現靈活的路由導航路由
- 使用動態路由實現許可權管理路由
- 使用 Apache Fury 實現極快的序列化Apache
- 高德地圖-地理圍欄功能實現地圖
- 地理探測器R語言實現:geodetectorR語言
- 使用KubernetesIngress來實現類似Istio條件路由路由
- 前端路由實現原理前端路由
- 哪些語言能更優雅地實現裝飾器模式? - frankel模式
- web前端技術分享:使用react實現簡易路由Web前端React路由
- 前端路由實現原理(history)前端路由
- 前端路由的實現原理前端路由
- 利用Elasticsearch實現地理位置、城市搜尋服務Elasticsearch
- 微服務架構 | 12.1 使用 Apache Dubbo 實現遠端通訊微服務架構Apache
- 使用ensp搭建路由拓撲,並使用ospf協議實現網路互通實操路由協議
- 使用ensp搭建路由拓撲,並使用isis協議實現網路互通實操路由協議
- http 框架的路由實現原理HTTP框架路由
- 前端路由的原理和實現前端路由
- Flutter 區域性路由實現Flutter路由
- Hybris UI的Route(路由)實現UI路由
- Apache APISIX透過頁面配置路由ApacheAPI路由
- laravel8路由問題+apache,/根路由報404Laravel路由Apache
- 行業動態 | 通過使用Apache Cassandra實現實時供應鏈管理行業Apache
- Angular 使用 RouteReuseStrategy (路由複用策略) 實現後臺 TAB 標籤Angular路由
- react全家桶實現招聘app-路由實現(二)ReactAPP路由
- 使用Apache Kafka實現從單體到事件驅動微服務 - swlhApacheKafka事件微服務
- 單頁面路由原理及實現路由
- DIY 實現 ThinkPHP 核心框架 (三)路由PHP框架路由
- vue2.0 實現路由守衛Vue路由
- 前端路由原理解析和實現前端路由
- SAP Commerce的路由實現(Route Implementation)路由
- iOS使用核心的50行程式碼實現一個路由元件iOS行程路由元件
- Apache Kyuubi 高可用的雲原生實現Apache
- Apache ShardingSphere 如何實現分散式事務Apache分散式
- 最佳實踐|放棄 Ceph,Salesforce 使用 Apache BookKeeper 在雲中實現最強儲存SalesforceApache
- 用 GoLang 編寫類似 Apache Camel 路由引擎GolangApache路由