1. 概述
本文分享 运维平台。TCC-Transaction 提供了相对精简的运维平台,用于查看在《TCC-Transaction 源码分析 —— 事务存储器》提到的事务存储。目前暂时只有两个功能:
- 查看未完成的事务列表
- 重置事务恢复重试次数
运维平台( Maven 项目 tcc-transaction-server
) 整体代码结构如下:
本文自下而上,Dao => Controller => UI 的顺序进行解析实现。
你行好事会因为得到赞赏而愉悦
同理,开源项目贡献者会因为 Star 而更加有动力
为 TCC-Transaction 点赞!传送门
ps:笔者假设你已经阅读过《tcc-transaction 官方文档 —— 使用指南1.2.x》。
2. 数据访问层
org.mengyun.tcctransaction.server.dao.TransactionDao
,事务Dao 接口,实现代码如下:
|
TCC-Transaction 提供了四种事务存储器,但是目前只支持两种数据访问层的实现:
- JDBC 事务 DAO
- Redis 事务 DAO
2.1 JDBC 事务 DAO
org.mengyun.tcctransaction.server.dao.JdbcTransactionDao
,JDBC 事务 DAO 实现。实现代码如下:
|
-
dataSource
,数据源。配置方式如下:// appcontext-server-dao.xml<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="maxActive" value="50"/><property name="minIdle" value="5"/><property name="maxIdle" value="20"/><property name="initialSize" value="30"/><property name="logAbandoned" value="true"/><property name="removeAbandoned" value="true"/><property name="removeAbandonedTimeout" value="10"/><property name="maxWait" value="1000"/><property name="timeBetweenEvictionRunsMillis" value="10000"/><property name="numTestsPerEvictionRun" value="10"/><property name="minEvictableIdleTimeMillis" value="10000"/><property name="validationQuery" value="SELECT NOW() FROM DUAL"/></bean>// tcc-transaction-server.propertiesjdbc.url=jdbc:mysql://127.0.0.1:33061/TCC?useUnicode=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=123456- 在
appcontext-server-dao.xml
,配置数据源 Bean 对象。 - 在
tcc-transaction-server.properties
,配置数据源属性。
- 在
-
domainSuffix
,domian
和 表后缀(suffix
) 的映射关系。配置方式如下:// jdbc-domain-suffix.propertiesCAPITAL=_CAPORDER=_ORDREDPACKET=_RED- 键 :domain。
- 值 :suffix。
JdbcTransactionDao 代码实现上比较易懂,点击链接查看,已经添加中文注释。
2.2 Redis 事务 DAO
org.mengyun.tcctransaction.server.dao.RedisTransactionDao
,Redis 事务 DAO。实现代码如下:
|
-
jedisPool
,Redis 连接池。配置方式如下:// appcontext-server-dao.xml<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxTotal" value="300"/><property name="maxIdle" value="100"/><property name="minIdle" value="10"/><property name="maxWaitMillis" value="3000"/></bean><bean id="jedisPool" class="redis.clients.jedis.JedisPool"><constructor-arg index="0" ref="jedisPoolConfig"/><constructor-arg index="1" value="${redis.host}"/><constructor-arg index="2" value="${redis.port}" type="int"/><constructor-arg index="3" value="6000" type="int"/><constructor-arg index="4" type="java.lang.String"><null/></constructor-arg><constructor-arg index="5" value="${redis.db}" type="int"/></bean>// tcc-transaction-server.propertiesredis.host=127.0.0.1redis.port=6379redis.password=redis.db=0- 在
appcontext-server-dao.xml
,配置 Redis 连接池 Bean 对象。 - 在
tcc-transaction-server.properties
,配置 Redis 连接池属性。
- 在
-
domainKeyPrefix
,domain 和 Redis Key 前缀(prefix
)的映射。配置方式如下:CAPITAL=TCC:CAP:ORDER=TCC:ORD:REDPACKET=TCC:RED:- 键 :domain。
- 值 :suffix。
RedisTransactionDao 代码实现上比较易懂,点击[链接]https://github.com/YunaiV/tcc-transaction/blob/e54c3e43a2e47a7765bdb18a485860cb31acbb72/tcc-transaction-server/src/main/java/org/mengyun/tcctransaction/server/dao/RedisTransactionDao.java)查看,已经添加中文注释。
3. 控制层
org.mengyun.tcctransaction.server.controller.TransactionController
,事务 Controller。实现代码如下:
|
-
transactionDao
,数据访问对象。配置方式如下:// appcontext-server-dao.xml<bean id="transactionDao" class="org.mengyun.tcctransaction.server.dao.JdbcTransactionDao"/>- 目前运维平台只能读取一个数据源,如果你的数据源是多个,需要对运维平台做一定的改造,或启动多个项目。
-
tccDomain
,项目访问根目录。配置方式如下:// tcc-transaction-server.propertiestcc_domain=- 一般情况下不用配置,如果你放在 Tomcat 根目录。
3.1 查看未完成的事务列表
调用 TransactionController#manager(...)
方法,查看事务列表。实现代码如下:
|
UI 界面如下:
3.2 重置事务恢复重试次数
调用 TransactionController#reset(...)
方法,事务重置重试次数。实现代码如下:
|
UI 界面如下:
666. 彩蛋
可能有人会吐槽运维平台怎么做的这么简陋。这个不是 TCC-Transaction 一个开源项目存在的问题,其他例如 Dubbo、Disconf 等等都会存在这个情况。
开源作者因为时间关系,更多的精力关注在核心代码,所以对运维友好性可能花费的精力较少。
当然,因为是开源的关系,我们可以自己做运维平台反向的贡献到这些项目。