Java「微服務」還能這麼玩!
- 2020 年 12 月 24 日
- 筆記
”微服務”加個引號是因為這不是傳統定義的微服務架構,頂多算是”小服務”架構,因為服務實例由集群節點統一載入,非獨立部署。下面以圖說明一下服務調用流程。
一、服務調用流程
- 節點主進程:類似於Istio的SideCar,負責對外網路及集群內節點間的通訊,另外提供內置分散式的存儲引擎(目前元數據均存儲於此);
- 節點子進程:負責載入服務實例與服務調用,支援服務實例的熱更新。
1.2. 客戶端調用服務請求經由負載均衡轉發至主進程的WebHost內;
3.4. 主進程根據服務標識將請求通過共享記憶體隊列發給子進程;
5.6. 子進程的服務管理器如果找不到服務實例,則向主進程請求載入已編譯的服務位元組碼;
7.8. 主進程從內置存儲引擎讀取服務模型編譯的位元組碼返回,子進程通過ClassLoader載入並快取服務實例;
9.10. 服務實例調用指定的服務方法返回給主進程的WebHost;
10.11. WebHost返回服務調用結果給客戶端。
以上步驟均為非同步,數據序列化均為類似於webpack的自定義格式。
二、開發流程演示
為了小夥伴們有個直觀的認識,下面演示一個簡單的開發流程。
1. 創建數據結構
通過IDE新建如下圖所示的數據結構,後台自動生成相關的實體程式碼。
實體模型可映射至不同資料庫(Sql, NoSql或內置資料庫)
2. 創建業務服務
通過IDE新建如下圖所示的查詢實體的服務,注意服務方法必須返回CompletableFuture,因為整個架構是全非同步的。
3. 創建用戶介面
通過IDE新建如下圖所示的視圖模型(基於TypeScript的Vue組件),調用後端服務的代理方法後台自動生成,且同樣為非同步(返回Promise)。
整個過程一個瀏覽器搞定,不需要寫一行配置程式碼。
三、並發性能測試
跟同樣是非同步的Spring WebFlux簡單對比測試一下並發呑吐與響應,測試配置為Mac主機(壓測)->4核I7虛擬機(服務)。
- WebFlux:
wrk -t2 -c200 -d20s //10.211.55.8:8080/hello
Running 20s test @ //10.211.55.8:8080/hello
2 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 12.46ms 1.51ms 47.08ms 75.10%
Req/Sec 8.06k 293.27 8.52k 81.00%
320913 requests in 20.01s, 28.16MB read
Requests/sec: 16039.85
Transfer/sec: 1.41MB
- 本框架
wrk -c200 -t2 -d20s -s post_bin.lua //10.211.55.8:8000/api
Running 20s test @ //10.211.55.8:8000/api
2 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.86ms 5.19ms 121.99ms 98.55%
Req/Sec 40.50k 2.11k 46.14k 69.00%
1611550 requests in 20.01s, 242.83MB read
Requests/sec: 80546.35
Transfer/sec: 12.14MB
四、如何安裝嘗鮮
目前僅在Ubuntu20.04上開發測試,暫不準備支援其他非Linux作業系統.
- 從Git clone打包好的運行時(注意是java分支):
git clone -b java //github.com/enjoycode/appbox.deploy.git
- 安裝第三方依賴包
cd 克隆目錄
sudo ./install-dependencies.sh
- 啟動運行
- 首次初始化運行(替換以下節點地址為本機地址):
./appbox --init=10.10.10.10:9000 --peer=1.1.1
- 重啟
./appbox
- 打開瀏覽器訪問IDE
//地址:8000/dev/index.html, 用戶名: Admin 密碼:隨意(暫未實現驗證密碼)
五、本篇小結
整個java實現從7月底開始歷時5個月,中間還繞了1個月的彎路,爭取1至2個月內達到基本可用的狀態,在此歡迎感興趣的小夥伴加入我們!