文档章节

使用nhmicro提供的micro-datasource嵌入式的解决微服务架构中分布式事务问题

杰睿宁
 杰睿宁
发布于 2017/10/31 17:21
字数 770
阅读 108
收藏 3

应用原理: 使用micro-datasource数据源使事务与线程解耦,通过groupid在其他线程进行事务提交或回滚。 多个系统需要统一提交时,通过activemq发送提交消息(含有groupid),各系统收到消息后进行统一提交或回滚。 输入图片说明

micro-datasource数据源与Mybatis或hibernate或jdbcTemplate等orm框架可以整合使用 原理是micro-datasource包中提供了路由数据源方案,通过aop动态切换普通数据源和分布式数据源 使用普通数据源时仍接受传统事务管理器管理 输入图片说明

jar包下载: 需要使用nh-micro-datasource.jar 依赖

log4j.jar\org.springframework.beans.jar\org.springframework.aop.jar\org.springframework.core.jar\aopalliance.jar

<dependency>
<groupId>com.github.jeffreyning</groupId>
<artifactId>nh-micro-datasource</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

jms通知功能需要使用nh-micro-datasource-msg.jar 依赖geronimo-j2ee-management.jar/geronimo-jms.jar/activemq-core.jar

<dependency>
<groupId>com.github.jeffreyning</groupId>
<artifactId>nh-micro-datasource-msg</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

分布式数据源配置样例:

<!– micro分布式数据源 -->
     <bean id="local_xa_dataSource" class="com.nh.micro.datasource.MicroXaDataSourceFactory" factory-method="createDataSource" init-method=“init”>
       <!– 多个micro分布式数据源实例时可设置不同的dataSourceId 默认为default -->
        <constructor-arg value=“default”/>
       <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password}" />
        <property name="minSize" value=“5" />
        <property name="maxSize" value=“20" />
       <property name=“dirverClassName” value=“com.mysql.jdbc.Driver” />
       <property name=“validationQuery” value=“select 'x' from dual” />
     </bean>
 <!-- micro动态切换数据源配置 -->
  <bean id="dynamic_xa_dataSource" class="com.nh.micro.datasource.MicroDynamicDataSource" >
  <property name="targetDataSources">   
  <map key-type="java.lang.String">
<!– 设置目标数据源为分布式事务数据源 --> 
  <entry key="local_xa_dataSource" value-ref="local_xa_dataSource"></entry>    
  </map>  
  </property> 
<!-- 默认目标数据源为主库普通数据源 --> 
  <property name="defaultTargetDataSource" ref="dataSource"/>
  </bean>
 <!-- define the Mybatis SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!– Mybatis引入micro动态切换数据源实例 -->
        <property name="dataSource" ref="dynamic_xa_dataSource"/>
        <property name="typeAliasesPackage" value="foo.model"/>
    </bean>
 <aop:config>
        <aop:pointcut id="testPointcut" expression="execution( * foo.repository.TestRep.*(..))"/>
        <aop:advisor pointcut-ref="testPointcut" advice-ref="dataSourceAdvice"/>
    </aop:config>

设置切换分布式数据源的aop:

<!– 设置service层或dao层aop用来动态切换数据源 -->
<bean class="com.nh.micro.datasource.DataSourceAdvice" id="dataSourceAdvice">
        <property name="readMethodList">
            <list>
            </list>
        </property>
</bean>
<aop:config>
        <aop:pointcut id="testPointcut" expression="execution( * foo.repository.TestRep.*(..))"/>
        <aop:advisor pointcut-ref="testPointcut" advice-ref="dataSourceAdvice"/>
    </aop:config>

代码中通过注解设置哪些方法需切换为分布式数据源:

//Mybatis的Dao接口代码示例,使用@ChangeDataSource注解决定是否切换为分布式事务数据源
package foo.repository;
import java.util.Map;
import com.nh.micro.datasource.ChangeDataSource;
public interface TestRep {
@ChangeDataSource(name="local_xa_dataSource")
public int updateInfo(Map paramMap);
@ChangeDataSource(name="local_xa_dataSource")
public int insertInfo(Map paramMap);
}

执行过程样例:

//设置xaGroupId和xaBranchId
MicroXaDataSource.setXid(groupId,branchId);
//从Spring中取dao接口对象调用相关业务方法
TestRep testRep=MicroContextHolder.getContext().getBean("testRep");
Map paramMap=new HashMap();
paramMap.put("meta_key", metaKey);
paramMap.put("id", id);
testRep.insertInfo(paramMap);
//可以在其他的线程中根据xaGroupId提交或回滚分布式事务
MicroXaDataSourceFactory.getDataSourceInstance(“default”).commit(groupid);

设置事务提交消息接收和发送对象:

//设置activemq发送对象,发送commit/rollback命令给其他系统
<bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsReceiver" init-method="init">
<property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property>
</bean>
//通知其他系统提交的命令是(groupid为参数)
//commit
MicroDataSourceJmsSender.sendXaMsg("commit", groupId);
//rollback
MicroDataSourceJmsSender.sendXaMsg(“rollback", groupId);
//设置activemq接收对象,接收从其他系统发来的commit/rollback命令,MicroDataSourceJmsReceiver内部收到消息后会负责根据groupid提交或回滚事务
<bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsSender">
<property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property>
</bean>

© 著作权归作者所有

杰睿宁

杰睿宁

粉丝 9
博文 21
码字总数 15442
作品 10
东城
私信 提问
加载中

评论(3)

红薯
红薯
建议把建库脚本放到一个 sql 文件里
杰睿宁
杰睿宁 博主
能保证大部分情况同时commit或rollback就行,传统两阶段提交在repare和commit之间也可能失败。
一只小桃子
一只小桃子
…… 你这个真的是分布式事务么。 消息队列通知两边都提交,两边就100%都提交成功?
脚本化微服务开源框架 - NHMicro

MVC 框架的缺点: 系统按照Controller、Service、Dao层次划分,虽然在建设初期技术结构清晰。但每个业务逻辑代码都分散到不同代码框,业务结构不直观,不利于后期业务重构。 业务代码与MVC技...

杰睿宁
2017/06/23
3K
5
NHMicro 1.1.7 发布,支持 MVC 各层代码热部署

NHMicro 1.1.7 已发布,该版本添加了 micro-mvc 模块。 micro-mvc框架,借助 nhmicro 框架和 groovy 技术使所有的 controller、servicebean、dao 和 sql 脚本都支持动态热部署和调试。 详见:...

杰睿宁
2018/01/12
922
4
NHMicro 1.1.8 已发布,该版本支持与 springmvc 整合

NHMicro 1.1.8 已发布,该版本支持与 springmvc 整合。 整合后 Springmvc 的 controller 只需编写接口,在接口中配置 springmvc 相关注解,业务实现在 groovy中编写,支持热部署。 springmv...

杰睿宁
2018/01/16
787
0
NHMicro 1.1.9 发布,支持与 springcloud 整合

NHMicro 1.1.9 发布,支持与 springcloud 整合 整合后 SpringCloud 的 controller 只需编写接口,在接口中配置 SpringCloud相关注解,业务实现在 groovy中编写,支持热部署。 SpringCloud整合...

杰睿宁
2018/01/18
858
0
NHMicro 添加贷款进件管理与合同模板管理功能

nhmicro添加进件管理功能 提交贷款进件、查看修改进件信息、上传附件、提交审批。 进件列表中点击添加,打开贷款进件申请录入页面 进件列表页面中可查看已录入进件记录 点击启动审批,提交至...

杰睿宁
2017/07/19
778
0

没有更多内容

加载失败,请刷新页面

加载更多

网站安全维护公司对渗透测试php后门分析

很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全...

网站安全
24分钟前
9
0
在github上创建代码仓库时忘记添加.gitignore文件或修改了.gitignore该怎么办?

#清除本地缓存(改变成未track状态) #git rm -r --cached . 表示清除项目中所有文件的本地缓存 git rm -r --cached xxx #xxx表示不想版本控制的文件,比如小编可以输入test.o #.gitignore中的...

博爱飞扬
24分钟前
6
0
Fsimage 与 EditLog定义及合并过程

有很多客户端在向 hdfs 中写数据,同时有很多客户端在查数据,这就涉及到一个响应速度问题。因为只有一个 namenode ,客户端在写的时候,必须迅速记下来。 1. 向 namenode 询问可以存储到哪些...

Garphy
28分钟前
6
0
TI KeyStone C66x开发板处理器、NAND FLASH、NOR FLASH

TL6678F-EasyEVM是广州创龙基于SOM-TL6678F核心板而研发的一款多核高性能DSP+FPGA开发板。开发板采用核心板+底板方式,底板采用沉金无铅工艺的8层板设计,尺寸为247.33mm*139.8mm,它为用户提...

Tronlong创龙
46分钟前
5
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第13题

Choose the best answer. Examine this query: SELECT TRUNC (ROUND(156.00,-2),-1) FROM DUAL; What is the result? A) 16 B) 160 C) 150 D) 200 E) 100 Answer:D (解析:关键就是 round ......

oschina_5359
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部