上一篇讲了Seata-Server
服务端的搭建和配置,我们使用nacos
管理seata-serve
r服务和配置文件。这一篇我们业务微服务和seata-server
打通,实现全局事务。
有一点需要注意,seata-server我们用的是1.4.0版本,客户端我们也要用1.4.0版本,版本对应问题少,
以前的版本 总会出现各种问题,比如:
no available service 'null' found, please make sure registry config correct
no available service 'default' found, please make sure registry config correct
1.4.0版本修改了不少bug,按着官网要求,一般都会成功。
1. 依赖引入
微服务父工程是这样管理spring-cloud-alibaba
依赖的:
<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 https://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.2.11.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>test</name>
<description>test</description>
<packaging>pom</packaging>
<properties>
<!-- Enviroment setting -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring Cloud Settings -->
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<!-- Spring Boot Settings -->
<spring-boot-alibaba-druid.version>1.1.22</spring-boot-alibaba-druid.version>
<mybatis-plus.version>3.4.1</mybatis-plus.version>
<!-- Commons Settings -->
<swagger.version>2.9.2</swagger.version>
<swagger-annotations.version>1.5.21</swagger-annotations.version>
<hutool.version>5.5.2</hutool.version>
<poi.version>4.1.2</poi.version>
<websocket.version>1.5.1</websocket.version>
</properties>
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Boot Begin -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${spring-boot-alibaba-druid.version}</version>
</dependency>
<dependency><!-- mybatis-plus -->
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- Commons Settings -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>${websocket.version}</version>
</dependency>
<!--引入swagger -->
<!-- 排除springfox-swagger2 引入的swagger-annotations、swagger-models 1.5.20版本,手动引入1.5.21版本的jar,
在使用@ApiModelProperty注解在字段上时,如果字段的类型为Long或是int类型, 那么程序启动后,访问swagger-ui.html的页面,程序会报错:
java.lang.NumberFormatException: For input string: "" -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger-annotations.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-annotations.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- install -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
</plugin>
<!-- clean -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>aliyun-repos</id>
<name>Aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
因spring-cloud-alibaba
的管理版本是2.2.1版本,自带的seata客户端是1.1.0,版本不对,参考官方推荐格式,各个微服务引入seata:
<!-- seata -->
<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>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version><!--$NO-MVN-MAN-VER$-->
</dependency>
2. 修改application.yml
修改微服务配置文件,添加seata相关配置
配置信息在GitHub资源中client文件夹中
seata-application.yml
需要修改的主要是nacos的注册和配置,还有其他标有注释的(因是全局统一事务,所以各个微服务应由seata做统一代理),上一节服务端配置包含了客户端配置,可以用nacos中已有的配置,所以这里可以精简
seata:
enabled: true
#注册到seata-server用到的名字
application-id: test123
# 这个和seata-server的配置中保持一致,这使用的默认值
tx-service-group: my_test_tx_group
# 开启seata-server做数据代理
enable-auto-data-source-proxy: true
data-source-proxy-mode: AT
# 这个jdk代理不打开报错
use-jdk-proxy: true
config:
# 修改nacos信息
type: nacos
nacos:
namespace: ""
server-addr: 192.168.1.10:8848
group: SEATA_GROUP
dataId: "seataServer.properties" # 1.4.2新加的属性,配置都在这个里面
username: "nacos"
password: "nacos"
registry:
# 修改nacos信息
type: nacos
load-balance: RandomLoadBalance
load-balance-virtual-nodes: 10
nacos:
# 这个和registry.conf中保持一致
application: seata-server
server-addr: 192.168.1.10:8848
group : DEFAULT_GROUP
username: "nacos"
password: "nacos"
3. 修改项目
-
- 启动入口排除
DataSourceAutoConfiguration.class
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableDiscoveryClient @MapperScan({"com.test.service.**.dao"}) @EnableFeignClients public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } }
- 启动入口排除
-
- 我用了mybatis-plus,在mybatis-plus的配置中开启了事务管理,具体有没有用还不清楚
@Configuration @EnableTransactionManagement public class MybatisPlusConfig { /** * 新的分页插件,一缓和二缓遵循mybatis的规则, * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } @SuppressWarnings("deprecation") @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(false); } }
- 修改注解
将原来服务中的@Transactional
改为@GlobalTransactional
- 修改注解
4. 添加undo_log表
AT模式需要用到,在GitHub资源文件夹的client
目录下,服务提供者和消费者对应的库中都要添加
undo_log-mysql.sql
5. 服务启动
服务启动后,过一会儿能看到RM和TM角色注册成功的信息,同时带有版本号,请注意和服务端一致(1.4.0);seata-server端也有注册成功信息显示。