JMicro微服務Hello World

JMICRO發表於2021-05-31

概述

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表示剛剛下載原始碼的根目錄;

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

 

JMicro微服務Hello World

配置環境變數

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

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

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

實現過程

 

JMicro微服務Hello World

服務呼叫關係圖

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

JMicro微服務Hello World

服務介面類圖

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

相關文章