配置
上一篇我们先学习了极限网关的安装和启动,今天学习配置。
读写分离
现在我们遇到读写分离的需求,用网关该怎么做呢?
假设服务端现在从 http://127.0.0.1:8000 写入数据,从 http://127.0.0.1:9000 读取数据,怎么设计呢?
首先查看文档配置文档
我们在 gateway.yml 中定义两个 entry,分别绑定不同的端口,配置不同的 router
entry:
- name: write_es
enabled: true
router: write_router
network:
binding: 0.0.0.0:8000
- name: read_es
enabled: true
router: read_router
network:
binding: 0.0.0.0:9000
router:
- name: write_router
default_flow: default_flow
tracing_flow: logging
- name: read_router
default_flow: default_flow
tracing_flow: logging
为了演示效果,只配置一个 Elasticsearch
elasticsearch:
- name: dev
enabled: true
schema: http
hosts:
- 192.168.3.188:9206
启动项目
我们从 http://127.0.0.1:8000 写入一条数据,再从 http://127.0.0.1:9000 读取该条数据
添加接口
返回字符串
我们想自定义添加一个接口,怎么在不写代码的情况下通过配置实现返回字符串
flow:
- name: hello_flow
filter:
- echo:
message: "hello flow"
router:
- name: read_router
default_flow: hello_flow
修改配置后启动
返回 json 数据
返回字符串不符合标准的 restful 接口规范,怎么返回给调用方标准 json 数据?
filter:
- set_response:
content_type: application/json
body: '{"message":"hello world"}'
修改配置后启动
修改路由
我们已经新加了接口,返回 json 数据,但是接口是直接定义在 http://127.0.0.1:9000 中,之前网关的接口就无法使用,所以我们需要单独为自定义的接口指定单独的路由
router:
- name: read_router
default_flow: default_flow
tracing_flow: logging
rules:
- method:
- GET
pattern:
- "/hello"
flow:
- hello_flow
default_flow: 默认的处理流,也就是业务处理的主流程,请求转发、过滤、缓存等操作都在这里面进行
tracing_flow:用于追踪请求状态的流,用于记录请求日志、统计等
如果我们有过开发经验,了解 MVC 模式,flow 就类似 MVC 中的 Controller,rules 中类似路由规则,当请求匹配到配置中的路由规则时,由配置的 flow 处理业务逻辑。
数据整体流向,从服务端发到网关,网关为每个 Elasticsearch 绑定不同的 IP 地址,每个 Elasticsearch 都有唯一一个 router 和它对应,根据请求的 method 和 path 匹配到 router 中的一个 flow,flow 中包含多个 filter 处理对数据进行流式处理。
如下图所示
流式处理是什么,假设水从一个管子里面流出来,管子旁边每一段依次站了几个人,第一个人往水里放点鱼,鱼和水到了第二个人,第二个人往水里放点草,鱼、水和草到了第三人等等,每个人对水做一定的操作,水经过这些操作后最后到达水池里。
我们可以把数据当成水,filter 是管子旁边的人,水池就是 Elasticsearch
总结
在学习了router/flow/filter后,我们已经对极限网关的配置有了初步的了解,后续开发的时候直接查阅文档。