26-微服务技术栈(高级):分布式事务Seata部署与集成

简介: 在分布式架构系统中,服务不止一个,一个完整的业务链路肯定也不止调用一个服务,此时每个服务都有自己的数据库增删改查,而每一个写操作对应一个本地事务。如果想要确保全部的业务状态一致,也就意味着需要所有的本地事务状态一致,这在我们之前的学习中肯定是不具备的,如何做到跨服务、跨数据源的事务一致性将是本章节的重点学习内容。

一、部署Seata的tc-server

1.下载

下载seata-server地址在:http://seata.io/zh-cn/blog/download.html,版本:1.5.1。或使用提供好的资料中的:seata-server-1.5.1.zip

2.解压

在非中文目录解压缩这个zip包,其目录结构如下:

3.修改配置

修改conf目录下的application.yml文件,内容如下:

server:

 port: 7091


spring:

 application:

   name: seata-server


logging:

 config: classpath:logback-spring.xml

 file:

   path: ${user.home}/logs/seata


console:

 user:

   username: seata

   password: seata


seata:

 config:

   # 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置

   type: nacos

   nacos:

     server-addr: 127.0.0.1:8848

     namespace:

     group: SEATA_GROUP

     username: nacos

     password: nacos

     ##if use MSE Nacos with auth, mutex with username/password attribute

     #access-key: ""

     #secret-key: ""

     data-id: seataServer.properties

 registry:

   # tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等

   type: nacos

   nacos:

     application: seata-server

     server-addr: 127.0.0.1:8848

     group: DEFAULT_GROUP

     namespace:

     cluster: GZ

     username: nacos

     password: nacos


#  server:

#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'

 security:

   secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017

   tokenValidityInMilliseconds: 1800000

   ignore:

     urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

4.在nacos添加配置

特别注意,为了让tc服务的集群可以共享配置,我们选择了nacos作为统一配置中心。因此服务端配置文件seataServer.properties文件需要在nacos中配好。格式如下:

配置内容如下:

# 数据存储方式,db代表数据库

store.mode=db

store.db.datasource=druid

store.db.dbType=mysql

store.db.driverClassName=com.mysql.jdbc.Driver

store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true

store.db.user=root

store.db.password=root

store.db.minConn=5

store.db.maxConn=30

store.db.globalTable=global_table

store.db.branchTable=branch_table

store.db.queryLimit=100

store.db.lockTable=lock_table

store.db.maxWait=5000

# 事务、日志等配置

server.recovery.committingRetryPeriod=1000

server.recovery.asynCommittingRetryPeriod=1000

server.recovery.rollbackingRetryPeriod=1000

server.recovery.timeoutRetryPeriod=1000

server.maxCommitRetryTimeout=-1

server.maxRollbackRetryTimeout=-1

server.rollbackRetryTimeoutUnlockEnable=false

server.undo.logSaveDays=7

server.undo.logDeletePeriod=86400000


# 客户端与服务端传输方式

transport.serialization=seata

transport.compressor=none

# 关闭metrics功能,提高性能

metrics.enabled=false

metrics.registryType=compact

metrics.exporterList=prometheus

metrics.exporterPrometheusPort=9898

其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息。

5.创建数据库表

特别注意:tc服务在管理分布式事务时,需要记录事务相关数据到数据库中,你需要提前创建好这些表。

新建一个名为seata的数据库,运行sql(这些表主要记录全局事务、分支事务、全局锁信息):

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;


-- ----------------------------

-- 分支事务表

-- ----------------------------

DROP TABLE IF EXISTS `branch_table`;

CREATE TABLE `branch_table`  (

 `branch_id` bigint(20) NOT NULL,

 `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

 `transaction_id` bigint(20) NULL DEFAULT NULL,

 `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `status` tinyint(4) NULL DEFAULT NULL,

 `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `gmt_create` datetime(6) NULL DEFAULT NULL,

 `gmt_modified` datetime(6) NULL DEFAULT NULL,

 PRIMARY KEY (`branch_id`) USING BTREE,

 INDEX `idx_xid`(`xid`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


-- ----------------------------

-- 全局事务表

-- ----------------------------

DROP TABLE IF EXISTS `global_table`;

CREATE TABLE `global_table`  (

 `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

 `transaction_id` bigint(20) NULL DEFAULT NULL,

 `status` tinyint(4) NOT NULL,

 `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `timeout` int(11) NULL DEFAULT NULL,

 `begin_time` bigint(20) NULL DEFAULT NULL,

 `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

 `gmt_create` datetime NULL DEFAULT NULL,

 `gmt_modified` datetime NULL DEFAULT NULL,

 PRIMARY KEY (`xid`) USING BTREE,

 INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,

 INDEX `idx_transaction_id`(`transaction_id`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;


SET FOREIGN_KEY_CHECKS = 1;

6.启动TC服务

进入bin目录,运行其中的seata-server.bat即可,启动成功后,seata-server应该已经注册到nacos注册中心了。打开浏览器,访问seata控制台;地址:http://localhost:7091

打开浏览器,访问nacos地址:http://localhost:8848/nacos,然后进入服务列表页面,可以看到seata-server的信息:

二、微服务集成seata

需要进行分布式事务处理的每个微服务上都配置如下:

1.引入依赖

首先,我们需要在每个微服务中引入seata依赖:

<dependency>

   <groupId>com.alibaba.cloud</groupId>

   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>

   <exclusions>

       <!--版本较低,1.3.0,因此排除-->

       <exclusion>

           <artifactId>seata-spring-boot-starter</artifactId>

           <groupId>io.seata</groupId>

       </exclusion>

   </exclusions>

</dependency>

<!--seata starter 采用1.5.1版本-->

<dependency>

   <groupId>io.seata</groupId>

   <artifactId>seata-spring-boot-starter</artifactId>

   <version>${seata.version}</version>

</dependency>

2.修改配置文件

需要修改每个微服务中的application.yml文件,添加一些配置:

seata:

 registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址

   # 参考tc服务自己的application.yml中的配置

   type: nacos

   nacos: # tc

     server-addr: 127.0.0.1:8848

     namespace: ""

     group: DEFAULT_GROUP

     application: seata-server # tc服务在nacos中的服务名称

     cluster: GZ  #无效

 tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称

 service:

   vgroup-mapping: # 事务组与TC服务cluster的映射关系

     seata-demo: GZ

相关文章
|
3月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
829 3
|
2月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
8月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
302 5
|
3月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
503 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
5月前
|
存储 监控 Shell
SkyWalking微服务监控部署与优化全攻略
综上所述,虽然SkyWalking的初始部署流程相对复杂,但通过一步步的准备和配置,可以充分发挥其作为可观测平台的强大功能,实现对微服务架构的高效监控和治理。尽管未亲临,心已向往。将一件事做到极致,便是天分的展现。
|
9月前
|
SQL
seata是怎么进行分布式事务控制的
seata是怎么进行分布式事务控制的
|
11月前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
226 9
|
11月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
878 1
|
存储 运维 数据可视化
如何为微服务实现分布式日志记录
如何为微服务实现分布式日志记录
744 1

热门文章

最新文章