流量复制 在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线.这其实就需要进行流量复制,把流量复制到其他服务器上,一种方式是使用如tcpcopy引流:另外我们还可以使用nginx的HttpLuaModule模块中的ngx.location.capture_multi进行并发执行来模拟复制. 构造两个服务: location /test1 { keepalive_timeou…
本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后拼装网页模板的. 如图所示,商品页主要包括商品基本信息(基本信息.图片列表.颜色/尺码关系.扩展属性.规格参数.包装清单.售后保障等).商品介绍.其他信息(分类.品牌.店铺[第三方卖家].店内分类[第三方卖家].同类相关品牌).更多细节此处就不阐述了. 整个京东有数亿商品,如果每次动态获取如上内容进…
此处我说的HTTP服务主要指如访问京东网站时我们看到的热门搜索.用户登录.实时价格.实时库存.服务支持.广告语等这种非Web页面,而是在Web页面中异步加载的相关数据.这些服务有个特点即访问量巨大.逻辑比较单一:但是如实时库存逻辑其实是非常复杂的.在京东这些服务每天有几亿十几亿的访问量,比如实时库存服务曾经在没有任何IP限流.DDos防御的情况被刷到600多万/分钟的访问量,而且能轻松应对.支撑如此大的访问量就需要考虑设计良好的架构,并很容易实现水平扩展. 架构 此处介绍下Nginx+JavaE…
Nginx Lua 模块指令 Nginx共11个处理阶段,而相应的处理阶段是可以做插入式处理,即可插拔式架构:另外指令可以在http.server.server if.location.location if几个范围进行配置: 指令 所处处理阶段 使用范围 解释 init_by_luainit_by_lua_file loading-config http nginx Master进程加载配置时执行:通常用于初始化全局配置/预加载Lua模块 init_worker_by_luainit_work…
Nginx Lua API 和一般的Web Server类似,我们需要接收请求.处理并输出响应.而对于请求我们需要获取如请求参数.请求头.Body体等信息:而对于处理就是调用相应的Lua代码即可:输出响应需要进行响应状态码.响应头和响应内容体的输出.因此我们从如上几个点出发即可. 接收请求 1. openResty.conf配置文件 server { listen 80; server_name _; location ~ /lua_request/(\d+)/(\d+) { # 设置nginx…
OpenResty是一款基于Nginx的高性能负载均衡服务器容器,简单来说是Nginx+Lua.结合了Lua语言来对Nginx进行扩展,使得在Nginx上具有web容器功能. OpenResty运行环境搭建 首先是在CentOS 7.6上的安装过程: cd /opt 安装编译所需要的环境: yum install readline-devel pcre-devel openssl-devel gcc 去OpenResty的官网下载安装包: 地址:http://openresty.org/cn/d…
模版渲染 动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实现.而Lua中也有许多模板引擎,如目前京东在使用的lua-resty-template,可以渲染很复杂的页面,借助LuaJIT其性能也是可以接受的. 如果学习过JavaEE中的servlet和JSP的话,应该知道JSP模板最终会被翻译成Servlet来执行:而lua-resty-template模板引擎可以认为是JSP,其最终会被翻译成Lua代码,然后通过ngx.print…
Redis客户端 lua-resty-redis是为基于cosocket API的ngx_lua提供的Lua redis客户端,通过它可以完成Redis的操作.默认安装OpenResty时已经自带了该模块,使用文档可参考https://github.com/openresty/lua-resty-redis. 基本操作 1. 创建redis/test_redis_baisc.lua local function close_redes( red ) if not red then return…
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享:另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个:如果想在多个Worker进程间共享数据可以使用ngx.shared.…
JSON库 在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能:目前Lua也有几个JSON库,如:cjson.dkjson.其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成一些特殊要求.而在使用dkjson时也没有遇到性能问题,目前使用的就是dkjson.使用时要特别注意的是大部分JSON库都仅支持UTF-8…