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