微服务: Seata AT springCloud整合分布式事务以配置方式(中篇)

news/2024/10/30 21:21:59/

目录

上篇: 安装seata 并启动成功的传送门

1. 前言: 

2. springCloud 使用seata at 的步骤如下

第一步 查看springCloud版本

第二步添加maven依赖

第三步 添加yml配置

第四步: 配置数据源(druid) 

第五步 修复一个警告

 第六步: 启动后 看看日志是否成功


上篇: 安装seata 并启动成功的传送门

传送门===> 微服务: Seata AT 分布式事务以及配置方式(上篇)

1. 前言: 

事务概念:  

TC((Transaction Coordinator)): 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM(Transaction Manager):事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager):资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2. springCloud 使用seata at 的步骤如下

第一步 查看springCloud版本

第二步添加maven依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-all</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version></dependency>

第三步 添加yml配置

#pzy 配置分布式事务 
seata:enabled: true # 1.0新特性,需要依赖seata-spring-boot-starter 默认为trueenable-auto-data-source-proxy: true  # 牵扯到回滚tx-service-group: seata_group  # 需要与config.txt中的 service.vgroupMapping.seata_group=default保持一致server:vgroup-mapping:seata_group: default # 需要与config.txt中的 service.vgroupMapping.seata_group=default 保持一致#grouplist:#  default: 127.0.0.1:8091disable-global-transaction: falseregistry:  ## 注册中心type: nacos #注册nacosnacos:application: seata-server  #nacos中seata-server启动注册成功后的服务名称server-addr: *:8848username: *password: *group: SEATA_GROUPnamespace: 49b38634-8a78-4216-a80c-7181976301c5config: ## 配置中心  与register.conf文件中的保持一致type: nacosnacos:server-addr: *:8848group: *#与register.conf文件中的保持一致username: *password: *namespace: 49b38634-8a78-4216-a80c-7181976301c5

第四步: 配置数据源(druid) 

import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;/*** 配置数据源,使用seata对数据源做代理*/
@Slf4j
@Configuration
public class DataSourcesConfig {// V1版本
//    @Value("${mybatis-plus.mapper-locations}")
//    private String mapperLocations;
//
//    @Bean
//    @ConfigurationProperties(prefix = "spring.datasource")
//    public DataSource druidDataSource() {
//        return new DruidDataSource();
//    }
//
//    /**
//     * 使用 io.seata.rm.datasource.DataSourceProxy
//     * @param druidDataSource
//     * @return
//     */
//    @Bean
//    public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
//        return new DataSourceProxy(druidDataSource);
//    }
//
//    @Bean
//    public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
//        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
//        bean.setDataSource(dataSourceProxy);
//        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//        bean.setMapperLocations(resolver.getResources(mapperLocations));
//        return bean.getObject();
//    }//V2 版本@Autowiredprivate DataSourceProperties dataSourceProperties;@Bean(name = "dataSource") // 声明其为Bean实例@Primary // 在同样的DataSource中,首先使用被标注的DataSourcepublic DataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();log.info("dataSourceProperties.getUrl():{}", dataSourceProperties.getUrl());druidDataSource.setUrl(dataSourceProperties.getUrl());druidDataSource.setUsername(dataSourceProperties.getUsername());druidDataSource.setPassword(dataSourceProperties.getPassword());druidDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());druidDataSource.setInitialSize(0);druidDataSource.setMaxActive(180);druidDataSource.setMaxWait(60000);druidDataSource.setMinIdle(0);druidDataSource.setValidationQuery("Select 1 from DUAL");druidDataSource.setTestOnBorrow(false);druidDataSource.setTestOnReturn(false);druidDataSource.setTestWhileIdle(true);druidDataSource.setTimeBetweenEvictionRunsMillis(60000);druidDataSource.setMinEvictableIdleTimeMillis(25200000);druidDataSource.setRemoveAbandoned(true);druidDataSource.setRemoveAbandonedTimeout(1800);druidDataSource.setLogAbandoned(true);log.info("装载dataSource........");return new DataSourceProxy(druidDataSource);}}

[如果是mybatis plus 分页失效的, 部分组件失效的, 请使用这套]

第五步 修复一个警告

Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be....

undertow 设置一下buffer pool,不然他就使用默认,启动时会出现警告

import io.undertow.server.DefaultByteBufferPool;
import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;/***** 解决方案一: 配置文件* 解决方案二: application.properties的配置** @author: pzy* @date: 2023-05-19* @description: 解决启动io.undertow.websockets.jsr UT026010: Buffer pool was not* set on WebSocketDeploymentInfo, the default pool will be used的警告*/
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {@Overridepublic void customize(UndertowServletWebServerFactory factory) {factory.addDeploymentInfoCustomizers(deploymentInfo -> {WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024)
//                    new DefaultByteBufferPool(false, 1024,20,4));deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);});}
}

 第六步: 启动后 看看日志是否成功


http://www.ppmy.cn/news/83098.html

相关文章

【软考】系统集成项目管理工程师 第3章 信息系统集成专业技术知识

文章目录 3.1 信息系统建设3.1.1 信息系统的生命周期3.1.2信息系统开发方法 3.3 软件工程3.3.1软件需求分析与定义3.3.2软件设计、测试与维护3.3.3软件质量保证及质量评价3.3.4软件配置管理3.3.5软件过程管理3.3.6软件开发工具3.3.7软件复用 3.4 面向对象系统分析与设计3.4.1面…

Vue编写的组件库具备按需引入和全局引用的功能

组织组件库 将你的组件库组织在一个目录中&#xff0c;例如 src/components。 src└─ components├─ MyButton.vue├─ MyInput.vue└─ index.js 创建入口文件 在组件库的目录中创建一个名为 index.js 的入口文件。在该文件中&#xff0c;导入每个组件&#xff0c;并定义一…

Linux 常用远程连接工具你用过几个?

想必大家对linux不陌生&#xff0c;但是一提起如何远程连接它可能一头雾水&#xff0c;今天通过下面的几个工具来简单探讨一下常用的linux远程连接工具的使用&#xff0c;希望对你的日常使用有所帮助。 1、Xshell 介绍&#xff1a; xshell 是一个非常强大的安全终端模拟软件…

Cesium 实战 - 模型亮度调整(解决模型非常暗的问题)

Cesium 实战 - 模型亮度调整&#xff08;解决模型非常暗的问题&#xff09; 环境版本试错过程解决问题在线示例 在某个项目中&#xff0c;遇到个问题&#xff0c;模型加载之后非常暗&#xff0c;经其他软件确认&#xff0c;模型本身正常&#xff0c;但是通过 Cesium 加载之后就…

磐维数据库panweidb逻辑备份恢复(示例)

磐维数据库panweidb逻辑备份恢复 1.gs_dump gs_dump是PanWeiDB用于导出数据库相关信息的工具&#xff0c;用户可以自定义导出一个数据库或其中的对象&#xff08;模式、表、视图等&#xff09;&#xff0c;回收站对象除外。支持导出的数据库可以是默认数据库postgres&#xff0…

Async/Await

参考链接&#xff1a; async、await 实现原理 async 和 await 1.异步编程回顾 由于 JavaScript 是单线程执行模型&#xff0c;因此必须支持异步编程才能提高运行效率。异步编程的语法目标是让异步过程写起来像同步过程。 异步编程的发展经历了: 回调函数→Promise→ES7中…

复杂软件版本如何使用git工具进行管理

1.需求说明 一个项目&#xff0c;如果长期开发下去&#xff0c;我们会碰到各种各样的客户&#xff0c;然后就会有各种各样的需求。这时候就会出现一个问题&#xff1a;如果我们的代码都是一个项目&#xff0c;客户的主体流程都是一样&#xff0c;但部分客户又有一些特别的定制…

数字人的新革命,BAT的“冲高”战场

配图来自Canva可画 ChatGPT横空出世&#xff0c;让人们看到了数字人的另一种可能&#xff0c;将ChatGPT与虚拟数字人融合&#xff0c;研发出更加智能化、拟人化的虚拟数字人成为数字人厂商的新命题、新方向。 2月份&#xff0c;岭南股份、风语筑、开普云等10多家公司&#xf…