分布式事务系列--SpringCloud整合byteTCC框架0.4.x版本

欢迎关注公众号:java4all

本文详细记录下,SpringCloud框架整合byteTCC分布式事务框架的过程。这里只展示,一个是springboot项目,引入byteTCC必备的基础步骤,不包括tcc的业务逻辑过程。请优先确定项目使用的springboot和springcloud版本,然后选择对应的byteTCC版本进行整合,0.4.x和0.5.x整合差异较大。总体而言,spring boot 1.x得用0.4.x的版本,0.5.x版本得用spring boot 2.x
版本信息
  • 1.SpringCloud Edgware.SR4
  • 2.SpringBoot 1.5.4.RELEASE
  • 3.byteTCC 0.4.18
  • 4.jdk 7.0及以上版本
  • 5.byteTCC 0.4.x版本仅支持Spring Boot 1.x版本

1.创建bank4项目

创建一个SpringBoo web项目,先贴下完整的项目结构:
在这里插入图片描述

2.引入byteTCC依赖

SpringCloud其他依赖这里不做展示,仅展示byteTCC的依赖,由于gitHub提供的demo中依赖较多,可能是作者在框架内部使用了很多依赖,下面的依赖,如果没有jar冲突,建议保留,如果删除,请做个测试。(下文依赖做过多次调试和测试才保留的,建议慎重删除):

		<!--byteTCC 如果jar不冲突,建议保留,byteTCC内部可能使用了下面的各种依赖-->
		<dependency>
			<groupId>org.bytesoft</groupId>
			<artifactId>bytetcc-supports-springcloud</artifactId>
			<version>0.4.18</version>
			<exclusions>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.3.7.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.10</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.1.1</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.37</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zuul</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zipkin</artifactId>
			<version>1.2.4.RELEASE</version>
		</dependency>
		<!--byteTCC-->

3.配置文件

待修改

server:
  port: 8022
  datasource:
    url: jdbc:mysql://x.x.x.x:3306/user?useAffectedRows=true
    username: xxxx
    password: xxxxxx
    driver-class-name: com.mysql.jdbc.Driver
eureka:
  client:
    service-url:
      default: http://127.0.0.1:8761/eureka
    healthcheck:
      enabled: true
#mybatis:
#  mapper-locations: classpath:mapper/*.xml
#  type-aliases-package: com.java4all.entity

spring:
  application:
    name: bank-server4



4.配置数据源

在byteTCC 0.4.x版本中我们需要封装一下数据源,补偿型service中应该使用org.bytesoft.bytejta.supports.jdbc.LocalXADataSource封装过的数据源。0.5.x版本不需要此步骤。数据建议从配置文件取,不要在java文件中写死。

package com.java4all.config;

import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.bytesoft.bytejta.supports.jdbc.LocalXADataSource;
import org.bytesoft.bytetcc.supports.springcloud.config.SpringCloudConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * 配置数据源
 *
 * 补偿型service中应该使用org.bytesoft.bytejta.supports.jdbc.LocalXADataSource封装过的数据源。
 */
@Import(SpringCloudConfiguration.class)
@Configuration
public class ProviderConfig {

	@Bean(name = "dataSource")
	public DataSource getDataSource() {
		LocalXADataSource dataSource = new LocalXADataSource();
		dataSource.setDataSource(this.invokeGetDataSource());
		return dataSource;
	}

	public DataSource invokeGetDataSource() {
		BasicDataSource bds = new BasicDataSource();
		bds.setDriverClassName("com.mysql.jdbc.Driver");
		bds.setUrl("jdbc:mysql://xx.xx.xx.xx:3306/inst01");
		bds.setUsername("xxxxx");
		bds.setPassword("xxxxx");
		bds.setMaxTotal(50);
		bds.setInitialSize(20);
		bds.setMaxWaitMillis(60000);
		bds.setMinIdle(6);
		bds.setLogAbandoned(true);
		bds.setRemoveAbandonedOnBorrow(true);
		bds.setRemoveAbandonedOnMaintenance(true);
		bds.setRemoveAbandonedTimeout(1800);
		bds.setTestWhileIdle(true);
		bds.setTestOnBorrow(false);
		bds.setTestOnReturn(false);
		bds.setValidationQuery("select 'x' ");
		bds.setValidationQueryTimeout(1);
		bds.setTimeBetweenEvictionRunsMillis(30000);
		bds.setNumTestsPerEvictionRun(20);
		return bds;
	}

	@Bean
	public JdbcTemplate getJdbcTemplate() {
		JdbcTemplate jdbcTemplate = new JdbcTemplate();
		jdbcTemplate.setDataSource(this.getDataSource());
		return jdbcTemplate;
	}

}

5.启动类

启动类中需要引入配置文件,文件由框架提供默认值,注解导入即可。

package com.java4all;

import org.bytesoft.bytetcc.supports.springcloud.config.SpringCloudConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

//引入byteTCC配置
@ImportResource({"classpath:bytetcc-supports-springcloud.xml"})
@Import(SpringCloudConfiguration.class)
//配置扫描的应用包
@SpringBootApplication(scanBasePackages = "com.java4all")
@EnableEurekaClient
@EnableDiscoveryClient
public class Bank4Application {

	public static void main(String[] args) {
		SpringApplication.run(Bank4Application.class, args);
	}

}


6.启动项目

启动项目,即可在注册中心看到项目
在这里插入图片描述

7.创建数据库表

在参与分布式事务操作的表所在的库,必须添加bytejta表;

这里同时添加一个user表,方便演示:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `money` decimal(10,0) DEFAULT NULL,
  `frozen` decimal(10,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `bytejta` (
  `xid` varchar(32) NOT NULL,
  `gxid` varchar(40) DEFAULT NULL,
  `bxid` varchar(40) DEFAULT NULL,
  `ctime` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `money`, `frozen`) VALUES ('1', '10000', '0');

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页