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自动发布

posted @ 2021-06-26 18:59  桀骜石头  阅读(905)  评论(0编辑  收藏  举报