文档章节

使用OpenResty开发应用网关

人间五十年
 人间五十年
发布于 2018/05/25 20:10
字数 1369
阅读 227
收藏 0

使用OpenResty开发应用网关

我们的应用

image

设备消息平台做为硬件设备与业务集群间消息通讯中间件,将设备与业务之间的消息进行转发。其中,Netty框架做为与设备保持长连接的通讯网关。OpenResty平台做为面向业务层提供RESTful接口的应用网关,起到鉴权、限流、自定义路由、协议转换和日志收集等作用。

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 等都进行一致的高性能响应。

Nginx的阶段,模块和指令

阶段

从Nginx的内部来看,一个HTTP Request的处理过程分为以下阶段:

graph TB
id1(Request)-->id2(解析请求)
id2-->id3(查找配置)
id3-->id4(调用各Handler进行处理)
id4-->filters
filters-->id5(Response)

模块

Handler模块就是接受来自客户端的请求并产生输出的模块,通常执行以下几项任务:

  1. 获取location配置
  2. 产生适当的响应
  3. 发送response header
  4. 发送response body

指令

Nginx配置文件中的配置项由指令和指令参数构成,其中的指令就是指当前阶段的特定模块应该执行的业务逻辑。

Lua语言特性

Lua天生的定位就是做为一门"胶水语言"出现的。它没有自己独立的环境,必须依附在宿主语言的环境中才能起作用,所以非常适合作为别的程序的插件开发和功能扩展。开发过程中还需注意:

  • 下标从1开始
  • 默认全局变量,需要在所有变量前加local
  • Lua 标准库和周边库,都是阻塞的。在OpenResty中使用必须选择非阻塞库。

Lua语言其他应用场景

  • 为Redis编写脚本,执行复杂的原子性的操作
  • 为Wrk(Http性能测试工具)编写测试脚本
  • 为Wireshark编写插件

OpenResty不建议做什么? 可以用来做什么?

不建议的场景

  • 有长时间阻塞调用的过程
  • 受制于Lua VM的最大使用内存1G的限制,不适合内容占用高的场景
  • 不擅长业务逻辑复杂的场景

可以用来应对的场景

  • 在请求真正到达上游服务之前,处理复杂的准入控制和安全检查
  • 对HTTP Request或Response Header进行处理
  • 从外部存储中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问
  • 对通过的数据流量进行记录, 并控制入口流量

开发实战

Hello World

官方新手上路

代码说明

# conf/ngin.conf

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    server {
        listen 8080;
        location / {
            default_type text/html;
            # OpenResty 代码开始
            content_by_lua '
                ngx.say("<p>hello, world</p>")
            ';
            # OpenResty 代码结束
        }
    }
}

项目源码

OpenResty开发特点

Nginx是模块化的,有独特的执行阶段概念。在OpenResty开发中,首先必须遵循Nginx的处理流程。 将代码逻辑放到不同的阶段里面运行,才能获取你想要的预期结果。而这些阶段间信息如何传递,以及在特定阶段如何选择OpenResty的API使用就是其入门难点。

Cloak Gateway

客户在某社交网站中投入一条广告链接。

但他们希望该链接地址可以向真实用户显示与投放链接无关的其他广告内容,从而达到一次广告投放申请通过后,能随意修改广告内容的目的。而某社交网站爬虫机器人会不断检查广告链接的有效性和真实性。

网关需要对访问广告链接请求的IP,Header[User-Agent]进行分析,判断请求来源是否是爬虫机器人。如果是机器人则导向Cloak页面,即安全页面。如果是用户则将用户导向ad页面,即广告页面。从而避免广告链接被某社交网站下线。

graph TB
id1(客户端请求)-->id2{判断IP和User-Agent}
id2--真实用户-->id3(广告页面)
id2--爬虫机器人-->id4(Cloak页面)
id3-->id5(返回)
id4-->id5

项目源码

我遇到的坑

  1. 无法在应用启动后修改Nginx配置
  2. 开发、测试和生产环境配置如何区分和加载
  3. OpenResty代码如何放置
  4. 第三方包太少

OpenResty相关资源

  • Lapis 基于OpenResty的Web框架
  • Kong 强大的API Gateway

我的微信

image

© 著作权归作者所有

共有 人打赏支持
上一篇:
人间五十年

人间五十年

粉丝 5
博文 10
码字总数 3600
作品 0
成都
高级程序员
私信 提问
OpenResty x Open Talk 丨北京站

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

又拍云
03/04
0
0
OpenResty x Open Talk丨深圳站

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

又拍云
2018/12/13
0
0
OpenResty简介、编译安装

OpenResty,也被称为“ngxopenresty”,是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方的Nginx模块和大部分系统依赖包,用于方便地搭建能够处理超高并发...

justin_peng
2018/07/23
0
0
基于OpenResty和Node.js的微服务架构实践

什么是微服务? 传统的单体服务架构是单独服务包,共享代码与数据,开发成本较高,可维护性、伸缩性较差,技术转型、跨语言配合相对困难。而微服务架构强调一个服务负责一项业务,服务可以单...

个推
2018/07/02
0
0
【开源访谈】OpenResty 作者章亦春访谈实录

关于开源访谈 开源访谈是开源中国推出的一系列针对国内优秀开源软件作者的访谈,以文字的方式记录并传播。我们希望开源访谈能全面的展现国内开源软件、开源软件作者的现状,着实推动国内开源...

虫虫
2012/07/09
76.4K
31

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部