OpenResty高性能億萬級商品詳情頁

1.課程介紹--

2.openresty介紹
官網:https://openresty.org/cn/
openresty的目標是讓你的Web服務直接跑在Nginx服務內部,充分利用Nginx的非阻塞I/O模型夫啊,不僅僅對HTTP客戶端請求撇眯,甚至對遠程后端諸如MySQL熊榛,PostgreSQL,Memcached以及Redis等都進行一致的高性能響應逸雹。

3.openresty常用架構
負載均衡:
LVS+HAProxy將流量轉發(fā)給核心Nginx1和核心Nginx2梆砸,即實現(xiàn)了流量的負載均衡
單機閉環(huán):
所有想要的數據都能從本服務器直接獲取休蟹,在大多數時候無需通過網絡去其他服務器獲取
分布式閉環(huán):
單機閉環(huán)會遇到如下兩個主要問題:
1.數據不一致(比如沒有采用主從架構導致不同服務器數據不一致)
2.遇到存儲瓶頸(磁盤或者內存遇到了天花板)赂弓。
解決數據不一致的比較好的辦法是采用主從或者分布式集中存儲哪轿;而遇到存儲瓶頸就需要進行按照業(yè)務鍵進行分片杨耙,將數據分散到多臺服務器珊膜。
接入網關:
接入網關也可以叫做接入層剔氏,即接收到流量多入口谈跛,在入口我們進行如下事情

4.openresty下載與安裝
windows安裝:直接解壓安裝币旧,啟動時,只需要執(zhí)行nignx.exe
linux安裝centOS6.5
1.解壓:tar -xzvf openresty-VERSION.tar.gz
2.配置:進入openresty-VERSION/目錄鳍刷,然后輸入以下命令配置
./configure
默認—prefix=/usr/local/openresty程序會被安裝到/usr/local/openresty目錄输瓜。
3.安裝
make&&make install
注意:openresty依賴庫有:perl5.6.1+,libreadline北戏,libpcre嗜愈,libssl蠕嫁。所以我們需要先安裝好這些依賴庫
yum install redline-devel pure-devel openssl-level perl gcc
4.驗證:
關閉防火墻,訪問http://外網IP

5.lua介紹與下載安裝
lua語法介紹
lua是一種輕量小巧的腳本語言迟赃,用標準C語言編寫并以源代碼形式開放,其設計目的是為了嵌入應用程序中酌媒,從而為應用程序提供靈活的擴展和定制功能。官網:http://www.lua.org/
1.CentOS下安裝lua
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux test
make install
查看lua版本:lua -v

6.lua語法-數據類型與變量定義
2.helloworld
1.交互模式雨席,輸入lua
2.腳本式陡厘,創(chuàng)建一個以lua結尾的文件,例如hello.lua文件內容print(“hello world”)
3.lua數據類型與變量
lua中有8個基本類型分別為:nil,boolean,number,string,userdata,function,thread和table
數據類型 描述
nil 這個最簡單谤饭,只有值nil屬于該類,表示一個無效值(在條件表達式中相當于false)
boolean 包含兩個值:false和true
number 表示雙精度類型的實浮點數
string 字符串由一對雙引號或單引號來表示
function 由C或Lua編寫的函數
userdata 表示任意存儲在變量中的C數據結構
thread 表示執(zhí)行的獨立線路,用于執(zhí)行協(xié)同程序
table Lua中的表(table)其實是一個“關聯(lián)數組”(associative arrays)辟汰,數組的索引可以是數字或者字符串帖汞。在Lua里,table的創(chuàng)建是通過“構造表達式”來完成催首,最簡單構造表達式是{},用來創(chuàng)建一個空表秧耗。
Lua變量有三種類型:全局變量,局部變量尺锚,表中的域
Lua中變量全是全局變量,那怕是語句塊或是函數里伐厌,除非用local顯式聲明為局部變量。
局部變量的作用域為從聲明位置開始到所在語句塊結束。
變量的默認值均為nil画饥。
--單行注釋
--[[
多行注釋
--]]

7.lua語法-運算符
1.賦值運算符
—賦值str=“hello”..”world” —..lua中的字符連接
a,b=10,20 —a=10,b=20
c,d,e=1,2
2.算術運算符
下表列出了lua語言中的常用算術運算符,設定A的值為10,B的值為20:
+ 加法
- 減法
* 乘法
/ 除法
% 取余
^ 乘冪
- 負號
3.關系運算符
下表列出了lua語言中的常用關系運算符艰额,設定A的值為10,B的值為20:
操作符 描述
== 等于
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
4.邏輯運算符
and 邏輯與操作符狱意,若A為false,則返回A,否則返回B。
or 邏輯或操作符,若A為true,則返回A,否則返回B砚亭。
not 邏輯非操作符,與邏輯運算結果相反,如果條件為true,邏輯非為false曹体。
5.其它運算符
.. 連接兩個字符串
# 一元運算符,返回字符串或表的長度
str=“helloworld”
print(#str) —得到10

8.lua語法-流程控制
1.條件
2.循環(huán)
--while循環(huán)
a=10
while(a>0)
do
print(a)
a = a -1
end
--repeat until:重復執(zhí)行循環(huán),直到指定的條件為真時為止
b=10
repeat
print(b)
b=b-1
until(b<1)
--for循環(huán)
for a=1,10,1 do
print(a)
end

9.lua語法-數組與泛型for
— 數組大小不固定,下標是從1開始绘趋。
arr={“aaa”,”bbb”,”ccc”}
for index=1,#arr do
print(arr[index])
end
—泛型for
for i,v in impairs(arr) do
print(i,v)
end

10.lua語法-函數介紹
—函數
function fun(a,b,c)
return a,b,c
end
value1,value2,value3 = fun(1,2,3,4,5)
print(value1,value2,value3)

11.lua語法-table與模塊垦江,包介紹
mytable={} —聲明一個table
mytable.first=“tom”
mytable.second=“james”
print(mytable[1])
print(mytable.first)
print(mytable[“second”])

模塊類似于一個封裝庫,從5.1開始吧慢,Lua加入了標準的模塊管理機制
module={}
module.index=1
function module.sum(a,b)
    return a+b
end
—引入模塊
require “module”
print(module.index)
print(module.sum(10,20))

12.openresty快速入門
1.helloworld
openresty1.9.3.1及以下版本底哗,請使用content_by_lua命令:在openresty1.9.3.2以上,content_by_lua改成了content_by_lua_block.可使用nginx -V命令查看版本號
location / {
#root html;
#index index.html index.htm;
default_type text/html;
content_by_lua_block{
ngx.say(“hello world”);
}
}

我們也可以使用content_by_lua_file來引入一個lua文件
location /{
    #root    html;
    #index    index.html index.htm;
    default_type    text/html;
    content_by_lua_file    /usr/local/openresty/nginx/conf/my.lua;
}

13.openresty獲取http請求信息
1.獲取uri參數
獲取一個uri有兩個方法:ngx.req.get_uri_args,ngx.req.get_post_args,二者主要的區(qū)別是參數來源有區(qū)別
--獲取get請求參數
local arg=ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say(“[GET] key:”,k,” v:”,v)
ngx.say(“換行符”)
end

—獲取post請求時炼列,請求參數
ngx.req.read_body() —解析body參數之前一定要先讀取body
local arg = ngx.req.get_post_args()
for k,v in pairs(args) do
    ngx.say(“[POST] key:”,k,” v:”,v)
    ngx.say(“<br>”)
end

2.獲取header
—獲取header
local headers = ngx.req.get_headers()
for k,v in pairs(headers) do
    ngx.say(“[header] name;”,k,” v:”,v)
    ngx.say(“<br>”)
end

3.獲取body    
--獲取body信息
local data =ngx.req.get_body_data()
ngx.say(data)
ngx.req.get_body_data()請求體,會偶爾出現(xiàn)讀取不到直接返回nil的情況。如果請求體尚未被讀取,請先調用ngx.req.read_body(或打開lua_need_request_body選項強制本模塊讀取請求體,詞方法不推薦)

14.openresty操作redis
—連接redis
github上的redis連接代碼只是一個示例代碼,生產環(huán)境并發(fā)量過大,可能會崩潰的。
生產環(huán)境redis連接代碼:http://wiki.jikexueyuan.com/project/openresty/redis/out_package.html

15.商品詳情頁方案介紹


image.png

16.twemproxy+redis環(huán)境搭建介紹
Twemproxy是一個Twitter開發(fā)的一個redis代理proxy玩裙,Twemproxy通過引入一個代理層,可以將其后端的多臺Redis或Memcached實例進行統(tǒng)一管理與分配鸯檬,使應用程序只需在Twemproxy上進行操作决侈,而不用關心后面具體有多少個真實的Redis或Memcached存儲,簡單的說喧务,就是有了Twemproxy赖歌,客戶端不直接訪問Redis服務器,而是通過twemproxy間接訪問功茴。
Twenproxy特性:
1.支持失敗節(jié)點自動刪除
2.支持設置HashTag
3.減少與redis的直接連接數
4.自動分片到后端多個redis實例上
5.避免單點問題
6.支持狀態(tài)監(jiān)控
7.使用pipeline處理請求和響應
8.并不是支持所有redis命令

示例:
示例中使用一個twemproxy+兩臺redis(未做主從)
實際部署中需要使用keepalived解決twemproxy單點問題庐冯,并且需要做redis主從
192.168.93.134 twemproxy
192.168.93.133 redis
192.168.93.132 redis
192.168.93.134操作
1.安裝autoconf
    wget [http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz](http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz)
    tar -zxvf autoconf-2.69.tar.gz
    cd autoconf-2.69
    ./configure && make && make install 
2.安裝automake 
    wget [http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz](http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz) 
    tar -zxvf automake-1.15.tar.gz 
    cd automake-1.15 
3.安裝libtool 
    wget [https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz]      (https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz) 
    tar -zxvf lib tool-2.4.6.tar.gz 
    cd lib tool-2.4.6 
    ./configure && make && make install 
4.安裝twemproxy 
    wget [https://github.com/twitter/twemproxy/archive/master.zip](https://github.com/twitter/twemproxy/archive/master.zip) 
    unzip master 
    cd twemproxy-master 
    aclocal 
    autoreconf -f -i -Wall,no-obsolete 
    mkdir /usr/local/twemproxy 
    ./configure --prefix=/usr/local/twemproxy/ 
    make && make install 
5.配置twemproxy 
   將twemproxy-master下的conf目錄復制到/usr/local/twemproxy下 
    cp -r ./conf/usr/local/twemproxy/ 
    cd /usr/local/twemproxy 
    修改conf目錄下nutcracker.yml文件內容 
    alpha: 
        listen:192.168.93.134:22121 
        hash:fnv1a_64 
        distribution:ketama 
        atuo_eject_hosts:true 
        redis:true 
            server_retry_timeout:2000
            server_failure_limit:1
            servers:
                -192.168.93.133:6379:1
                -192.168.93.134:6379:1
    啟動twemproxy  
    注意192.168.93.133與192.168.93.134上的redis要啟動
    并需要關閉防火墻service iptables stop
6.測試  

17.openresty模版渲染介紹
導入lua-resty-template
下載:http://luarocks.org/modules/bungle/lua-resty-template
將template.lua文件復制到openresty/lualib/resty/目錄下
示例
nginx.conf
設置模版路徑:set $template_root /usr/local/openresty/nginx/html/remplates;
設置mimeType類型:default_type text/html;
導入lua文件:content_by_lua_file /usr/local/openresty/nginx/conf/*.lua
lua腳本文件
local template = require “rest.template”
content={
message = “Hello,World!”,
names = {“james”,”fox”,”tony"}
}
template.render(“demo.html”,content);

18.商品詳情頁展示
Java生成靜態(tài)頁面放到nginx目錄下(使用freemarker)
local template = require "resty.template" --調用模版
local redis = require “resty.redis_iresty”
local red = redis:new()
local msg = red:get("num")
if ngx.null == msg then
return ngx.say("獲取庫存失敗")
end
local context = {
title = "京東商品",
-- 從redis中獲取庫存信息坎穿,在頁面中顯示
num = msg
}
local request_uri = ngx.var.request_uri
template.render(string.sub(request_uri,2),context);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末展父,一起剝皮案震驚了整個濱河市返劲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栖茉,老刑警劉巖篮绿,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衡载,居然都是意外死亡搔耕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門痰娱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弃榨,“玉大人,你說我怎么就攤上這事梨睁【ňΓ” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵坡贺,是天一觀的道長官辈。 經常有香客問我,道長遍坟,這世上最難降的妖魔是什么拳亿? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮愿伴,結果婚禮上肺魁,老公的妹妹穿的比我還像新娘。我一直安慰自己隔节,他們只是感情好鹅经,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怎诫,像睡著了一般瘾晃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幻妓,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天蹦误,我揣著相機與錄音,去河邊找鬼肉津。 笑死胖缤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的阀圾。 我是一名探鬼主播哪廓,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼初烘!你這毒婦竟也來了涡真?” 一聲冷哼從身側響起分俯,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哆料,沒想到半個月后缸剪,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡东亦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年杏节,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片典阵。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奋渔,死狀恐怖,靈堂內的尸體忽然破棺而出壮啊,到底是詐尸還是另有隱情嫉鲸,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布歹啼,位于F島的核電站玄渗,受9級特大地震影響,放射性物質發(fā)生泄漏狸眼。R本人自食惡果不足惜藤树,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拓萌。 院中可真熱鬧也榄,春花似錦、人聲如沸司志。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骂远。三九已至,卻和暖如春腰根,著一層夾襖步出監(jiān)牢的瞬間激才,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工额嘿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘸恼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓册养,卻偏偏與公主長得像东帅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子球拦,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容