OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

49 | 微服务API网关搭建三步曲(三)

API 网关处理七层和四层的流量,可能的使用场景
利用 OpenResty 知识搭建更丰富的功能
将插件的处理函数挂载到 rewrite 阶段
使用 rapidjson 中的 json schema 定义插件的参数
引入 lua-resty-limit-traffic 作为限制请求数的基础库
按照优先级逐个运行过滤好的插件
进行插件的过滤函数,与本地配置文件做对比
通过 table pool 方式申请一个长度为 32 的 table
使用 lua-resty-radixtree 进行路由匹配
access 阶段进行路由匹配
初始化工作放在 init_worker 阶段处理
使用 Lua 代码处理流量入口
通过 Nginx.conf 进行简单配置
总结
编写插件
加载插件
匹配路由
Nginx 配置和初始化
微服务API网关搭建三步曲

该思维导图由 AI 生成,仅供参考

你好,我是温铭。
今天这节课,微服务 API 网关搭建就到了最后的环节了。让我们用一个最小的示例来把之前选型的组件,按照设计的蓝图,拼装运行起来吧!

Nginx 配置和初始化

我们知道,API 网关是用来处理流量入口的,所以我们首先需要在 Nginx.conf 中做简单的配置,让所有的流量都通过网关的 Lua 代码来处理。
server {
listen 9080;
init_worker_by_lua_block {
apisix.http_init_worker()
}
location / {
access_by_lua_block {
apisix.http_access_phase()
}
header_filter_by_lua_block {
apisix.http_header_filter_phase()
}
body_filter_by_lua_block {
apisix.http_body_filter_phase()
}
log_by_lua_block {
apisix.http_log_phase()
}
}
}
这里我们使用开源 API 网关 APISIX 为例,所以上面的代码示例中带有 apisix 的关键字。在这个示例中,我们监听了 9080 端口,并通过 location / 的方式,把这个端口的所有请求都拦截下来,并依次通过 accessrewriteheader filterbody filterlog 这几个阶段进行处理,在每个阶段中都会去调用对应的插件函数。其中, rewrite 阶段便是在 apisix.http_access_phase 函数中合并处理的。
而对于系统初始化的工作,我们放在了 init_worker 阶段来处理,这其中包含了读取各项配置参数、预制 etcd 中的目录、从 etcd 中获取插件列表、对于插件按照优先级进行排序等。我这里列出了关键部分的代码并进行讲解,当然,你可以在 GitHub 上看到更完整的初始化函数
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了微服务API网关的搭建过程,通过Nginx配置和初始化、匹配路由、加载插件和编写插件四个方面展开。首先,作者介绍了在Nginx.conf中配置API网关的Lua代码,以及系统初始化的工作。接着,文章详细讲解了匹配路由的过程,包括如何根据请求信息匹配路由规则。然后,文章介绍了加载插件的过程,包括插件的过滤和按优先级逐个运行的步骤。最后,作者以编写一个限制请求数的插件为例,展示了插件的编写过程。通过引入基础库和定义插件参数,最后将插件的处理函数挂载到rewrite阶段。整体来看,本文通过具体的代码示例,详细介绍了微服务API网关的搭建过程,为读者提供了实用的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 一声扣钉
    老师,如果需要修改respones body的内容,就只能在body_filter里做修改,这样引起body长度与content-length长度不一致,应该如何处理?

    作者回复: 这是个好问题。如果你修改了响应体,那么也同时需要在header_filter阶段把 content_length 置为 nil: ngx.header.content_length = nil

    2019-09-16
    2
    7
  • SMTCode
    快结课了,基本上跟下来了,但自己实践偏少(工作中目前未用)。不过确实是强大的课。感谢温老师的持续分享。后期工作中择机引入~

    作者回复: 可以先从 OpenResty 替换 Nginx 开始入手,这是成本最低的:)

    2019-09-16
    1
  • 铁匠
    我自己实现了一个简单的网关服务,注册中心使用etcd,因为是初学,还有很多改进的地方,设计思路和优化点欢迎老师和大家指点。github: https://github.com/fengjx/resty-gateway
    2020-02-23
    7
  • CheverJohn
    给老师更新一下,目前limit-count 插件选用了 jsonschema 了,而不是 腾讯的 rapidjson 啦。建议注明
    2022-02-10
    2
  • 蓝色海洋
    老师您好,我这边想实现一个kong的灰度发布的插件,感觉没有思路,请老师指点一下谢谢
    2019-10-15
    2
    2
  • 言身寸飞
    插件那块不是很明白可以详细讲讲么
    2019-10-07
    1
  • 段先森
    老师 把openresty作为IM系统的链接层可行吗 就是维护ws链接 应用层ack这些
    2019-09-17
    1
    1
  • 王慧东
    老师,麻烦问一下怎么在init_worker_by_lua 加载数据库信息??
    2020-08-12
  • 半夜一声笑
    老师,如果这样调用ngx.timer.at(0,func) 可以获取到func返回的结果吗 找了一圈没找到合适的方法
    2020-06-02
  • 陈海源
    温老师,这个demo的源代码的地址哪里可以查看
    2019-09-18
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部