【JMicro】微服務部署架構及例項

JMICRO發表於2020-07-27

序言

JMicro是一個用Java語言實現的開源微服務全家桶,原始碼地址:https://github.com/mynewworldyyl/jmicro,Demo地址:http://124.70.152.7  。功能簡介: 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://124.70.152.7  開放了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://124.70.152.7裡面的程式列表,也是經常有程式退出,新程式進來,因為當前單機服務很少,所以有時服務會斷開,如果服務數量足夠多,肯定感覺不到服務斷開!

 

二, 部署例項

  (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=0.0.0.0 \
-DmngJarFile=jmicro-main.mng-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-DapiGatewayJarFile=jmicro-main.apigateway-0.0.1-SNAPSHOT-jar-with-dependencies.jar &
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閘道器及管理服務都還存在單點問題,監控器,熔斷器,訊息伺服器等服務都還沒部署。 為防止視角疲勞,確保單篇文章簡短,更多部署及開發例項,留待下回分享

 

相關文章