文章目录
- 极限网关-配置说明
- 配置文件
- 日志、数据目录
- 定义入口
- 定义路由
- 定义流程
- 定义资源
- 使用Demo
- 写入两个ES集群
- 极限网关-常见问题
- shutdown: ORM handler is not registered
- 极限网关地址
极限网关-配置说明
极限网关的大部分配置都可以通过 gateway.yml 来进行配置,配置修改完成之后,需要重启网关程序才能生效。
配置文件
vim /etc/gateway/gateway.yml
日志、数据目录
path.data: data
path.logs: log
定义入口
- 每一个网关都至少要对外暴露一个服务的入口,用来接收业务的操作请求,这个在极限网关里面叫做 entry,通过下面的参数即可定义
entry:- name: es_gatewayenabled: truerouter: defaultnetwork:binding: 0.0.0.0:8000
这里定义了一个名为 es_gateway 的服务入口,监听的地址是 0.0.0.0:8000,使用了一个名为 default 的路由来处理请求。
定义路由
- 极限网关通过路由来判断流量的去向,一个典型的路由配置示例如下:
router:- name: defaultdefault_flow: cache_first
这里定义了一个名为 default 的路由,也就是业务处理的主流程,请求转发、过滤、缓存等操作都在这里面进行。
定义流程
- 一个请求流程定义了一系列请求处理的工作单元,是一个典型的管道式工作方式,一个典型的配置示例如下:
flow:- name: cache_firstfilter:- name: get_cache- name: elasticsearchparameters: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: prodenabled: trueendpoint: http://192.168.3.201:9200discovery:enabled: truerefresh:enabled: truebasic_auth:username: elasticpassword: pass
通过参数 endpoint 来设置 Elasticsearch 的访问地址,如果 Elasticsearch 开启了身份认证,可以通过 basic_auth 来指定用户名和密码信息,该用户需要有能够获取集群状态信息的权限。 通过参数 discover 可以开启自动的后端节点的自动发现,用于自动检测后端节点的情况,能够自动识别新增和离线的节点。
使用Demo
写入两个ES集群
- 提示
flow设置两个es集群时,发送请求会按照顺序执行,比如下面配置查询时会先执行dev再执行prd,通过8000接口返回的数据是最后一个配置返回的结果
path.data: data
path.logs: logentry:- name: es_gatewayenabled: truerouter: defaultnetwork:binding: 0.0.0.0:8000router:- name: defaultdefault_flow: cache_first# 顺序执行,读取写入按照顺序执行
flow:- name: cache_firstfilter:#- name: get_cache- name: elasticsearchparameters:elasticsearch: dev- name: elasticsearchparameters:elasticsearch: prd#- name: set_cache# 对应的ES节点
elasticsearch:
- name: defaultenabled: trueendpoint: http://10.8.10.12:9200
- name: devenabled: trueendpoint: http://10.8.10.12:9200
- name: prdenabled: trueendpoint: http://10.8.10.15:9200modules:
- name: elasticenabled: trueelasticsearch: devstore:enabled: truemonitoring:enabled: falseorm:enabled: trueinit_template: truetemplate_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 registeredgoroutine 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: elasticenabled: trueelasticsearch: devstore:enabled: truemonitoring:enabled: falseorm:enabled: trueinit_template: truetemplate_name: ".gateway-default"index_prefix: "gateway_"