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