INFINI GATEWAY 極限網關初體驗 ElasticSearch 兩個集群數據同步


極限網關-配置說明

極限網關的大部分配置都可以通過 gateway.yml 來進行配置,配置修改完成之后,需要重啟網關程序才能生效。

配置文件

vim /etc/gateway/gateway.yml 

日志、數據目錄

path.data: data
path.logs: log

定義入口

  • 每一個網關都至少要對外暴露一個服務的入口,用來接收業務的操作請求,這個在極限網關里面叫做 entry,通過下面的參數即可定義
entry:
  - name: es_gateway
    enabled: true
    router: default
    network:
      binding: 0.0.0.0:8000

這里定義了一個名為 es_gateway 的服務入口,監聽的地址是 0.0.0.0:8000,使用了一個名為 default 的路由來處理請求。

定義路由

  • 極限網關通過路由來判斷流量的去向,一個典型的路由配置示例如下:
router:
  - name: default
    default_flow: cache_first

這里定義了一個名為 default 的路由,也就是業務處理的主流程,請求轉發、過濾、緩存等操作都在這里面進行。

定義流程

  • 一個請求流程定義了一系列請求處理的工作單元,是一個典型的管道式工作方式,一個典型的配置示例如下:
flow:
  - name: cache_first
    filter:
      - name: get_cache
      - name: elasticsearch
        parameters:
          elasticsearch: prod  
      - name: set_cache

上面的配置定義了一個名為 cache_first 的處理流,使用了三個不同的 filter,分別是 get_cache、elasticsearch 和 set_cache,這些 filter 會依據配置的先后順序依次執行。 各個 filter 的處理結果分別如下:

  • get_cache,這個 filter 主要用來從緩存里面拿數據,如果之前發生過相同的請求,並且緩存還存在且有效的情況下,這個 filter 可以直接拿到緩存然后立即返回,不用繼續往下處理;
  • elasticsearch,這個 filter 主要用來將請求轉發給后端的 Elasticsearch 集群,並且將 Elasticsearch 返回的響應內容繼續往下傳遞;
  • set_cache,這個 filter 會將執行結果緩存到本地內存,有一些參數限制,比如狀態碼,請求大小等,並設置一定的過期時間,以方便下次重復請求可以直接使用緩存,一般要和 get_cache 組合使用。

定義資源

這里的資源主要是指 Elasticsearch 后端服務器資源,極限網關支持多個 Elasticsearch 集群,可以實現將請求轉發到多個不同集群,也可以支持請求的藍綠發布、灰度切換等,定義一個 Elasticsearch 后端資源的方式示例如下:

elasticsearch:
- name: prod
  enabled: true
  endpoint: http://192.168.3.201:9200
  discovery:
    enabled: true
    refresh:
      enabled: true
  basic_auth:
    username: elastic
    password: pass

通過參數 endpoint 來設置 Elasticsearch 的訪問地址,如果 Elasticsearch 開啟了身份認證,可以通過 basic_auth 來指定用戶名和密碼信息,該用戶需要有能夠獲取集群狀態信息的權限。 通過參數 discover 可以開啟自動的后端節點的自動發現,用於自動檢測后端節點的情況,能夠自動識別新增和離線的節點。

使用Demo

寫入兩個ES集群

  • 提示
    flow設置兩個es集群時,發送請求會按照順序執行,比如下面配置查詢時會先執行dev再執行prd,通過8000接口返回的數據是最后一個配置返回的結果
path.data: data
path.logs: log


entry:
  - name: es_gateway
    enabled: true
    router: default
    network:
      binding: 0.0.0.0:8000

router:
  - name: default
    default_flow: cache_first

# 順序執行,讀取寫入按照順序執行
flow:
  - name: cache_first
    filter:
      #- name: get_cache
      - name: elasticsearch
        parameters:
          elasticsearch: dev
      - name: elasticsearch
        parameters:
          elasticsearch: prd
      #- name: set_cache

# 對應的ES節點
elasticsearch:
- name: default
  enabled: true
  endpoint: http://10.8.10.12:9200
- name: dev
  enabled: true
  endpoint: http://10.8.10.12:9200
- name: prd
  enabled: true
  endpoint: http://10.8.10.15:9200

modules:
- name: elastic
  enabled: true
  elasticsearch: dev
  store:
    enabled: true
  monitoring:
    enabled: false
  orm:
    enabled: true
    init_template: true
    template_name: ".gateway-default"
    index_prefix: "gateway_"

  • 通過極限網關創建索引,分別去dev、prd兩個集群查看發現均創建成功
curl -XPUT http://10.8.10.13:8000/test_index_20210625_03 -H 'Content-Type: application/json' -d'
{
  "settings":{
    "number_of_shards":6,
    "number_of_replicas":0
  },
  "mappings":{
      "properties":{
        "account_holder_name":{
          "type":"text",
          "fields":{
            "keyword":{
              "type":"keyword",
              "ignore_above":256
            }
          }
        }
      }
  }
}
'
  • 寫入數據,分別查看兩個集群均寫入成功
curl -XPOST http://10.8.10.13:8000/test_index_20210625_03/_doc/id2 -H 'Content-Type: application/json' -d'
{
  "properties":{
    "account_holder_name":"極限網關測試插入數據"
  }
}
'
  • 查詢數據,返回數據成功。修改最后配置的一個es集群prd數據,再次查詢發現返回的數據也被修改,判斷出返回的數據是最后一個配置的集群prd的數據
curl -XGET http://10.8.10.13:8000/test_index_20210625_03/_doc/id2 -H 'Content-Type: application/json' 

極限網關-常見問題

shutdown: ORM handler is not registered

[06-25 13:54:25] [ERR] [app.go:334] shutdown: ORM handler is not registered

goroutine 1 [running]:
infini.sh/framework.(*App).Shutdown(0xc00023d480)
	/var/lib/jenkins/go/src/infini.sh/framework/app.go:338 +0x243
panic(0xf02600, 0xc00015dae0)
	/usr/local/go/src/runtime/panic.go:679 +0x1b2
infini.sh/framework/core/orm.getHandler(...)
	/var/lib/jenkins/go/src/infini.sh/framework/core/orm/orm.go:216
infini.sh/framework/core/orm.GetIndexName(0xf956a0, 0xc00018eb40, 0xf956a0, 0xc00018eb40)
	/var/lib/jenkins/go/src/infini.sh/framework/core/orm/orm.go:176 +0xdf
infini.sh/framework/modules/elastic.loadESBasedElasticConfig()
	/var/lib/jenkins/go/src/infini.sh/framework/modules/elastic/elastic.go:92 +0xf9
infini.sh/framework/modules/elastic.ElasticModule.Start(0xc000281ee8, 0xc000036628)
	/var/lib/jenkins/go/src/infini.sh/framework/modules/elastic/elastic.go:334 +0x21f
infini.sh/framework/core/module.Start()
	/var/lib/jenkins/go/src/infini.sh/framework/core/module/module.go:87 +0xc80
main.main.func1()
	/var/lib/jenkins/go/src/infini.sh/gateway/main.go:96 +0x662
infini.sh/framework.(*App).Start(0xc00023d480, 0x10133e0, 0x10133e8)
	/var/lib/jenkins/go/src/infini.sh/framework/app.go:261 +0x52a
main.main()
	/var/lib/jenkins/go/src/infini.sh/gateway/main.go:65 +0x35a
  • 原因

沒有引用model

  • 解決方法:

配置文件中加入

modules:
- name: elastic
  enabled: true
  elasticsearch: dev
  store:
    enabled: true
  monitoring:
    enabled: false
  orm:
    enabled: true
    init_template: true
    template_name: ".gateway-default"
    index_prefix: "gateway_"

本篇文章由一文多發平台ArtiPub自動發布


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM