概述
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閘道器,服務路由,高可用,分散式鎖和分散式事務,日誌收集,鏈路監控等,請加關注!