序言
JMicro是一個用Java語言實現的開源微服務全家桶,源碼地址:https://github.com/mynewworldyyl/jmicro,Demo地址:http://jmicro.cn/ 。功能簡介: https://www.cnblogs.com/jmicro/p/13276739.html
對Demo服務器說明,否則你可能會誤解JMicro的可靠性。
由於服務器性能比較差(華為雲免費30天服務器,單核CPU+2G內存),服務器上面同時啟動10個左右JVM,所以部分服務運行時間長了后會因申請不到足夠內存而被強制退出,但由於使用JMicro實現的服務編排系統,服務會被重新啟動,此方式同時證明JMicro在極端環境下的高可用性。
下面以JMicro核心組件部署架構圖為基礎,講構JMicro核心功能,並附一個可運行的部署實例。
一, 部署架構
(1) 6大類核心組件
上圖從下到上分別為客戶端,API網關(API Gateway),應用服務器(InternalBussinessServer),消息服務器(PubsubServer),監控服務器(MonitorServer),熔斷器(BreakServer)
(2)客戶端
JMicro支持通過HTTP,WebSocket及Socket訪問服務,三者遵循相同的JMicro數據包協議,意味着不管使用什么語言,只要遵循JMicro數據包協議,就可以作為JMIcro客戶端訪問JMicro開放的服務接口。目前實現了瀏覽器端的HTTP及Websocket訪問API,Java客戶端訪問API,NodeJS訪問API,以后視需要會不斷加入其他語言的客戶端API實現。客戶端支持請求響應模式及消息推送模式,消息推送模式即從服務端推消息到客戶端,相當於一個請求多個響應,消息推送模式需要長連接支持(即Socket及WebSocket)。
(3)API網關(API Gateway)
客戶端需要通過API網關才能訪問JMicro服務,內部服務通過API網關暴露服務給外部訪問,API網關相當於服務器與客戶端之間一道防火牆。一般API網關同時開放一個靜態資源訪問端口,比如http://jmicro.cn/ 開放了80端口提供后台管理靜態頁面訪問。API網關支持主備模式以解決服務單點問題,並且支持多個從服務。如下圖1主1備的API網關實例HA ENABLE =true表示啟用高可用,IS MASTER=true表示主節點,false表示備用節點。
多個主從節點又可以構成API網關集群。如下圖在服務編排系統的兩個配置,表示啟動2+2=4個實例,每兩個實例組成主備服務,兩個配置的instanceName值不同所以構成集群。如果值相同,那就會構成主備服務,比如編號為7的配置instanceName的值如果改為apigateway,則兩個配置共4個實例將構成1主3備的服務。
(4)消息服務PubsubServer
為JMicro量身定制的消息服務,通過他可以實現RPC同步轉異步,而RPC調用者感覺不到同步和異步的差別。傳統發消息接口一般都是先把數據封裝為消息類的實例,然后調用相應的消息接口發送消息,JMicro也支持這種方式,但同時提供更加友好的方式。比如下面通過消息隊列發送郵件,
傳統方式是:
Message msg = new Message(); msg.setTopic("mailTopic");
msg.to("ZhangSan"); msg.SetContent("Hello JMicro"); msgServerProxy.sent(msg);
JMicro方式
@Reference private MsgServerProxy zs; //代表ZhangSan提供的一個郵件服務,JMicro發現@Reference注解會自動注入服務代理實例
zs.helloJmicro("Hello JMicro"); //使用者像調用普通方法一樣就把郵件內容通過消息隊列發送出去。
通過上面的比較,我們應該能明白為什么JMicro重做消息隊列這個輪子,就是為JMicro 量身定做的消息服務,並且是非常輕量的消息服務。
和API網關一樣,消息服務也可以做主備服務及多個主備服務組成集群,這兩個模式幾呼通用於JMicro任何服務實現,如監控服務,熔斷器服務,服務編排系統中的分配器服務,資源管理器服務,以及自己實現的服務(JMicro原生支持,不需要做額外的開發)。目前唯一不能適用集群及主備模式的是編排系統的主機宿主代理服務,以后再細說。
(5)監控服務
監控服務分為主服務和分析服務,主服務負責收集其他服務上報數據,並根據各分析服務的需要分發數據。比如日志持久化分析服務對日志類的數據感興趣,則主服務只將日志數據分發給他,別的不會分發給他。而服務流量統計分析服務器只對RPC請求及響應兩個動作感興趣,則分發服務剛將這兩個動作的事件分發給他。
監控服務器從客戶端到服務端都是異步的消息傳輸,所以能支持非常高並發量,但是另一方面,即無法確保數據一定不丟失。監控服務本身主要用於數據統計,比如算超時百分比,RPC的QPS,偶爾丟失一個兩個,對結果並無影響。
監控服務器可以把加工好的數據通過消息服務發送出去,感興趣的服務則可以通過服務方法訂閱這些數據。比如熔斷器服務對RPC調用的超時百分比值感興趣,則可以訂閱這個數據,如果超時百分比大於服務方法配置的值,則熔斷此服務。
JMicro的監控服務就像人的神輕系統對於人的作用一樣,監控特性植根於JMicro應用的每一個細胞中,為JMicro“智能大腦”提供數據支持。如果你打開JMicro后台就會發現,將近一半的功能與監控有直接或間接關系,因為對於微服務系統,發現問題比避免問題更有價值,並且更有可行性。
(6)熔斷器
熔斷器說白話點就是服務的開關,在沒辦法的情況下,直接切斷服務,不讓客戶端再直接調用服務,防止服務“雪崩”。比如一個高並發的客戶端調用服務B,B又調用C,C又調用D,依此類推直到服務G才返回,如果某個時刻G不可用,那么F再調用G得到的結果也是因為“超時”而失敗,既然結果都是失敗,為什么要等到超時才失敗呢?所以還不如“快速失敗”,讓調用鏈直接返回。如果高並發情況下,每個請求都等到G超時才失敗返回,整個系統就卡在這了,這就是RPC系統引起的“雪崩”。
友好的熔斷器不應該直接返回“系統錯誤”,也不是“404”或“500”,這會讓調用者無所適從,而應該返回一個服務應該返回的類型的默認值。JMicro服務實現者應該考慮清楚在極端情況下,怎么樣才能讓調用者更舒服地接受返回值,讓調用者覺得獲得的結果和正常調用結果一樣。
(7)應用服務器(InternalBussinessServer)
意為內部的業務服務器,一般部署於內網,不直接對外網提供服務,但可通過API網關提供對外網服務,此規則只是一般情況下如此,並不是絕對如此,實際上,如果需要,服務也可直接暴露於外網,而不需要通過API網關,而即使如此,也應該視為邏輯上的內部服務,內部服務通過外網相互調用。
服務與服務之間可以相互調用(當然前提是不引起死循環或死鎖),也就是互為客戶端。服務的類型和數量都是動態的,可以隨時加入和退出,JMicro中,服務客戶端代理可以先於服務提供者而存在,是一種松耦合關系,當然,也可以強制服務提供者一定要先於服務調用者而存在。服務與服務之間非常靈活且多變。應用服務器組成的集群網絡就好像一個菜市場,”人們“可以自由出入,自由買賣,一個商家可以賣多種菜,每種菜也可由多個商家賣。“人們”可以決定買那種菜,買多少,自由組合,結果是他們開什么類型的飯店,湯粉店還是蘭州拉面,還是海鮮太酒店,完全由菜品的組合決定。JMicro服務應用組合講究的也是這種自由市場,積木式的服務組合應用,所以上面部署圖唯獨應用服務里面的小方形所代表的服務是亂序無規則排列的。而你觀察http://jmicro.cn/里面的進程列表,也是經常有進程退出,新進程進來,因為當前單機服務很少,所以有時服務會斷開,如果服務數量足夠多,肯定感覺不到服務斷開!
二, 部署實例
(1) 安裝依賴
以使用windows做開發環境,linux部署環境為例
首先在windows上安裝JDK,maven,nodejs ,npm及cnpm,並配置好PATH環境變量
linux 上安裝Zookeeper監聽在2181端口,Redis工作在6379端口,選裝mongodb端口27017,保持默認配置啟動,ps命令結果如下圖所示
(2)java源碼及構建
首先從 https://github.com/mynewworldyyl/jmicro 下載源碼到指定目錄,以${base_dir}指代根目錄,
運行如下命令構建全部Jar包
cd ${base_dir} mvn clean install -Dmaven.test.skip=true
(3) 構建后台管理的前端資源文件
首先修改${base_dir}/mng.web/public/js/rpc.js文件的IP地址為你機器的IP,端口保持默認9090
構建后台前端代碼,首先確保安裝好nodejs,npm及cnpm, npm及cnpm區別請自己網上查資料
cd ${base_dir}/mng.web
cnpm run build
在${base_dir}/mng.web/dist目錄下內容為構建好的資源文件
(4)Linux部署目錄結構
按下圖建目錄
根目錄為/home/ubuntu0/jmicro,可以是任意目錄;
0agent及1agent代表兩台機器的兩個JMicro宿主代理工作目錄,因為我現在只有一台機器,所以建兩個目錄代表兩台機器,實際生產部署中這樣做沒多太意義;
controller表示服務分配器工作目錄;
respserver表示資源服務器工作目錄;
resp用於資源服務器存放全部資源,也就是運行用到的全部Jar包;
mngweb存放后台管理靜態頁面,JS,CSS等資源
(5)上傳Jar包resp目錄
在(2)構建成功后,可在其下相應的target目錄找到以下Jar包
首次部署需要借助FTP工具將Jar包上傳到resp目錄,此demo路徑為/home/ubuntu0/jmicro
Jar包路徑分別為:
\jmicro\agent\target
\choreography\choreography.agent\target
\choreography\choreography.controller\target
\choreography\choreography.repository\target
將(3)構建好${base_dir}/mng.web/dist目錄下的全部文件上傳到mngweb目錄下,如下圖
(6) 編寫啟動腳本
以下服務啟動成功與否都可以通過如下命令查看日志
tail -fn300 nohup.out
資源服務
cd /home/ubuntu0/jmicro/respserver touch start.sh chmod +x start.sh vi start.sh
start.sh 內容如下,注意按自己的環境修改對應目錄路徑
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar -Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/resp/jmicro-choreography.repository-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ -D/ResourceReponsitoryService/dataDir=/home/ubuntu0/jmicro/resp &
/ResourceReponsitoryService/dataDir=/home/ubuntu0/jmicro/resp 這個目錄一定不能配錯,否則部署服務會啟動失敗
啟動資源服務器
./start.sh
controller服務
cd /home/ubuntu0/jmicro/controller respserver touch start.sh chmod +x start.sh vi start.sh
命令內容如下
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar \
-Xmx64m -Xms16m \ -jar /home/ubuntu0/jmicro/resp/jmicro-choreography.controller-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ -D/StaticResourceHttpHandler/staticResourceRoot_mng=/home/ubuntu0/jmicro/mngweb \ -DapiGatewayExportHttpIP=192.168.1.129 -DapiGatewayListenHttpPort=80 \ -DmngJarFile=jmicro-main.mng-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ -DapiGatewayJarFile=jmicro-main.apigateway-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-DinitGatewayAndMng=false &
apiGatewayExportHttpIP=192.168.1.129即為(3)步修改的rpc.js文件中對應的IP,
/StaticResourceHttpHandler/staticResourceRoot_mng=/home/ubuntu0/jmicro/mngweb 這個就是上面上傳的JS,CSS,HTML頁面所在目錄, 這個一定不能配錯,
否面頁面打不開
啟動控制器
./start.sh
部署兩個宿主代理
在0agent目錄下建start.sh文件,以下命令如果涉及目錄,則需根據自己的情況做修改,此Demo根目錄為/home/ubuntu0/jmicro
cd /home/ubuntu0/jmicro/0agent touch start.sh chmod +x start.sh vi start.sh
start.sh文件內容如下
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar \
-Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/resp/jmicro-choreography.agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar &
啟動
./start.sh
部署1agent
cd /home/ubuntu0/jmicro/1agent cp ../0agent/start.sh ./
啟動
./start.sh
以上命令全部執行成功后,jps命令可以看到如下6個進程,前面4個是我們通過腳本啟動的主機代理進程,資源服務進程,控制器進程。
后面兩個是控制器進程在第一次啟動時自動為我們創建的兩個部署實例,對應API網關和后台管理服務。
到這里,就可以在瀏覽器中打開后台管理頁面,瀏覽器中輸入 http://192.168.1.129:9090,如下圖是看到是進程實例,是不是和上面JPS輸出的很相似
以上部署實例並不能完全呈現部署結構圖,即使API網關及管理服務都還存在單點問題,監控器,熔斷器,消息服務器等服務都還沒部署。 為防止視角疲勞,確保單篇文章簡短,更多部署及開發實例,留待下回分享