概述

JMicro是本人開發的基於Java實現的微服務框架,前兩天釋出0.0.3正式版本,並已釋出到maven中央倉庫。

專案原始碼github:
https://github.com/mynewworldyyl/jmicro,
Maven地址:
https://mvnrepository.com/search?q=cn.jmicro
Demo:http://jmicro.cn
賬號:test00 密碼:1

JMicro是基於Java技術實現的簡單輕量(相對於Dubbo,Spring Cloud)微服務平臺,讓服務開發者及服務使用者完全面向介面或方法,無需關注底層實現,甚至感覺不到跨程序,跨服務呼叫的存在;可作為Serverless平臺基礎,跨系統,跨平臺,跨語言無差別的一致性使用方式。多租戶,賬號許可權控制,SSL連線(web端同樣支援,非HTTPS);原生支援JVM級別的主備實現,多例項叢集及縱向分散式解決方案,快取,分散式鎖,原生支援服務路由及負載均衡,可靈活配置的日誌分析及呈現方案,精細化的RPC鏈路監控可以看到RPC相關的全部細節並可重現回放;支援分散式事務;內建高效能可靠訊息服務;

安裝依賴

JMicro依賴ZK及Redis,為了方便入門的同學,我提供這兩包的下載連結如下:

Windows版本Redis:
https://pan.baidu.com/s/13i7T1riw10zdqd5oYmJizQ 提取碼:whrl

下載Redis後解壓到任意目錄,雙擊redis-server.exe檔案即可啟動單機版本Redis。

ZK:
https://pan.baidu.com/s/1MLYPLfjUAnkmp1JEjddPJw 提取碼:t58p

下載後解到壓任意目錄,找到bin/zkServer.cmd檔案,雙擊即可執行單機版ZK.

下載並執行樣例原始碼

宣告在前:樣例只是為了模擬RPC遠端服務呼叫及實現方式,並不會真正做下單或支付操作。

從Github
https://github.com/mynewworldyyl/jmicro_demos 下載樣例原始碼到任意目錄,如D:\jmicro_demos。cmd命令列視窗進入到D:\opensource\github\jmicro_demos\expjmicro.helloworld目錄,執行如下命令

mvn clean install -Dmaven.test.skip=true

如無報錯,則進入下一步,如有報錯則根據錯誤提示修正後重新執行以上命令即可。

執行

在每個模組根目錄下,有個start.bat的批處理檔案,用文字編輯器開啟任意一個,裡面指令碼如下:

title expjmicro.helloworld.order
java ^
-Xbootclasspath/a:%MAVEN_RESP_HOME%\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar ^
-javaagent:%MAVEN_RESP_HOME%\cn\jmicro\jmicro.agent\0.0.3-RELEASE\jmicro.agent-0.0.3-RELEASE.jar ^
-jar %MAVEN_RESP_HOME%\cn\expjmicro\expjmicro.helloworld.order\0.0.3-RELEASE\expjmicro.helloworld.order-0.0.3-RELEASE-with-core.jar ^
-DsysLogLevel=2 -DclientId=25500 -DadminClientId=0 -Dlog4j.configuration=%JMICRO_DEMO_HOME%\log4j.xml -Dpwd=1

重點看MAVEN_RESP_HOME和JMICRO_DEMO_HOME這兩個環境變數引用,

MAVEN_RESP_HOME表示我們本地maven倉庫根目錄;

JMICRO_DEMO_HOME表示剛剛下載原始碼的根目錄;

將這兩個變數配置到本機的環境變數中,如我的配置如下圖:

配置環境變數

配置好環境變數後,分別(無先後順序)進入shop,order,payment目錄執行start.bat檔案,如都無報錯誤,則表示啟動3個服務成功;

進入client模組,同樣執行start.bat檔案,client會每間隔3秒呼叫一次shop服務模擬一次商品購買操作,請自行檢視命令列視窗輸出日誌。

如果你按以上操作不能讓服務執行起來,請評論區罵我!

實現過程

服務呼叫關係圖

圖中每個矩形代表一個JVM服務。服務介面關係圖如下

服務介面類圖

ITxShopService:表示商店介面,只提供一個方法Resp<Boolean> buy(int goodId,int num),模擬客戶購買商品,其實現程式碼如下,服務實現類實現介面ITxShopService,並用Component和Service註解,就這樣實現了一個遠端服務,同時通過Reference註解引用訂單服務,是不是很簡單!

@Component
@Service(version="0.0.1")
public class TxShopServiceImpl implements ITxShopService { private final static Logger logger = LoggerFactory.getLogger(TxShopServiceImpl.class); @Reference//引用訂單服務
private ITxOrderService orderSrv; @Override
public Resp<Boolean> buy(int goodId,int num) {
Resp<Boolean> r = new Resp<>(Resp.CODE_FAIL,false);
logger.info("開始購買商品:"+goodId+",數量:" + num);
Good g = new Good();
g.setId(goodId);
r = orderSrv.takeOrder(g,num);//呼叫下單服務
if(r.getData()) {
logger.info("購買商品成功:"+goodId+",數量:" + num);
}else {
logger.info("購買商品失敗:"+goodId+",數量:" + num+",Reason: "+r.getCode()+",msg:"+r.getMsg());
}
return r;
}
}

Client使用商店服務程式碼如下,只需Reference註解ITxShopService上面的服務介面即可獲取服務例項,是不是不敢相信!
@Component  //容器根據此註解例項化元件
public class ShopClient extends PostFactoryAdapter{ private final static Logger logger = LoggerFactory.getLogger(ShopClient.class); //Reference註解獲得Shop服務代理引用
@Reference
private ITxShopService shop; //容器啟動成功後呼叫此方法
@Override
public void afterInit(IObjectFactory of) {
//為了不Block主執行緒,我們在此啟動一個執行緒每間隔3秒呼叫一次商店提供的購買方法
new Thread(()->{
for(;true;) {
try { //呼叫商店服務
Resp<Boolean> rst = shop.buy(1, 1);
if(rst.getCode() != Resp.CODE_SUCCESS) {
//系統組錯誤
logger.info(rst.getMsg()+"," + rst.getCode());
}else if(rst.getData()) {
//業務購買失敗
logger.info("Success buy good");
}else {
//成功
logger.info("Failure buy good");
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
logger.error("",e);
}
}catch(Throwable e) {
logger.error(e.getMessage());
}
}
}).start();
}
}

同理的,下單服務及支付服務實現程式碼請檢視原始碼,在此不再貼出來了,太煩人了。

必須自誇一下

相比當年入門Dubbo的HelloWorld(Spring Clound更別提了,本人至今還沒入門),入門JMicro真的太單了,簡單到不相信中間真的做了遠端呼叫。但中間確實啟動了多個JVM,如果你還不相信,請將每個服務在不同的物理機上啟動,Client也在不同的機器上啟動,看效果是不是一樣!

這種簡單使我不知道再需要說點什麼,Component,Service,Reference註解這需要說嗎?需要說的請評論區回覆,我單獨寫一篇詳細的實現細節。

後面持續發表JMicro實現微服務相關的細節,如超時,重試,熔斷,限流,降級,API閘道器,服務路由,高可用,分散式鎖和分散式事務,日誌收集,鏈路監控等,請加關注!