使用nhmicro提供的micro-datasource嵌入式的解决微服务架构中分布式事务问题
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
應(yīng)用原理: 使用micro-datasource數(shù)據(jù)源使事務(wù)與線程解耦,通過(guò)groupid在其他線程進(jìn)行事務(wù)提交或回滾。 多個(gè)系統(tǒng)需要統(tǒng)一提交時(shí),通過(guò)activemq發(fā)送提交消息(含有g(shù)roupid),各系統(tǒng)收到消息后進(jìn)行統(tǒng)一提交或回滾。
micro-datasource數(shù)據(jù)源與Mybatis或hibernate或jdbcTemplate等orm框架可以整合使用 原理是micro-datasource包中提供了路由數(shù)據(jù)源方案,通過(guò)aop動(dòng)態(tài)切換普通數(shù)據(jù)源和分布式數(shù)據(jù)源 使用普通數(shù)據(jù)源時(shí)仍接受傳統(tǒng)事務(wù)管理器管理
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>分布式數(shù)據(jù)源配置樣例:
<!– micro分布式數(shù)據(jù)源 --><bean id="local_xa_dataSource" class="com.nh.micro.datasource.MicroXaDataSourceFactory" factory-method="createDataSource" init-method=“init”><!– 多個(gè)micro分布式數(shù)據(jù)源實(shí)例時(shí)可設(shè)置不同的dataSourceId 默認(rèn)為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動(dòng)態(tài)切換數(shù)據(jù)源配置 --><bean id="dynamic_xa_dataSource" class="com.nh.micro.datasource.MicroDynamicDataSource" ><property name="targetDataSources"> <map key-type="java.lang.String"> <!– 設(shè)置目標(biāo)數(shù)據(jù)源為分布式事務(wù)數(shù)據(jù)源 --> <entry key="local_xa_dataSource" value-ref="local_xa_dataSource"></entry> </map> </property> <!-- 默認(rèn)目標(biāo)數(shù)據(jù)源為主庫(kù)普通數(shù)據(jù)源 --> <property name="defaultTargetDataSource" ref="dataSource"/></bean><!-- define the Mybatis SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!– Mybatis引入micro動(dòng)態(tài)切換數(shù)據(jù)源實(shí)例 --><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>設(shè)置切換分布式數(shù)據(jù)源的aop:
<!– 設(shè)置service層或dao層aop用來(lái)動(dòng)態(tài)切換數(shù)據(jù)源 --> <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>代碼中通過(guò)注解設(shè)置哪些方法需切換為分布式數(shù)據(jù)源:
//Mybatis的Dao接口代碼示例,使用@ChangeDataSource注解決定是否切換為分布式事務(wù)數(shù)據(jù)源 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); }執(zhí)行過(guò)程樣例:
//設(shè)置xaGroupId和xaBranchId MicroXaDataSource.setXid(groupId,branchId); //從Spring中取dao接口對(duì)象調(diào)用相關(guān)業(yè)務(wù)方法 TestRep testRep=MicroContextHolder.getContext().getBean("testRep"); Map paramMap=new HashMap(); paramMap.put("meta_key", metaKey); paramMap.put("id", id); testRep.insertInfo(paramMap); //可以在其他的線程中根據(jù)xaGroupId提交或回滾分布式事務(wù) MicroXaDataSourceFactory.getDataSourceInstance(“default”).commit(groupid);設(shè)置事務(wù)提交消息接收和發(fā)送對(duì)象:
//設(shè)置activemq發(fā)送對(duì)象,發(fā)送commit/rollback命令給其他系統(tǒng) <bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsReceiver" init-method="init"> <property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property> </bean> //通知其他系統(tǒng)提交的命令是(groupid為參數(shù)) //commit MicroDataSourceJmsSender.sendXaMsg("commit", groupId); //rollback MicroDataSourceJmsSender.sendXaMsg(“rollback", groupId); //設(shè)置activemq接收對(duì)象,接收從其他系統(tǒng)發(fā)來(lái)的commit/rollback命令,MicroDataSourceJmsReceiver內(nèi)部收到消息后會(huì)負(fù)責(zé)根據(jù)groupid提交或回滾事務(wù) <bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsSender"> <property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property> </bean>轉(zhuǎn)載于:https://my.oschina.net/jeffreyning/blog/1558859
總結(jié)
以上是生活随笔為你收集整理的使用nhmicro提供的micro-datasource嵌入式的解决微服务架构中分布式事务问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vue组件实现tips的总结
- 下一篇: Hive基础