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

2024-04-12 01:38

本文主要是介绍网关技术选型,为什么选择 Openresty ?事件驱动、协程...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信搜索 【微观技术】,关注这个不喜欢内卷的程序员。

精彩文章汇总 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ,汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识

大家好,我是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 都有与之对应的使用阶段列表,如果你超范围使用就会报错。

图片

整理了一份大厂常考面试题,这份pdf包括 Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、设计模式等面试题,分享给大家。
下载地址:百度云链接:https://pan.baidu.com/s/1XHT4ppXTp430MEMW2D0-Bg 提取码: s3ab

部署安装

本文以 CentOS 系统中为例

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

yum install yum-utils -y
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

2、安装软件

yum install openresty -y

3、安装命令行工具 resty

yum install openresty-resty -y

项目实战

1、修改nginx.conf配置文件

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、添加环境变量

echo "export PATH=$PATH:/usr/local/openresty/nginx/sbin" >> /etc/profile
source /etc/profile

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

nginx -c /usr/local/openresty/nginx/conf/nginx.conf

4、访问 Web 服务

curl http://localhost:8082/

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

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

nginx  -s reload

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

(58条消息) 网关技术选型,为什么选择 Openresty ?事件驱动、协程..._公众号:微观技术-CSDN博客

这篇关于网关技术选型,为什么选择 Openresty ?事件驱动、协程...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895753

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保