fescar分佈式事務管理入門

fescar是阿里開源的一款分佈式事務管理服務,基於GTS和TXC進行開發,目前最高版本爲0.1.3,目前還沒有開源的比較好的分佈式事務管理,基於大家熟知的GTS進行開源,未來也會對springCloud進行支持(目前支持dubbo),個人覺着前景還不錯,先入個門。

github官網地址:https://github.com/alibaba/fescar

首先把源碼下載下來,就拿0.1.3分支舉例

將項目到入到idea中,配置fescar的服務啓動參數。

 啓動成功之後進行例子的啓動,在examples模塊下,配置好數據源以及執行sql腳本。其中undo_log.sql執行的建表需要在每一個數據源的庫裏都存在,記錄着未提交信息,包括執行前的及執行後的數據變化以及操作。

例子是由四個服務組成,分別是用戶、庫存、訂單以及下單業務的服務。參考fescar的wiki:https://github.com/alibaba/fescar/wiki/Quick-Start

之後啓動四個服務就可以了, 最後啓動BusinessServiceImpl,他是依賴其他服務的,邏輯是購買商品,先從庫存中修改數量,再扣錢,下單,在最後跑了一個異常,會將處理回滾,可以打斷點試一下。在拋異常前是提交了數據的,拋異常之後數據回退

 其中遇到的問題

1.啓動example時後不斷報錯,如下,是因爲驅動版本比較低,修改一下test模塊下的pom.xml,我將mysql驅動修改爲5.1.6,mysql版本是8.0.12的

 2.啓動BusinessServiceImpl時報錯,這個不太清楚什麼原因,就是沒有發現dubbo的註冊者,這個在dubbo-*下四個文件中使用的是組播(multicast)的方式,本人改成了使用zk作爲註冊中心後解決,如果還沒有解決先把BusinessServiceImpl中的下的GlobalTransactional註解去掉,啓動調試使dubbo通信沒有問題:

Exception in thread "main" org.apache.dubbo.rpc.RpcException: Failed to invoke the method deduct in the service com.alibaba.fescar.tm.dubbo.StorageService. No provider available for the service com.alibaba.fescar.tm.dubbo.StorageService from registry 224.5.6.7:1234 on the consumer 192.168.109.1 using the dubbo version 2.7.0. Please check if the providers have been started and registered.
	at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:265)
	at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:57)
	at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:241)
	at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:75)
	at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:57)
	at org.apache.dubbo.common.bytecode.proxy1.deduct(proxy1.java)
	at com.alibaba.fescar.tm.dubbo.impl.BusinessServiceImpl.purchase(BusinessServiceImpl.java:46)
	at com.alibaba.fescar.tm.dubbo.impl.BusinessServiceImpl$$FastClassBySpringCGLIB$$9dbefa1d.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at com.alibaba.fescar.spring.annotation.GlobalTransactionalInterceptor$1.execute(GlobalTransactionalInterceptor.java:64)
	at com.alibaba.fescar.tm.api.TransactionalTemplate.execute(TransactionalTemplate.java:52)
	at com.alibaba.fescar.spring.annotation.GlobalTransactionalInterceptor.invoke(GlobalTransactionalInterceptor.java:61)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)
	at com.alibaba.fescar.tm.dubbo.impl.BusinessServiceImpl$$EnhancerBySpringCGLIB$$1c1318d7.purchase(<generated>)
	at com.alibaba.fescar.tm.dubbo.impl.BusinessServiceImpl.main(BusinessServiceImpl.java:79)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

 3.啓動服務example中的dubbo服務時報錯

在test模塊下的pom.xml增加

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.1.0</version>
        </dependency>

4.啓動server的時候報錯,增加啓動參數 -XX:MaxDirectMemorySize=1024M

 5.要保證fescar服務與各個數據源網絡是通的,否則會出現超時的問題

 

fescar服務端可從這裏下載 https://github.com/alibaba/fescar/releases

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章