SpringCloud 分布式事务解决方案---TX-LCN分布式事务管理

1:官网地址

http://www.txlcn.org/zh-cn/

2: 部署tx-manager

新建一个SpringBoot 项目

添加pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.6.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.manager</groupId>
	<artifactId>tc-manager</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>tc-manager</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.SR2</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.codingapi.txlcn</groupId>
			<artifactId>txlcn-tm</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

其中

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

依赖用来连接redis客户端工具。如果没有,则无法正常使用redis。

修改application.properties配置文件

 
server.port=7970

spring.application.name=TransactionManager

eureka.client.service-url.defaultZone=http://admin:123456@localhost:9000/eureka
eureka.instance.appname=transaction-manager
eureka.instance.prefer-ip-address=true

#JDBC 数据库配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

#数据库方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

第一次运行可以设置为: create, 为TM创建持久化数据库表

#spring.jpa.hibernate.ddl-auto=validate
spring.jpa.hibernate.ddl-auto=update

TM监听IP. 默认为 127.0.0.1

tx-lcn.manager.host=127.0.0.1

TM监听Socket端口. 默认为 ${server.port} - 100

tx-lcn.manager.port=8070

心跳检测时间(ms). 默认为 300000

tx-lcn.manager.heart-time=300000

分布式事务执行总时间(ms). 默认为36000

tx-lcn.manager.dtx-time=8000

参数延迟删除时间单位ms 默认为dtx-time值

tx-lcn.message.netty.attr-delay-time=${tx-lcn.manager.dtx-time}

事务处理并发等级. 默认为机器逻辑核心数5倍

tx-lcn.manager.concurrent-level=160

TM后台登陆密码,默认值为codingapi

tx-lcn.manager.admin-key=codingapi

分布式事务锁超时时间 默认为-1,当-1时会用tx-lcn.manager.dtx-time的时间

tx-lcn.manager.dtx-lock-time=${tx-lcn.manager.dtx-time}

雪花算法的sequence位长度,默认为12位.

tx-lcn.manager.seq-len=12

异常回调开关。开启时请制定ex-url

tx-lcn.manager.ex-url-enabled=false

事务异常通知(任何http协议地址。未指定协议时,为TM提供内置功能接口)。默认是邮件通知

tx-lcn.manager.ex-url=/provider/email-to/*@.com

开启日志,默认为false

tx-lcn.logger.driver-class-name=KaTeX parse error: Expected 'EOF', got '&' at position 61: …logger.jdbc-url&̲#61;{spring.datasource.url}
tx-lcn.logger.username=KaTeX parse error: Expected 'EOF', got '&' at position 52: …logger.password&̲#61;{spring.datasource.password}

redis 的设置信息. 线上请用Redis Cluster

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

启动文件添加注解

package com.unicom.manager;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer;

@SpringBootApplication
@EnableDiscoveryClient
@EnableTransactionManagerServer
public class DemoApplication {

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

}

浏览器访问:http://localhost:7970/admin/index.html 使用配置文件的密码登录即可(默认密码是codingapi)

3:配置tx-client项目

新建两个springcloud项目,并注册到eureka中

pom.xml添加tx-client的依赖

<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-tc</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>

配置文件添加tx-manager的注册地址

tx-lcn:
  client:
    manager-address: 127.0.0.1:8070

修改配置启动类的注解

package com.wtmlzt.EurekaProvider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;

@EnableEurekaClient
@SpringBootApplication
@EnableDistributedTransaction
@EnableTransactionManagement
public class EurekaProvider01 {

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

}

在服务消费方添加事务管理注解

@RequestMapping("/saveOrder")
@LcnTransaction(propagation = DTXPropagation.SUPPORTS)
public Integer saveOrder(@RequestBody OrderVo vo){
	logger.info("EurekaConsumer>>saveOrder>>vo:" + vo.toString());
    OrderDao.saveOrderHistory(vo)
	int i = orderFeignService.saveOrder(vo);
    if(i==0){
        throws new Exception();    
    }
}

同时在服务提供方也要添加事务管理的注解

@LcnTransaction
public Integer saveOrder(OrderVo vo) {
	System.out.println("provider>>"+ vo.toString());
    return orderDao.saveOrder(vo);
}

它虽然也加了@LcnTransaction这个注解,但由于这里是调用其他服务的,因此这个注解中不能配置其他属性。

这个项目中dao层和Model层相关的代码如tc-client-1完全相同,小伙伴们按照自己喜欢的方式写就可以了。

到这里就大功告成了。小伙伴们可以自己修改一个数据库结构让其中一个数据插入不成功,看看成果。

注意:
1、数据库表结构必须为innoDB
2、在启动类上一定要加入@EnableDistributedTransaction
3、当调用其他服务时@LcnTransaction注解不能加入其他参数
4、被调用的服务@LcnTransaction注解一定要加入propagation = DTXPropagation.SUPPORTS这个配置

1:官网地址

http://www.txlcn.org/zh-cn/

2: 部署tx-manager

新建一个SpringBoot 项目

添加pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.6.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.manager</groupId>
	<artifactId>tc-manager</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>tc-manager</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.SR2</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.codingapi.txlcn</groupId>
			<artifactId>txlcn-tm</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

其中

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

依赖用来连接redis客户端工具。如果没有,则无法正常使用redis。

修改application.properties配置文件

 
server.port=7970

猜你喜欢

转载自blog.csdn.net/lgxzzz/article/details/121258836