JMicro微服務Hello World


概述

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM