【Java团队用OpenResty】3、OpenResty快速学习方法

来源:互联网 发布:锤子科技 知乎 编辑:程序博客网 时间:2024/05/16 01:47

一、前言

对于Java开发者,头脑中最多的是线程模型(Thread),再就是NIO模型,这些都是解决高并发的手段。但是当你遇到OpenResty、Nginx、Lua时,你发现你掌握的原有的理论知识失效了,你可能会完成Lua功能的编写,但是你和Lua之前缺少对本质的探究,让你心里没有底气。

另外的问题就是要用OpenResty,需要学Lua,OpenResty现成的库比如(redis、时间处理、日志处理),Nginx的配置文件结构,Linux的基本原理也需要适当了解一下,这个学习过程是相互耦合、相互促进的,没有啥捷径。Java是什么,一次编写,到处可用,和具体的操作系统隔离,所以OpenResty学习曲线让Java团队有点崩溃。

下面我们介绍一下我们踩的坑总结出来的经验,当然因为我们毕竟Java团队,半路出家的做OpenResty不是非常专业,不对之处请高手指点出来。

二、Nginx处理模型

OpenResty是Nginx的扩展,所以,需要先说Nginx的模型,Nginx的master进程是管理者不具体处理客户端的请求,它的使命就是通过nginx.conf创建worker进程,所以master进程只有一个,worker进程是具体处理客户端请求的,nginx的worker数量一般不会超过机器的CPU数量。


那么,几个worker进程是如何同时处理成千上万的请求的呢,worker进程中内部没有多线程。在业界,面对低速IO和高速的CPU的协调问题,解决这类问题主要有三个有效途径:异步非阻塞网络编程(libevent、libev、redis、Nginx、memcached这类),协程(golang、gevent),“轻量级线程”,相当于是在语言层面做抽象(Erlang)。三者的区别就是遵循的标准,nginx就是自己喜欢怎么做就怎么做,这个就叫做编程;协程有自己的标准,轻量级线程也有自己的标准。

下面的图就是Nginx核心就是网络事件驱动的模型,没有模型,都是自己内部的数据结构和处理逻辑,在一个进程中做所有的事情,抽象不出什么进程线程协程模型。


三、OpenResty的处理模型

这里不深入展开讲OpenResty如何把Nginx和Lua融合在一起,因为Lua和C相互交互本身对Java开发者就是一件遥不可及的事情,后面会有文章专门分析这个。这里需要强调的是OpenResty的几个步骤,网上也有比较多,找不到最初的出处了。


这张图的优点是分成若干阶段,缺点是没有很清晰的说明,一个客户端请求过来以后,依次走过那些过程。这个我们后面也有具体实验验证。

四、学习资料

其实学OpenResty的核心是掌握其运行规律,一个个Lua过程都是片段,只告诉你这个阶段你做什么。

OpenResty就像设计模式中模板模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。另外还有拦截过滤器模式,用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。

推荐看的资料包括

1、Lua教程 http://www.runoob.com/lua/lua-tutorial.html 每个用例都跑一跑代码

2、OpenResty的Lua模块 https://github.com/openresty/lua-nginx-module 重点看各个函数的用途,跑一跑能够加深理解

3、360写的OpenResty最佳实践,http://wiki.jikexueyuan.com/project/openresty-best-practice/ 极客学院访问比较快,作为前面两个粘合剂,反复看

4、章亦春在新浪上的微博 http://blog.sina.com.cn/openresty,介绍nginx的配置非常有特色

最后,学Java喜欢看开源项目,OpenResty的开源项目先不用看Kong、Orange等号称API网关,这些都是有框架应用的,里面为了实现plugins,绕了N道弯弯,又有数据库操作,看起来不容易。


参考了

http://blog.chinaunix.net/uid-24517549-id-3977650.html

http://www.linuxeye.com/Linux/2610.html

原创粉丝点击