热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

API网关之Nginx+Lua网关实战

Lua:Lua是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一

Lua:

Lua是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

Lua不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML, ini等文件格式,并且更容易理解和维护。

Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。

OpenResty:

OpenResty是一个基于 Nginx Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

 

在Ubuntu上安装并启动OpenResty的步骤:

wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -

echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" > openresty.list

cat openresty.list

cp openresty.list /etc/apt/sources.list.d/

apt update

apt install openresty

systemctl enable openresty

systemctl start openresty

安装后可以进入到OpenResty的目录(/usr/local/openresty/):

进入lualib, 可以在这个目录新建code目录,将写好的lua脚本文件放入其中:

Nginx + Lua网关实战:

Nginx+Lua来开发网关的好处是既能满足相对复杂一些的业务逻辑(毕竟Nginx的配置还是有限),又能获得不错的性能(因为离客户端越近,转发链路越短,性能也就越高,而且Lua脚本非常轻量级,资源消耗少)。还有个好处是和微服务应用解耦,代码中不需要想Spring Cloud那样特意去配置网关功能,只需关注业务逻辑处理即可。

现在假设要实现一个access token校验的网关功能。

 1. 首先需要写一个Luau脚本,Lua脚本里面写校验token的逻辑。Lua脚本示例 luatest.lua:

2. Nginx配置:

rewrite_by_lua_file这里要指明lua脚本所在的路径。

Nginx reload之后,浏览器访问/luatest的时候会先根据请求头中的token进行鉴权,然后再控制跳转。

Nginx自带的配置比较基础,难以适应比较复杂的处理,通过lua脚本可以加入更加复杂的业务逻辑,比如解析token、鉴权、处理复杂路由过滤等。

还可以直接把lua脚本写在nginx.conf配置文件中:

rewrite_by_lua:  {

              # Lua脚本内容...

}

openresty中有这些与lua相关的参数:

lua_load_resty_core

lua_capture_error_log

lua_use_default_type

lua_malloc_trim

lua_code_cache

lua_thread_cache_max_entries

lua_regex_cache_max_entries

lua_regex_match_limit

lua_package_path

lua_package_cpath

init_by_lua

init_by_lua_block

init_by_lua_file

init_worker_by_lua

init_worker_by_lua_block

init_worker_by_lua_file

exit_worker_by_lua_block

exit_worker_by_lua_file

set_by_lua

set_by_lua_block

set_by_lua_file

content_by_lua

content_by_lua_block

content_by_lua_file

server_rewrite_by_lua_block

server_rewrite_by_lua_file

rewrite_by_lua

rewrite_by_lua_block

rewrite_by_lua_file

access_by_lua

access_by_lua_block

access_by_lua_file

header_filter_by_lua

header_filter_by_lua_block

header_filter_by_lua_file

body_filter_by_lua

body_filter_by_lua_block

body_filter_by_lua_file

log_by_lua

log_by_lua_block

log_by_lua_file

balancer_by_lua_block

balancer_by_lua_file

lua_need_request_body

ssl_client_hello_by_lua_block

ssl_client_hello_by_lua_file

ssl_certificate_by_lua_block

ssl_certificate_by_lua_file

ssl_session_fetch_by_lua_block

ssl_session_fetch_by_lua_file

ssl_session_store_by_lua_block

ssl_session_store_by_lua_file

lua_shared_dict

lua_socket_connect_timeout

lua_socket_send_timeout

lua_socket_send_lowat

lua_socket_read_timeout

lua_socket_buffer_size

lua_socket_pool_size

lua_socket_keepalive_timeout

lua_socket_log_errors

lua_ssl_ciphers

lua_ssl_crl

lua_ssl_protocols

lua_ssl_trusted_certificate

lua_ssl_verify_depth

lua_ssl_conf_command

lua_http10_buffering

rewrite_by_lua_no_postpone

access_by_lua_no_postpone

lua_transform_underscores_in_response_headers

lua_check_client_abort

lua_max_pending_timers

lua_max_running_timers

lua_sa_restart

lua_worker_thread_vm_pool_size

部分参数解释:




推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • Redis的默认端口、数据库使用和多端口配置
    本文介绍了Redis的默认端口、数据库使用和多端口配置的方法。通过选择不同的数据库和使用flushdb命令可以实现对不同数据库的访问和清除数据。同时,本文还介绍了在同一台机器上启用多个Redis实例的方法,并讨论了配置认证密码的步骤和注意事项。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • yum安装_Redis —yum安装全过程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Redis—yum安装全过程相关的知识,希望对你有一定的参考价值。访问https://redi ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
mobiledu2502870557
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有