NGINX 向云原生演进,All in OpenNJet
在一些blog/文档网站中,常常需要增加一些访问留言、访问计数。由于很多网站是静态的,所以需要增加这些动态内容时有些挑战,常常需要在页面中埋点,增加对某些外部公共服务的引入。但实际上NJet具备数据的持久化能力,内置了高性能的KV存储。详见官网,基于这个特性,可以在不依赖任何外部系统(无论是公有云服务,还是企业额外部署的外部数据存储系统)的情况下,使得静态网站增加数据能力,变得动态化。下面就通过为NJet官网本身增加访问计数,来看下如何使用NJet的KV存储能力的。
NJet官网介绍
NJet官网是由hugo构建的静态网站,利用hugo,NJet的开发人员可以编写markdown格式的文件,hugo可以把该文件render成blog(hugo的使用请参考https://gohugo.io, 在此不在赘述)。总之,产生的页面如下图所显示,
为了对NJet网站的访问者的兴趣点有更好的关注,NJet的社区运维人员想在blog的页面中增加访问计数,比如在作者前面增加。修改目前的“BY {xxx} {date}” 为 “ reading count:{} BY {xxx} {date}”
1.1 修改前端展示:
NJet官网的blog页面模板为themes/universal/layouts/_default/single.html. 所以不需要逐个修改单独的页面,仅仅修改该页面就可以生效。因为我们要在作者前面增加访问计数,所以在该文件中,
{{ if isset .Params "authors" }}
{{ i18n "authorBy" }} {{ range $index,
author := .Params.authors }}{{ if index }}, {{ end }}{{ $author }}{{ end }}
上述代码片段前增加:
{{ partial "partials/visit-counter.html" . }}
并编写:themes/universal/layouts/partials/visit-counter.html,其内容为:
visit-counter holder
var r = new XMLHttpRequest();
r.addEventListener('load', function() {
outTxt='reading count:'
if (this.status== 200) {
outTxt= outTxt+ parseInt(this.responseText)
} else
outTxt= outTxt+ 'error'
document.getElementById('{{ .File.UniqueID }}').innerText = outTxt
})
r.open('GET', '/counter/?page_id=' + {{ .File.UniqueID }} )
r.send()
这样前端内容就修改完成了。 注:以上的前端修改是基于hugo的某个特定主题的。 如果某个网站是维护的静态页面,则仅仅需要把以上的visit-counter的内容,嵌入到需要展示访问计数的地方。
1.2 后端配置:
•打开njet中lua的支持,在配置文件的主配置节添加:
load_module /usr/local/njet/modules/njt_http_lua_module.so;
•增加对/count的处理,在http->server块内增加location:counter,其内容如下:
location /counter {
content_by_lua_block {
local kv = require("njt.kv")
local args, err = njt.req.get_uri_args()
local key = args["page_id"]
local counter=0;
local rc,msg = kv.db_kv_get(key)
if rc == 0 then
counter= msg
end
counter= counter+1
kv.db_kv_set(key,counter)
njt.say(counter)
}
}
以上代码中,根据传入的查询参数page_id, 更新NJet内置的KV存储中的对应内容,并返回更新的数据。在NJet重起后,可以通过curl http://yourwebsite/counter?page_id=xxx进行测试。可以看到每调用一次返回值从1开始,一直累加。
1.3 展示:
部署新的网站前端后,再次访问,可以看到如下的效果,访问计数展示出来了
2. 参考
- NJet kv lua接口,需要NJet2.0以上版本。
- NJet kv能力相信介绍,请参考:官网
- NJet 官网, 基于hugo universal主题构建,由NJet作为web server
NJet应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面,NJet具备动态配置加载、主动式健康检测、集群高可用、声明式API等多种强大功能。通过CoPliot副驾驶服务框架,在隔离控制面和数据面的情况下实现了高可扩展性。NJet应用引擎助力企业实现云原生技术的平滑升级并大幅降低IT运营成本。 官网 邮件组