前端配置化平臺——快速搞定活動頁面
痛點及要求
- 成本比較高:廣告活動平臺,一直以來都是變化最多耗用人力最多的一件事情,而且每次都要研發(fā)配合去開發(fā)新的頁面,每個頁面又只使用兩三天。
- 業(yè)務(wù)對平臺的基本要求:C端的穩(wěn)定性,B端的靈活性。
- 技術(shù)對平臺的要求:服務(wù)穩(wěn)定要在 99.999%
項目介紹
配置化平臺主要功能是可以靈活、方便、快捷生成活動等相關(guān)頁面,降低開發(fā)成本,新活動生成無需額外的開發(fā)工作,只需簡單配置即可快速上線。此次介紹內(nèi)容分別從后臺配置及用戶端闡述,在開始之前先簡單介紹一下 Openresty 和 Lua。
Openresty
OpenResty(又稱:ngx_openresty)是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內(nèi)部集成了大量精良的 Lua 庫、第三方模塊以及大多數(shù)的依賴項,用于方便地搭建能夠處理超高并發(fā)、擴展性極高的動態(tài) Web 應(yīng)用、Web 服務(wù)和動態(tài)網(wǎng)關(guān)。
OpenResty 的目標(biāo)是讓你的 Web 服務(wù)直接跑在 Nginx 服務(wù)內(nèi)部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠(yuǎn)程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進(jìn)行一致的高性能響應(yīng)。所以對于一些高性能的服務(wù)來說,可以直接使用 OpenResty 訪問 Mysql 或 Redis等,而不需要通過第三方語言(PHP、Python、Ruby)等來訪問數(shù)據(jù)庫再返回,這大大提高了應(yīng)用的性能。
Lua
Lua 是一種輕量小巧的腳本語言,用標(biāo)準(zhǔn) C 語言編寫并以源代碼形式開放,其設(shè)計目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴展和定制功能。
Lua特性
- 輕量級:它用標(biāo)準(zhǔn) C 語言編寫并以源代碼形式開放,編譯后僅僅一百余 K,可以很方便地嵌入別的程序里。
- 可擴展:Lua 提供了非常易于使用的擴展接口和機制,由宿主語言(通常是 C 或C++)提供這些功能。Lua 可以使用它們,就像是本來就內(nèi)置的功能一樣。
- 其它特性:
支持面向過程(procedure-oriented)編程和函數(shù)式編程(functional programming);
自動內(nèi)存管理。只提供了一種通用類型的表(table),用它可以實現(xiàn)數(shù)組,哈希表,集合,對象;
語言內(nèi)置模式匹配;閉包(closure);函數(shù)也可以看做一個值;提供多線程(協(xié)同進(jìn)程,并非操作系統(tǒng)所支持的線程)支持;
通過閉包和 table 可以很方便地支持面向?qū)ο缶幊趟枰囊恍╆P(guān)鍵機制,比如數(shù)據(jù)抽象,虛函數(shù),繼承和重載等。
應(yīng)用場景
游戲開發(fā)
獨立應(yīng)用腳本
Web 應(yīng)用腳本
擴展和數(shù)據(jù)庫插件,如:MySQL Proxy 和 MySQL WorkBench
安全系統(tǒng),如入侵檢測系統(tǒng)
后臺配置

后臺配置相關(guān)流程中涉及 Openresty、Nginx、Lua 腳本、ElasticSearch、Redis 等。

Nginx配置
部分 nginx.config 配置如下:
1、Server 配置
在 server 配置中還導(dǎo)入了 locations 下的部分配置,配置如下:
當(dāng)請求 url 匹配到包含 /example/ 時,對于請求數(shù)據(jù)進(jìn)行處理,其中包含:
單條JSON限制為5M
lua對于請求訪問階段處理
轉(zhuǎn)發(fā)到Es服務(wù)
單條 JSON 限制以及請求方式的攔截都可以在配置當(dāng)中清晰地了解到,再看一下 Lua 到底做了些什么?
2、Lua 相關(guān)
在此配置化平臺中,Lua 的主要作用是為了同步數(shù)據(jù)到 Redis 中,這樣當(dāng)用戶端訪問數(shù)據(jù)的時候,如果是已經(jīng)存在 Redis 中且未過期的情況下,那么將會直接讀取 Redis 中的數(shù)據(jù),而不是通過 ES 服務(wù)來獲取數(shù)據(jù)。
接下來看一下具體實現(xiàn)。首先,在 location 引入 lua 相關(guān)的配置,通過 access_by_lua_file 來嵌入 lua 相關(guān)處理。
(1)鏈接 Redis
(2)PUT、POST請求數(shù)據(jù)緩存
鏈接 Redis 成功之后,開始針對請求訪問進(jìn)行處理,如果是 PUT、POST 請求對數(shù)據(jù)進(jìn)行緩存處理,并設(shè)置緩存過期時間,代碼如下:
(3)DELETE 請求清除緩存
當(dāng)請求方式為 DELETE 時,將數(shù)據(jù)從 Redis 數(shù)據(jù)中進(jìn)行清除,并將緩存過期時間設(shè)置為0,代碼如下:
ElasticSearch
ElasticSearch,簡稱 ES。ES 是一個開源的高擴展的分布式全文搜索引擎。它可以近乎實時地存儲、檢索數(shù)據(jù)。本身擴展性很好,可以擴展到上百臺服務(wù)器,處理 PB 級別的數(shù)據(jù)。ES 也是用 Java 開發(fā)并使用 Lucene 作為其核心來實現(xiàn)所有索引和搜索的功能,但是他的目的是通過簡單 RESTful API來隱藏 Lucene 的復(fù)雜性,從而讓全文搜索變得簡單。
ElasticSearch 對比傳統(tǒng)關(guān)系型數(shù)據(jù)庫:
- Elasticsearch-head 插件
對于 ES 具體的數(shù)據(jù)我們可以通過 elasticsearch-head 插件來查看索引、類型、分片、文檔等信息,如下圖所示:

- ES 后臺配置
以欄目配置為例,其中包含 settings 中的分片設(shè)置,mappdings 中針對 menu 欄目配置的相關(guān)字段,elasticsearch-head 插件中的部分索引信息如下:
用戶端

此前,我們通過配置化平臺后臺配置一些相關(guān)活動相關(guān)的數(shù)據(jù),并存放在 ES 服務(wù)以及Redis 中。在用戶端時,當(dāng)有用戶訪問到我們生成好的活動頁面時,首先在 Nginx 中通過 content_by_lua_file 配置使用 Lua 對于活動配置相關(guān)的請求處理,對于非 GET 方式的請求將會直接返回 403,否則會在 Redis 中去查詢相關(guān)的數(shù)據(jù)并返回到用戶端。
- 用戶端 Nginx 中 server 配置
- Lua 在用戶端的請求訪問處理
在后臺配置中已經(jīng)提到 Lua 鏈接 Redis 以及針對不同的請求方式的攔截處理,接下來看一下在用戶端相關(guān)處理,代碼如下:
可以看到對于非 Get 方式的請求進(jìn)行攔截,并返回 403,否則將鏈接 Redis,代碼如下:
推薦閱讀:
點個“在看”和“贊”吧,
畢竟我是要成為前端網(wǎng)紅的人。
