zxpnet网站 zxpnet网站
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

zxpnet

一个爱学习的java开发攻城狮
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 大后端课程视频归档
  • 南航面试题
  • 并发编程

  • 性能调优

  • java8语法

  • lombok

  • 日志

  • 工具类

  • spring

  • mybatis

  • springboot

  • redis

  • zookeeper

  • springcloud

    • springcloud开源项目
    • nacos

    • eureka

    • openfeign

    • gateway网关

    • zipkin链路追踪

    • sentinel

    • seata

      • seata基础
      • seata整合springboot项目
        • 引入starter
          • 分析自动装配
        • 坑:
          • 数据源被seata进行了代理,rebel的坑
          • jpa自增的坑
          • 序列化问题
    • TX-LCN

  • dubbo

  • netty

  • springsecurity

  • mq消息中间件

  • shiro

  • beetle

  • 模板引擎

  • jpa

  • 数据结构与算法

  • 数据库知识与设计

  • gradle

  • maven

  • bus

  • 定时任务

  • docker

  • centos

  • 加解密

  • biz业务

  • pigx项目

  • 开源项目

  • 品达通用权限项目-黑马

  • 货币交易项目coin-尚学堂

  • php

  • backend
  • springcloud
  • seata
shollin
2021-07-20
目录

seata整合springboot项目

  • 引入starter
    • 分析自动装配
  • 坑:
    • 数据源被seata进行了代理,rebel的坑
    • jpa自增的坑
    • 序列化问题

# 引入starter

参考官方推荐方式: Seata部署指南 (opens new window)

<!--seata与spring boot starter-->
		<dependency>
			<groupId>io.seata</groupId>
			<artifactId>seata-spring-boot-starter</artifactId>
			<version>${seata.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
			<exclusions>
				<exclusion>
					<groupId>io.seata</groupId>
					<artifactId>seata-spring-boot-starter</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

image-20210720182012158

# 分析自动装配

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.seata.spring.boot.autoconfigure.SeataPropertiesAutoConfiguration,\
io.seata.spring.boot.autoconfigure.SeataDataSourceAutoConfiguration,\
io.seata.spring.boot.autoconfigure.SeataAutoConfiguration,\
io.seata.spring.boot.autoconfigure.HttpAutoConfiguration
1
2
3
4
5
6
@ConditionalOnProperty(prefix = SEATA_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
public class SeataAutoConfiguration {}
1
2
  • SeataProperties: seata.enabled=false 可以关闭seata

  • 注入GlobalTransactionScanner的条件:springApplicationContextProvider、failureHandler

  • 默认TxServiceGroup的前缀: ${spring.application.name}-seata-service-group 如 cloud-api-order-seata-service-group

@ConditionalOnBean(DataSource.class)
@ConditionalOnExpression("${seata.enable:true} && ${seata.enableAutoDataSourceProxy:true} && ${seata.enable-auto-data-source-proxy:true}")
public class SeataDataSourceAutoConfiguration {}
1
2
3

注入了SeataAutoDataSourceProxyCreator、SeataDataSourceBeanPostProcessor

# 坑:

# 数据源被seata进行了代理,rebel的坑

如果项目以jrebel启动,jrebel会生成代理对象,seata又加了一层代理,因此启动时会出现以下异常。是说没有advised这个字段

Caused by: java.lang.NoSuchFieldException: advised
	at java.lang.Class.getDeclaredField(Class.java:2070) ~[na:1.8.0_291]
	at io.seata.spring.util.SpringProxyUtils.getAdvisedSupport(SpringProxyUtils.java:91) ~[seata-all-1.4.2.jar:1.4.2]
	at io.seata.spring.util.SpringProxyUtils.findInterfaces(SpringProxyUtils.java:59) ~[seata-all-1.4.2.jar:1.4.2]
	at io.seata.spring.annotation.GlobalTransactionScanner.wrapIfNecessary(GlobalTransactionScanner.java:257) ~[seata-all-1.4.2.jar:1.4.2]
	... 34 common frames omitted
1
2
3
4
5
6

原因分析:

这是因为反射时找不到字段而报出,seata1.4.2中io.seata.spring.util.SpringProxyUtils#findTargetSpringClass中获取代理对象的方法targetSource.getTargetClass()引起的。

在1.4.1 之前,对于TargetSource这个对象, 认为就是静态对象,所以直接取的targetSource.getTargetClass()

在1.4.2版本,又完全认为是一个动态对象,而这里的问题就是获取一个被代理的动态对象时,实际上是不能获取这个对象的, 只能获取这个对象的类型.

解决办法:

  • 不要用jrebel启动,因为他会创建一个代理对象,请读源码:SpringProxyUtils里面的getAdvisedSupport()方法

seata 踩坑记录_流离岁月的博客-CSDN博客 (opens new window)

# jpa自增的坑

jpa自增,是依靠数据库表hibernate_sequence获取下一个id值,以确保当前数据库的所有表id唯一。 seata开启全局事务,会报Failed to fetch schema of hibernate_sequence 异常

解决办法:

  • 修改主键生成策略,默认为@GeneratedValue auto, 修改成 @GeneratedValue(strategy=GenerationType.IDENTITY) 按表的自增字段进行自增

# 序列化问题

修改seata的换序列化方式 配置中心中配置client.undo.logSerialization=kryo,默认为jackson ,client端再引入kryo的依赖包

<dependency>
			<groupId>com.esotericsoftware.kryo</groupId>
			<artifactId>kryo</artifactId>
			<version>2.24.0</version>
		</dependency>
		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo</artifactId>
			<version>5.1.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.esotericsoftware/kryo-shaded -->
		<dependency>
			<groupId>com.esotericsoftware</groupId>
			<artifactId>kryo-shaded</artifactId>
			<version>4.0.2</version>
		</dependency>

		<dependency>
			<groupId>de.javakaffee</groupId>
			<artifactId>kryo-serializers</artifactId>
			<version>0.45</version>
		</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

日期格式,默认0000用datetime格式时会反序列化出错,用timestamp时,就没有出错。 hibernate注解:@CreationTimestamp @UpdateTimestamp

//@CreatedDate
@Column(name="create_time",columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
@CreationTimestamp
private Date createTime;

//@LastModifiedDate
@
b'v\是、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、20000000000000000000000000000000000000000000000000000000000000000000.、      .0 0.      
@Column(name="update_time",columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Date updateTime;
1
2
3
4
5
6
7
8
9
10

image-20210726182624413

记seata集成nacos序列化异常问题 - luckyangg - 博客园 (cnblogs.com) (opens new window)

参考文章:

分布式事务之Seata | 君哥的学习笔记 (it235.com) (opens new window)

seata基础
TX-LCN分布式事务管理

← seata基础 TX-LCN分布式事务管理→

最近更新
01
国际象棋
09-15
02
成语
09-15
03
自然拼读
09-15
更多文章>
Theme by Vdoing | Copyright © 2019-2023 zxpnet | 粤ICP备14079330号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式