目錄
極限網關-配置說明
極限網關的大部分配置都可以通過 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自動發布
