2019独角兽企业重金招聘Python工程师标准>>>

应用原理: 使用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>

转载于:https://my.oschina.net/jeffreyning/blog/1558859

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

  1. iis7 您无权使用所提供的凭据查看此目录或页面。_使用Spring Cloud和Docker构建微服务架构

    原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do作者:Alexander Lukyanc ...

  2. winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] [编者的话]如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构.本文 ...

  3. iis7 您无权使用所提供的凭据查看此目录或页面。_使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

    点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 原文:https://dzone.com/articles/microservic ...

  4. 【转】Go Micro(2)——微服务工具箱

    微服务工具箱 现在你也许听到了这个新现象:微服务.如果你对此不熟悉也有兴趣学习,欢迎参考上一篇文章. 这篇文章我们将讨论 Micro - 一个开源的微服务工具箱,Micro 提供了核心的必须工具来构建 ...

  5. micro、M3O微服务系列(一)

    本系列以go,micro3为主 文章目录 软件开发的预测 什么是微服务 为什么使用微服务 什么是micro 理清微服务的关键字 微服务必然涉及的服务发现 使用go和micro构建全球服务网络 隧道 路 ...

  6. micro、M3O微服务系列(三)

    文章目录 概述 安装 主机上(本地安装) go方式 docker binary kubernetes 服务器 特征 用法 帮助 基础命令 命令行 内置命令 signup login 动态命令 User ...

  7. 开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器...

    JeeWx捷微4.0   微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...

  8. JAVA版微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器

    JeeWx捷微4.0   微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...

  9. go micro微服务资料

    微服务从入门到实践 下面的内容主要汇总自[学院君],这些文章条例清晰.步骤详细.明白易懂,在这里学到了之前浅尝辄止.不求甚解的东西,非常感谢! 概念篇(免费) 开篇:什么是微服务架构 微服务架构总体实 ...

最新文章

  1. Pytorch中多GPU训练指北
  2. 由浅入深CIL系列【目录索引】+ PostSharp AOP编程【目录索引】
  3. 发现check_nginx.sh 里的一个小bug~~~
  4. python自学步骤-怎么自学python,大概要多久?
  5. 再来一次的C语言贪吃蛇小游戏(二)
  6. 针对C++异常的学习
  7. python运用列表编写水仙花数_Python 实现找出所有水仙花数的方法
  8. Linear-chain CRF的推导
  9. 计算机信息技术行业代码,行业代码 是什么呢
  10. 声波转字符c语言代码,声波传输解码
  11. signature=daa3bbe3ad9a7c162ba9d98f8d9e7530,来用百度密语吧!!!
  12. 同步检波 matlab,AgilentN9030A|安捷伦N9030A|KeysightN9030A|是德N9030A|频谱分析仪
  13. V for vendetta
  14. 杜洋面包板入门电子制作学习笔记 第2集
  15. 导出Excel—外部表不是预期的格式
  16. 深入理解JVM一之解析class文件
  17. 巴西柔术_成为组织柔术大师
  18. 《仙剑奇侠传3》流程攻略4
  19. EasyRecovery16绿色版安装下载及使用教程
  20. java 查看堆外内存占用_Java堆外内存排查小结

热门文章

  1. vue2.0 watch的注意事项
  2. ***K近邻Survey-Distance总结
  3. 游戏开发:OpenGL入门学习
  4. Boost锁~临界区保护和临界资源共享
  5. android 标准字体,文字规范标准(IOS/Android)
  6. java版b2b2c社交电商spring cloud分布式微服务:服务消费(Ribbon)
  7. 利用互斥体阻断想哭蠕虫,实现联网升级
  8. 【03】把 Elasticsearch 当数据库使:简单指标
  9. form、document.all[].value的数字处理
  10. 业务架构、信息架构、技术架构三位一体,互联网营销