一種專門用於先後端分離的web服務器(JerryServer)

若是你還不瞭解如今的先後端分離,推薦閱讀淘寶前端團隊的先後端分離的思考與實踐html

一、問題

隨着如今整個軟件開發行業的發展,在開發模式上逐漸由之前的一我的完成服務端和前端web頁面,演變爲前端和後端逐漸分離的趨勢。在安卓、IOS等移動設備開發基本已經成型,先後端達到了徹底分離。但是在web網站開發中,先後端依舊高耦合、難分離;後端開發人員難以像開發安卓、IOS等移動端同樣,只須要面向接口編程,而不用關心web頁面的邏輯設計。前端

網站開發在先後端的分離上也進行了一部分發展,好比出現了Vue.js,React.js等前端js框架,使用起來能夠說是很方便。但不可忽視的是,使用js去渲染頁面是把壓力轉移到了客戶端,並且使用js渲染頁面會致使SEO(搜索引擎爬取不到頁面信息)等問題。java

因此,在服務端處理頁面並返回視圖也是如今另外一種流行的開發模式。在Java web開發中,出現了JSP動態頁面,動態渲染頁面並返回視圖到瀏覽器客戶端。隨着發展,JSP現現在也被FreeMarker、Thymeleaf等更加輕量的模板引擎逐漸取代,逐漸成爲主流。可是這種方式形成了後端開發人員難以擺脫HTML頁面,如今的公司依舊有不少後端工程師去作這部分工做。node

綜上所述,爲了完全解決上面的兩個問題,既能實現前端與後端的徹底分離,而又不須要使用js去渲染頁面。咱們在服務端處理頁面的基礎上發明了一種改變傳統網站開發模式的web服務器,解決web開發中先後端難分離的問題。linux

本發明能夠把後端人員對頁面的處理的工做交還給前端去作。後端人員只須要面向接口編程,而沒必要接觸前端HTML頁面的實現。原來須要後端去寫FreeMarker語法邏輯去渲染HTML頁面的工做交由前端人員去作。本質上只是分離了這部分工做安排,而並無改變工做的內容。git

二、定義

Jerry服務器是相似Tomcat的web服務器,幫助先後端徹底分離的工具,它能夠幫助後端工程師只作後端,前端工程師只作前端。github

三、技術效果

  1. 先後端分工更加明確,後端只須要面向接口編程,只關心後端業務邏輯,不關心前端的實現。
  2. 前端再也不只寫靜態頁面,還要使用FreeMarker語法寫頁面邏輯。
  3. 後端的一套業務接口適用於安卓、IOS、web等平臺設備,提升服務端系統的擴展性。
  4. 改變了傳統開發中要求後端人員必須學習HTML、JavaScript、Css等前端技能。
  5. 本服務器能夠用於開發過程當中的調試階段,由前端人員進行使用,並將最終寫好邏輯的HTML文件放在項目中上線;也能夠將本服務器直接用於線上環境,成爲項目中的一部分。這兩種均可以達到先後端分離開發的目的。

四、附圖說明

圖1:在傳統Java web開發中的運行流程圖web

解釋:此流程圖中只有request部分是前端負責,其他均爲後端負責。編程

1536482289885

圖2:使用本發明以後的Java web運行流程圖json

1536482313227

本項目的核心思想是代理服務器的角色,對於瀏覽器發起的請求,代理服務器接收後會提取請求中的相關信息,如GET或POST參數、Cookie,攜帶並轉發至後端提供的接口。

對於後端來講,就好像只收到了瀏覽器發出的請求,代理服務器徹底能夠被後端人員忽略掉。

代理服務器收到後端的響應內容,提取響應頭中的Set-Cookie值,並處理響應體(JSON),使用FreeMarker模板引擎渲染到HTML文件,攜帶Set-Cookie一塊兒響應給瀏覽器,對於瀏覽器用戶來講,就好像只與服務端進行通訊。

五、安裝使用

  1. 前往Git倉庫克隆/下載Zip壓縮包到本地電腦。

  2. 解壓後只需保留如下3個目錄或文件,其它所有刪除便可:

    • /config
    • /webapps
    • JerryServer-1.0.0-SNAPSHOT.jar
  3. 在控制檯執行java -jar JerryServer-1.0.0-SNAPSHOT.jar命令運行該jar包。Linux系統如使其在後臺運行,在末尾加個&便可。

  4. 訪問http://localhost:8888出現以下界面(默認訪問ROOT項目的index.html文件)

    1537158441757

    訪問 http://localhost:8888/admin 並更改不一樣參數,體驗動態渲染。

    1537158422954

  5. 安裝成功!

六、模板引擎

Jerry 使用 FreeMarker 做爲模板引擎。

例如,服務端接口:

{
    "message": "響應成功",
    "state": {
        "message": "ok",
    },
    "data": [{
        "time": "2018-04-25 13:25:07",
    }, {
        "time": "2018-04-25 13:25:07",
    }]

}

HTML頁面:

message:${message}<br>
    com: ${com}<br>
    data[0].time:${data[0].time}

其它用法請參考FreeMarker學習網站:FreeMarker開發手冊

七、後臺監控

監控系統對各個頁面與文件的響應耗時與請求信息進行監控,監控頻率能夠在全局配置文件中進行自定義配置,默認爲10s。

對於監控日誌能夠自定義輸出目錄,目錄只支持相對路徑(也就是隻能在webapps目錄下),監控日誌格式爲JSON。

默認提供的監控頁面位於webapps/manage項目下。默認訪問:http://localhost:8888/manage

後臺監控頁面預覽:

八、負載均衡

對於FreeMarker頁面的後端接口支持使用加權負載均衡。關於如何設置負載均衡,請參考接口配置。

九、全局配置

全局配置文件位於config目錄下,使用默認UTF-8編碼進行讀取。詳細配置以下:

#開啓端口
port=8888
#默認首頁
index=index.html
#默認項目
project=ROOT
#全局404模板(webapps/)
404=/template/404.html
#接口配置文件名,要求內容爲Json
config=page.json
#接口配置文件的編碼
js_charset=UTF-8
#解析接口響應的編碼
jk_charset=UTF-8
#請求接口超時時間ms
timeout=10000
#FreeMarker文件編碼
fm_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目錄下的文件。

  1. 關於全局404模板,默認便可。不過也支持自定義。
  2. 關於接口配置文件,默認page.json。你能夠自定義,但必定必須是json內容,並且位於項目根目錄下(如ROOT/page.json)。
  3. 接口配置文件的編碼就是page.json文件的讀取時的編碼格式。默認utf-8
  4. FreeMarker文件編碼是設置處理FreeMarker文件的編碼。
  5. 監控刷新頻率。最低爲1s,默認10s。
  6. 上面緩存的意思是在有效的600秒(10分鐘)內,若是連續120秒(2分鐘)未訪問緩存,則緩存失效。就算有訪問,也只會存活600秒。
  7. 當你想查看運行日誌時,切換爲debug便可。默認info。

十、接口配置

先看一下示範文件,下面進行講解。

[
  {
    "page": "index.html",
    "id": "je",
    "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&id=1",
        "weight": 2
      }
    ]
  },
  {
    "page": "admin/index.html",
    "id": "je",
    "inter": [
      {
        "link": "https://www.kuaidi100.com/query?type=shentong&postid=3374107234608&id=1",
        "weight": 1
      }
    ]
  }
]
屬性 說明
page HTML文件路徑。
id ID名稱。
inter 後端接口對象,能夠定義多個實現負載均衡。
link 後端接口實際地址。
weight 權重,用於負載均衡。

在Jerry正式版中,採用FreeMarker做爲模板引擎,一個(FreeMarker)HTML文件只能有一個配置。

十一、一些其它問題

1,Linux與Windows

在Linux部署Jerry服務器,訪問文件嚴格區分大小寫。而在Windows對大小寫不敏感。

舉個例子,訪問/ROOT和/ROOt時,在Windows是能夠的,在Linux是失敗的。

若是在使用中您還遇到了其它Bug,歡迎在個人Git或者博客給我留言。

2,關於編碼

全項目默認UTF-8,不過也提供配置支持自定義。

對於不須要語法處理的HTML文件來講,不涉及編碼問題。

對於須要語法處理的HTML文件,統一配置在config配置文件。

若出現亂碼,請檢查你的配置。

3,是否是造Node.Js的輪子

關於Node.Js,在作這個的時候我真的不知道它是幹啥的。由於我是一名Java後端工程師。
如今瞭解了Node.Js後,感受Node.Js和個人這個web服務器的角色都是中間的代理服務器,從二者渲染HTML頁面的方式上來看,本質仍是不一樣的。Node.Js使用的JS進行編程式渲染,須要寫代碼邏輯,個人web服務器使用的FreeMarker模板引擎,直接在HTML上寫表達式語法,相比較之下,個人web服務器更簡單,更方便。非但如此,JerryServer服務器更符合服務拆分的思想。NodeJs雖然起到了先後端分離的做用,但也加大了前端人員的業務需求,許多後端的業務今後轉爲了前端。JerryServer輕量簡單可分佈式擴展,如何選擇,還須要根據實際狀況判斷。

十二、更新日誌

2018/9/8:修復接口數據爲數組解析失敗的BUG。

2018/9/9:升級改版,主要是把接口配置簡化。實行一個頁面一個接口配置的策略。

把接口和頁面進行綁定。訪問頁面的method、header和body就是請求接口的method、header和body。

支持GET請求,POST請求等。

關於請求體類型,除了 multipart/form-data 格式,binary二進制流(圖片等),其他格式都支持。默認UTF-8解碼與編碼。

2018/9/10:去掉JSOUP依賴,使用HttpURLConnection進行網絡請求。

2018/9/18:修復URL路徑問題,訪問目錄默認訪問目錄下index.html(可自定義)

2018/9/21: 改用線程池管理日誌線程

1三、尾聲

禁止申請專利!

若使用出現Bug等問題,請到如下地址留言評論,或者加入QQ羣交流。

個人博客:https://yueshutong.cnblogs.com/

Github:https://github.com/yueshutong/JerryServer/

Gitee:https://gitee.com/zyzpp/JerryServer

開源中國:https://www.oschina.net/p/jerryserver

相關文章
相關標籤/搜索