前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >网关技术选型,为什么选择 Openresty ?事件驱动、协程...

网关技术选型,为什么选择 Openresty ?事件驱动、协程...

作者头像
微观技术
发布于 2021-11-23 07:56:02
发布于 2021-11-23 07:56:02
99000
代码可运行
举报
文章被收录于专栏:微观技术微观技术
运行总次数:0
代码可运行

大家好,我是Tom哥~

今天跟大家聊下关于网关的话题

互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面:

  • 数据量过大,如何定制化存储
  • 访问量高了,如何集群化部署,流量负载均衡
  • 响应速度慢了,如何提高处理速度,引入多级缓存
  • 如果机器多了,如何保证某台服务器突然抽风,不影响业务集群的服务稳定性

麻雀虽小五脏俱全,今天要讲的网关,就是其中的关键一环,不论公司规模大小如何,基本都要有这个系统。

那么网关是干什么用的?

什么是网关

网关是连接客户端与服务端的中间桥梁,将很多通用地非业务逻辑抽离,前置到网关系统,减少了很多重复性开发工作,是整个网站的唯一流量入口。

为了提高系统的扩展性,网关通常采用组件式架构,高内聚低耦合。

常用的组件功能:

  • 黑名单拦截
  • 日志
  • 参数校验
  • 鉴权
  • 限流
  • 负载均衡
  • 路由转发
  • 监控
  • 灰度分流
  • 多协议支持
  • 熔断、降级、重试、数据聚合等

系统设计上一般采用责任链设计模式,定义好抽象接口,每个组件实现自己的专属功能,职责单一。并且根据不同的业务请求API,添加、删除一些节点,动态构建新的节点链,从而满足多样化的业务需求。

网关选型

1、Tomcat/Jetty+NIO+Servlet3

2、Nginx

3、Spring WebFlux

4、Soul

5、Spring cloud Gateway

6、Zuul

7、OpenResty

8、Kong

9、Netty 自建

各个框架的资料网上基本都有,考虑到篇幅限制,这里就不展开分析每个框架的优缺点(如果感兴趣,可以给我留言,人多的话我后面就单启一篇文章来讲一讲)。

我们计划选型 OpenResty,主要有以下几个原因:

  • 能实现跨网络的gRPC请求转发,底层采用 HTTP/2 协议
  • 支持 SSL/TLS 证书加密,通讯安全
  • 性能方面,支持较高的并发请求
  • 性能开销低,延迟少

翻牌 OpenResty

下图是 Netcraft 最新统计的 2021年10月 Web 服务器排行榜

Netcraft 是一家总部位于英国巴斯始于 1995 年的互联网服务公司。该公司官网每月发布的调研数据报告:Web Server Survey 系列 已成为当今人们了解全球网站的服务器市场份额

来源:https://news.netcraft.com/archives/2021/10/15/october-2021-web-server-survey.html

OpenResty 现在全球排名第三,由于将Nginx扩展成动态服务器,发展势头很猛。

我们常用的 12306 的余票查询功能,京东的商品详情页,这些高流量的背后,其实都是 OpenResty 在提供服务。

OpenResty 最擅长的是部署在流量入口处,处理各种高并发流量。

接下来,我们来深入了解下这个框架

OpenResty 诞生起因

nginx 采用 master-worker 进程模型,分工明确,职责单一,也是其具备高性能的原因之一。

1、master 进程

管理进程,处理指令如:-s reload-s stop,通过进程间通信,将管理指令发送给worker进程,从而实现对worker进程的控制。

2、worker 进程

工作进程,不断接收客户端的连接请求,处理请求。数量通常设置为与CPU核数一致,nginx也会将每个进程与每个CPU进行绑定,充分利用其多核特性。

多个worker进程会竞争一个共享锁,只有抢到锁的进程才能处理客户端的请求。如果请求是accept事件,则会将其添加到accept队列中;如果是read或者write事件,则会将其添加到read-write队列。

可能有人问,OpenResty 为什么要基于 Nginx 框架?

主要还是看重了 Nginx 的高并发能力,反向代理服务器通常流量很大,本身不涉及复杂计算,属于I/O密集型服务。Nginx 采用基于 epoll 机制的事件驱动,异步非阻塞,大大提高并发处理能力。

但是 Nginx 采用 C 语言 开发,二次开发门槛较高。市场应用广泛,更多是基于 nginx.conf 预留配置参数,如:反向代理、负载均衡、静态web服务器,等

如果想让Nginx访问 MySQL ,定制化开发一些业务逻辑,难度很高。OpenResty 通过 嫁接方式,将 Nginx 和 Lua 脚本相结合,既保留 Nginx 高并发优势,也拥有脚本语言的开发效率,也大大降低了开发门槛。

Lua 是最快的、动态脚本语言,接近C语言运行速度。LuaJIT 将一些常用的lua函数和工具库预编译并缓存,下次调用时直接使用缓存的字节码,速度很快。

另外,Lua支持协程,这个很重要。

协程是用户态的操作,上下文切换不用涉及内核态,系统资源开销小;另外协程占用内存很小,初始 2KB

OpenResty 核心架构

OpenResty是一个基于Nginx的Web平台,内部嵌入LuaJIT虚拟机运行Lua脚本。使用 Lua 编程语言对 Nginx 核心以及各种 Nginx C 模块进行脚本编程。

  • 每接到一个客户端请求,通过抢占锁,由一个worker进程来跟进处理
  • worker内部会创建一个lua协程,绑定请求,也就是说一个请求对应一个lua协程
  • lua协程将请求通过网络发出,并添加一个event事件到nginx。然后,当前协程就处于 yield,让出CPU控制权
  • 当服务端响应数据后,网络流程会创建一个新的event事件,将之前的协程唤醒,将结果返回。

注意:不同的lua协程之间数据隔离,从而保证了不同的客户端请求不会相互影响。另外,一个worker中同一时刻,只会有一个协程在运行。

cosocket 将 Lua 协程 + Nginx 事件通知两个重要特性组合。

cosocket 是 OpenResty 世界中技术、实用价值最高部分。让我们可以用非常低廉的成本,优雅的姿势,比传统 socket 编程效率高好几倍的方式进行网络编程。无论资源占用、执行效率、并发能力都非常出色。

为了方便开发,OpenResty 将一个 HTTP 请求划分为11个阶段,每个阶段有自己的专属职责。

函数功能说明:

  • set_by_lua,用于设置变量
  • rewrite_by_lua,用于转发、重定向等
  • access_by_lua,用于准入、权限等
  • content_by_lua,用于生成返回内容
  • balancer_by_lua,负载均衡,路由转发
  • header_filter_by_lua,用于响应头过滤处理
  • body_filter_by_lua,用于响应体过滤处理
  • log_by_lua,日志记录

OpenResty 提供了大量的 Lua API 接口,用于操作 Nginx 。只要熟悉lua语法,同时对 Nginx 的运行流程有较清楚理解,那么就可以轻松的在nginx上做二次开发。

无论是作为应用网关,还是高性能的web应用,支持连接各种丰富的后端存储,如:MySQL、Redis、Memcache、PostgreSQL 等,周边生态非常丰富。

https://github.com/openresty/lua-nginx-module/#accessbylua

注意:OpenResty 的 API 有使用范围限制,每个 API 都有与之对应的使用阶段列表,如果你超范围使用就会报错。

部署安装

本文以 CentOS 系统中为例

1、添加 openresty 仓库,这样以后可以通过 yum updata 命令安装或更新我们的软件包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install yum-utils -y
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

2、安装软件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install openresty -y

3、安装命令行工具 resty

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install openresty-resty -y

项目实战

1、修改nginx.conf配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  auto;
worker_rlimit_nofile 1000000;
events {
    use epoll;
    worker_connections  150000;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $content_length $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$upstream_response_time" "$request_time"';

    access_log  logs/access.log  main;
    
    server {
        listen 8080;
        location / {
            access_by_lua_block {
                local headers = ngx.req.get_headers(0)
                local trace_id= headers["X-Trace-Id"]
                ngx.log(ngx.ERR, trace_id)
            }
            #  ngx.say("<p>hello !</p>")
            proxy_pass http://168.12.8.10:8080;
        }
    }

    server {
        listen 8082;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<p>Hello Openresty!</p>")
            }
        }
    }
}

nginx.conf 内部分为三层嵌套:

  • 最外层的http,表示处理 HTTP 协议
  • http 内部 的 server 监听端口,会启动一个 LuaJIT 虚拟机,执行lua代码
  • 同一个端口内部,区分不同的业务功能,采用 location 配置,通过不同的 path 路径,处理不同的业务逻辑。

2、添加环境变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "export PATH=$PATH:/usr/local/openresty/nginx/sbin" >> /etc/profile
source /etc/profile

3、启动 openresty,启动命令和nginx一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nginx -c /usr/local/openresty/nginx/conf/nginx.conf

4、访问 Web 服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl http://localhost:8082/

如果正常,浏览器页面会输出 Hello Openresty!

5、如果 nginx.conf 配置项做了修改,我们可以重新启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nginx  -s reload

关于我:Tom哥,前阿里P7技术专家,多年大厂实战经验。欢迎关注,我会持续输出更多经典原创文章,为你大厂助力。

欢迎小伙伴找Tom哥唠嗑聊天, 技术交流,围观朋友圈,打怪人生不再寂寞。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微观技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网关 - OpenResty
互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面:
iginkgo18
2021/11/24
1.4K0
手把手教你使用 OpenResty 搭建高性能服务端!
Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select、poll、epoll是Linux API提供的I/O复用方式,自从Linux2.6中加入了epoll之后,高性能服务器领域得到广泛的应用,Nignx就是使用epoll来实现I/O复用支持高并发。
用户2781897
2020/11/10
2.3K0
手把手教你使用 OpenResty 搭建高性能服务端!
OpenResty学习指南(一)
我的博客: https://www.luozhiyun.com/archives/217
luozhiyun
2020/02/18
1.9K0
OpenResty学习指南(一)
基于Openresty+Lua实现微服务Api 网关
微服务网关(Microservices Gateway)是微服务架构中的一种关键组件,它作为一个入口点,接收客户端的请求并将其路由到相应的微服务上。它起到了前端与后端微服务之间的“门户”的作用,协调整个微服务系统的请求流量和服务访问。具备的功能如下:
用户1107783
2023/09/11
1.7K0
基于Openresty+Lua实现微服务Api 网关
每个后端都应该了解的OpenResty入门以及网关安全实战
在官网上对 OpenResty 是这样介绍的(http://openresty.org):
wayn
2023/10/25
1.4K0
每个后端都应该了解的OpenResty入门以及网关安全实战
041. 通过 Lua 扩展 Nginx
1. ngx_lua 模块 ---- Nginx 模块需要用 C 开发,而且必须符合一系列复杂的规则,最重要的用 C 开发模块必须要熟悉 Nginx 的源代码,使得开发者对其望而生畏。 ngx_lua 模块通过将 lua 解释器集成进 Nginx,可以采用 lua 脚本实现业务逻辑。 该模块具有以下特性: 高并发、非阻塞地处理各种请求。 Lua 内建协程,这样就可以很好地将异步回调转换成顺序调用的形式。 每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“comman d
山海散人
2021/03/03
8490
041. 通过 Lua 扩展 Nginx
Nginx之Openresty基本使用解读
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
一个风轻云淡
2023/10/03
5490
Nginx学习之Nginx的扩展openresty(三)
worker_processes 1 建议设置成cpu总核心数 epoll . select …
周杰伦本人
2022/10/25
6590
Nginx学习之Nginx的扩展openresty(三)
OpenResty 实现限流
目前限流的解决方案有很多,从分布式角度来看,限流可分为分布式限流(比如基于Sentinel或者 Redis的集群限流)和单机限流。
微观技术
2021/04/19
3.3K1
OpenResty 实现限流
Web服务器-Nginx服务器之OpenResty(Lua)
作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/04/16
580
Web服务器-Nginx服务器之OpenResty(Lua)
通过 Consul+OpenResty 实现无reload动态负载均衡
【转载请注明出处】:https://cloud.tencent.com/developer/article/1628590
后端老鸟
2020/05/15
2.6K0
通过 Consul+OpenResty 实现无reload动态负载均衡
一文从原理到实践教你使用Nginx_lua实现WAF
过去企业通常会采用防火墙,作为安全保障的第一道防线;当时的防火墙只是在第三层(网络层)有效的阻断一些数据包;而随着web应用的功能越来越丰富的时候,Web服务器因为其强大的计算能力,处理性能,蕴含较高的价值,成为主要的被攻击目标(第七层应用层)而传统防火墙在阻止利用应用程序漏洞进行的攻击方面,却没有办法;在此背景下,WAF(Web Application Firewall)应运而生。
公众号: 云原生生态圈
2022/02/16
2.8K0
OpenResty实战系列 | Redis协程网络库 lua-resty-redis
lua-resty-redis 是由著名OpenResty社区成员Agent Zhang(章亦春)创建的。这是一个与OpenResty集成的Lua模块,允许你在Nginx环境中直接进行Redis操作。利用OpenResty的强大功能,lua-resty-redis提供了异步非阻塞的Redis API,帮助开发者构建高性能、高并发的应用。
Tinywan
2024/07/30
2120
OpenResty实战系列 | Redis协程网络库 lua-resty-redis
快速尝鲜高性能网关Openresty
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
码之有理
2024/04/11
2810
OpenResty简单部署
OpenResty是由C10K大神Leo Li(李纪宁)开发的一款高性能的Web服务器扩展套件,它将Nginx和LuaJIT(一款高性能的Lua解释器)进行了深度整合,使得服务器端的动态应用开发变得更为高效和便捷。OpenResty的核心组件包括Nginx、luaJIT、luaCore以及一系列的 Lua 模块。
七条猫
2024/09/11
1450
OpenResty简单部署
一文带你详解Nginx/OpenResty,Nginx Lua编程基础,学不会别怪我
OpenResty通过汇聚各种设计精良的Nginx模块(主要由OpenResty团队自主开发)将Nginx变成一个强大的通用Web应用平台。这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10KB乃至1000KB以上单机并发连接的高性能Web应用系统。
愿天堂没有BUG
2022/10/28
3K0
一文带你详解Nginx/OpenResty,Nginx Lua编程基础,学不会别怪我
好玩的Openresty
Openresty是国人发起的一个开源项目,大概看了一下,也体验了一下,在技术实现上,角度挺有意思的。Openresty是基于Nginx的web服务器,有意思的是Openresty的思路是把web应用服务集成到Nginx里面。大家都知道Nginx是通常配合Node.js、Go、PHP等后端技术一起使用,通过进程间通信或者socket完成一个完整的服务。
theanarkh
2021/08/24
8460
好玩的Openresty
01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
简介 OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C
iginkgo18
2020/10/19
1.8K0
01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:n
用户1177713
2018/02/24
22.8K0
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
Nginx高级应用:lua + OpenResty
而对于首页这种,高访问,且 页面数据并不是,经常的变化! 为了减轻服务器的压力,直接将其制作成一个 静态的页面进行展示!
Java_慈祥
2024/08/06
3650
Nginx高级应用:lua + OpenResty
推荐阅读
相关推荐
网关 - OpenResty
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档