1,Jerry 为何而生
以 Java web 举例, 现在的网站系统开发模式, 对于 web 端和服务端的数据交互以及页面渲染, 无外乎两种:
第一种是交给后端处理, Jsp,Freemark 模板引擎之流, 这种开发模式需要前端人员做好静态页面交给后端去处理一些其它工作. 这种开发模式到如今也依旧流行, 这也是招聘 Java web 程序员要求也要会 html,JS,CSS 的原因. 到现在基本上都是采用这种开发模式, 注意这种模式并非真正的前后端分离!
另一种是交给前端处理, 前端全部完成 web 端的页面渲染工作. 要知道的是, 前端处理只能使用 JS, 一些前端 JS 模板引擎也有不少, 无论再花哨, 本质依旧是 JS. 不可忽视的是, 完全依赖 JS 处理前端页面存在弊端, 如果没弊端的话那第一种模式也早就淘汰了.
2,Jerry 是什么
Jerry 是帮助前后端完全分离的工具, 它可以帮助后端工程师只做后端, 前端工程师只做前端.
3,Jerry 的模式
一种完全真正的前后端分离, Jerry 采用如今最流行的 JSON 作为前后端数据交互的接口.
对后端工程师来说, 只需要关心接口的实现, 不需要再接触前端页面, 甚至不要求懂 HTML,JS 等.
只做接口有什么优势? 一套接口适用 web,Android,ios 各个平台, 这对软件项目的可扩展性大大提升. 不可否认的是, 现在依旧有些网站采用后端直接返回 html 片段的开发模式, 这对软件的扩展性非常不利.
对前端工程师来说, 任务脉络更为清晰而简洁. 一是对页面进行类似 JSP 形式的渲染, 这在之前是由后端工程师来做的. 可以说是完全颠覆以往. 而且, 非 JS 渲染, 自然不存在 JS 渲染页面的弊端.
4,Jerry 的优势
快! 启动快, 毫秒级的启动!
响应快, 配置后台监控, 响应时间一览无遗.
优先读取各种文件的缓存, 使用 EhCache 实现.
对于后端接口, 在缓存的基础上使用负载均衡. 负载均衡算法为加权轮询.
对于日志监控等耗时而且响应无关的操作, 全部运行在其它线程.
如果你还有其它加快速度的方法, 欢迎留言私信.
轻! 轻量级, 没有过多依赖, 大部分功能能自己实现就自己写. 全部依赖如下:
- Netty
- slf4j + logback
- fastjson
- ehcache
- jsoup
- junit4
自带监控系统. 对页面的响应速度以及 HTTP 信息一览无遗.
5,Jerry 语法
Jerry 渲染 HTML 页面的语法类似 EL 表达式. 形如:${字段名}, 我们称之为取名为 JE 表达式.
例如, 服务端的 JSON 数据为:
- {
- "message": "响应成功",
- "state": {
- "message": "ok",
- },
- "data": [{
- "time": "2018-04-25 13:25:07",
- }, {
- "time": "2018-04-25 13:25:07",
- }]
- }
如果我们想获取 message 的值渲染到 html 页面, 只需要在 html 页面写入:${message}
对于 state 对象里的 message, 可以写入:${state.message}
对于 data 数组对象里的 time 值, 可以写入:${data[0].time}
值得一提的是, JE 暂时不支持 if else,while 等语法, 这将是下一个版本的首要解决问题.
6, 监控系统
监控系统对各个页面与文件的响应耗时与请求信息进行监控, 监控频率可以在全局配置文件中进行自定义配置, 默认为 10s.
对于监控日志可以自定义输出目录, 目录只支持相对路径(也就是只能在 webapps 目录下), 监控日志格式为 JSON.
默认提供的监控页面位于 webapps/manage 项目下. 默认访问: http://ip 地址: 8888/manage http://xn--ip-im8ckc:8888/manage
后台监控页面预览:
监控系统运行流程:
7, 负载均衡
需要说明的是, 对于 Jerry 的负载均衡与 Nginx 的负载均衡是不一样的. 换一个角度来说, 拥有 cache 的 Jerry 负载均衡功能更强大. 因为 Jerry 已经缓存了整个文件, 包括经过渲染后的含有 JE 与法的文件. 所以在缓存时间内, 它只会访问后端接口一次, 只有缓存失效后, 才会再次访问. 如果你想体验加权负载均衡, 可以把缓存时间设置为 1. 然后不断刷新页面. 关于如何设置负载均衡, 参考接口配置.
8, 全局配置
全局配置文件位于 config 目录下, 使用默认 UTF-8 编码进行读取. 详细配置如下:
- # 开启端口
- port=8888
- # 默认首页
- index=index.html
- # 默认项目
- project=ROOT
- # 全局 404 模板(webapps/)
- 404=/template/404.html
- # 接口配置文件名, 要求内容为 Json
- config=page.json
- # 接口配置文件的编码
- charset=UTF-8
- # 监控刷新频率(毫秒 / ms)
- monitor=10000
- # 监控文件目录(webapps/)
- monitorLog=/manage/log.json
- # 缓存: 最大存储元素个数
- maxElementsInMemory=10000
- # 缓存: 最大发呆时间(秒 / s)
- timeToIdleSeconds=120
- # 缓存: 最大存活时间(秒 / s)
- timeToLiveSeconds=600
- # 控制台日志级别 INFO/DEBUG
- level=INFO
Jerry 把所有的 web 项目与页面都放在了 webapps 下, 服务器也只会响应 webapps 目录下的文件.
关于全局 404 模板, 默认即可. 不过也支持自定义.
关于接口配置文件, 默认 page.json. 你可以自定义, 但一定必须是 json 内容, 而且位于项目根目录下(如 ROOT/page.json).
接口配置文件的编码就是 page.json 文件的读取时的编码格式. 默认 utf-8
监控刷新频率. 最低为 1s, 默认 10s.
上面缓存的意思是在有效的 600 秒 (10 分钟) 内, 如果连续 120 秒 (2 分钟) 未访问缓存, 则缓存失效. 就算有访问, 也只会存活 600 秒.
当你想查看运行日志时, 切换为 debug 即可. 默认 info.
9, 接口配置
先看一下示范文件, 下面进行讲解.
- [
- {
- "page": "index.html",
- "id": "je",
- "method": "GET",
- "timeout": 20000,
- "header": {
- "Connection": "keep-alive"
- },
- "inter": [
- {
- "link": "https://www.kuaidi100.com/query?type=shentong&postid=3374107234608&id=1",
- "weight": 1
- },
- {
- "link": "https://www.kuaidi100.com/query?type=yuantong&postid=801371015800473775",
- "weight": 2
- }
- ]
- },
- {
- "page": "admin/index.html",
- "id": "je",
- "method": "GET",
- "timeout": 20000,
- "header": {
- "Connection": "keep-alive"
- },
- "inter": [
- {
- "link": "https://www.kuaidi100.com/query?type=shentong&postid=3374107234608&id=1",
- "weight": 1
- }
- ]
- }
- ]
属性 | 说明 |
---|---|
page | HTML 文件路径。如配置 xxx 相当于:项目名 / xxx |
id | ID 名称。要求同一个 page 一定要有不同的 id。 |
method | 对后端接口发起请求时的方法。 |
timeout | 对后端接口发起请求的超时时间。 |
header | 对后端接口发起请求时的 header。 |
inter | 后端接口对象,可以定义多个实现负载均衡。 |
link | 后端接口实际地址。 |
weight | 权重,用于负载均衡。 |
10, 一些其它问题
1,Linux 与 Windows
在 Linux 部署 Jerry 服务器, 访问文件严格区分大小写. 而在 Windows 对大小写不敏感.
举个例子, 访问 / ROOT 和 / ROOt 时, 在 Windows 是可以的, 在 Linux 是失败的.
如果在使用中您还遇到了其它 Bug, 欢迎在我的码云项目或者博客给我留言评论.
2, 关于编码
对于不需要 JE 处理的 HTML 文件来说, 不涉及编码问题.
对于需要 JE 处理的 HTML 文件, 你在 HTML 文件中声明的 < meta charset="UTF-8">关乎如何解析你的文件. 若出现乱码, 请检查你的 HTML 文件.
3, 如何启动
下载 zip 压缩包, 解压后执行 java -jar 文件名即可运行.
如使其在后台运行, 在末尾加个 & 即可.
然后使用的问题, 一般来说, 看看 ROOT 项目如何做的, 在查看上面的文档, 就差不多懂了.
11, 作者有话
- Gitee: https://gitee.com/zyzpp/JerryServer
- Github: https://github.com/yueshutong/JerryServer/
来源: https://www.cnblogs.com/yueshutong/p/9600961.html