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

news2024/10/5 17:21:15

目录

上篇: 安装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 默认为true
  enable-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:8091
    disable-global-transaction: false
  registry:  ## 注册中心
    type: nacos #注册nacos
    nacos:
      application: seata-server  #nacos中seata-server启动注册成功后的服务名称
      server-addr: *:8848
      username: *
      password: *
      group: SEATA_GROUP
      namespace: 49b38634-8a78-4216-a80c-7181976301c5
  config: ## 配置中心  与register.conf文件中的保持一致
    type: nacos
    nacos:
      server-addr: *:8848
      group: *#与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 版本
    @Autowired
    private DataSourceProperties dataSourceProperties;

    @Bean(name = "dataSource") // 声明其为Bean实例
    @Primary // 在同样的DataSource中,首先使用被标注的DataSource
    public 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,不然他就使用默认,启动时会出现警告

package com.aisce.axmall.order.config;

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> {

    @Override
    public 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.coloradmin.cn/o/553766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

边缘计算盒子功能介绍,为什么要用边缘计算盒子?

边缘计算盒子&#xff08;Edge Computing Box&#xff09;是一种用于边缘计算设备。边缘计算是一种分布式计算模型&#xff0c;它将计算和数据处理能力从传统的集中式云计算数据中心延伸到网络边缘的设备上&#xff0c;以便更快地响应实时数据处理需求和减少对云服务的依赖。 边…

HardenedVault 推出 Linux 安全加固版

导读HardenedVault 于 AWS 云平台上推出 Linux 安全加固版&#xff0c;该产品可以通过实施CIS和STIG基准来帮助您实现合规要求&#xff08;PCI-DSS和GDPR&#xff09;。 Shawn the R0ck 写道&#xff1a;HardenedVault自从 2022 年 7 月在 Amazon Web Services (AWS)推出了 Har…

Vscode运行Html的插件以及快速编写Html框架

然后我们点击创建文件&#xff0c;记住要以.html结尾 输入英文感叹号回车就行&#xff08;记住要英文&#xff09; 好了&#xff0c;希望小伙伴能快速入手VsCode&#xff0c;很好用的一款开源免费软件

基于Android的校园外卖系统app

一、项目介绍 Android客户端功能描述&#xff1a; 1&#xff1a;登录注册&#xff1a;用户可以通过自己的信息进行账号的注册 2&#xff1a;商家查看&#xff1a;查看发布的外卖商家信息 3&#xff1a;商家详情&#xff1a;用户点击某一个商家之后可以查看商家的地址和联系方…

AI人工智能在Python中构建回归器的原理、优缺点、应用场景和实现方法

回归器&#xff08;Regressor&#xff09;是一种常用的机器学习算法&#xff0c;可以用于预测数值型变量的值。在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;回归器是一种高效的算法&#xff0c;可以用于许多应用领域&#…

6.4.4最短路径问题-Floyd算法

原来在邻接矩阵种v2使无法到达v1的 但如果我们把v0作为中转站 不断增加中转点&#xff08;1个中转点&#xff09; 这里的path的值是中转点 v1到v2之间是没有中转点的。 这只是以一个中转点&#xff0c;more 路走得越多&#xff0c;会越来越小 广度优先遍历算法是遍历顶点和边…

(二)ArcGIS空间数据的转换与处理——矢量数据变换

ArcGIS空间数据的转换与处理——矢量数据变换 目录 ArcGIS空间数据的转换与处理——矢量数据变换 1.空间校正2.边匹配 数据变换是指对数据进行诸如放大、缩小、翻转、移动、扭曲等几何位置、形状和方位的改变等操作。对 矢量数据的相应操作可以通过 ArcMap 中空间较正 (Spatia…

录制屏幕怎么设置?怎么录制高画质的视频?

在今天的数字时代&#xff0c;屏幕录制已经成为了日常工作中不可或缺的一部分。许多人需要在电脑上录制屏幕来制作教程视频、演示文稿或者是游戏录像。本文将介绍如何在电脑上录制屏幕并获得高画质的视频。 屏幕录制软件的选择 要在电脑上录制高画质的视频&#xff0c;首先需要…

【1】机器学习

目录 1 机器学习概述 1.1 定义 1.2 基本方法 1.3 基本概念 1.4 有监督学习 1.5 无监督学习 1.6 过度拟合问题 模型过于复杂(例如参数过多) 正则化 1.7 模型选择 交叉验证 K折交叉验证 2 机器学习常用工具 3 Scikit-learn 3.1 基本流程 3.2 Scikit-learn常用函数 3.…

csdn Markdown编辑器

文章目录 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是…

云视如何实现流量转化

云视如何实现流量转化 大家好我是小鱼 小伙伴很好奇 云视除了直播带货 打赏&#xff0c;广告 还有哪些方式 可以实现流量转化 今天我和大家分享一下这个话题 接下来我们要讲讲 我们要用的工具 优惠券 适用于刺激消费回流&#xff0c;构建闭环消费圈。 课程赠送 趣味推广营销&am…

平台使用篇 | 批处理(bat)脚本使用教程(三)

导读 本讲针对RflySim平台的一些特点简要介绍了平台使用批处理技术的原因&#xff0c;并根据CopterSim中仿真功能区的参数设置阐述了批处理技术在平台中的具体运用。 平台使用篇 | 批处理(bat)脚本使用教程(三&#xff09; RflySim平台使用批处理技术的原因 ①调用多个软件Rf…

吲哚菁绿ICG-Amine/NH2荧光标记和成像1686147-55-6

ICG-Amine是一种荧光染料&#xff0c;ICG-Amine具有良好的荧光性能&#xff0c;可用于生物医学研究中的荧光标记和成像。ICG-Amine的物理性质如下&#xff1a;化学式&#xff1a;C47H56N4O4S&#xff0c;分子量为773.04&#xff0c;外观&#xff1a;深绿色粉末溶解性&#xff1…

代码随想录算法训练营第四十八天 | 树形dp

198.打家劫舍 文档讲解&#xff1a;代码随想录 (programmercarl.com) 状态&#xff1a;看了“决定dp[i]的因素才做出来"。 思路 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 所以这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系&#xf…

点云重建总结

几何处理和三维视觉 几何处理&#xff1a;是一种计算的方法研究世界中的物理对象&#xff0c;通过硬件扫描生成物理对象的三维模型然后做各种处理和分析。 三维视觉&#xff1a;传统的3D视觉是指从图像中恢复底层的三维结构。 1 几何重建 1.1几何重建的基本流程 扫描&…

宝塔PHP7.1版本37个扩展作用介绍

PATH_INFO&#xff1a;这个扩展可以让PHP获取到URL中的PATH_INFO信息&#xff0c;方便处理URL路由。 bt_safe&#xff1a;这个扩展可以帮助PHP防止一些常见的安全漏洞&#xff0c;比如SQL注入、XSS攻击等。 ionCube&#xff1a;这个扩展可以对PHP代码进行加密&#xff0c;保护…

Linux——线程7|线程池

线程池 线程池以空间换时间,预先申请一批线程,当有任务到来,直接指派线程。 由于这是类的成员函数,因此传参的时候会有一个this指针,我们如果想在传参的时候不传这个this指针,我们只需加上static。 这里只传一个参数,是因为我们的routine是这种类型的

苹果笔不用原装可以吗?apple pencil二代平替笔推荐

随着网络技术的飞速发展&#xff0c;移动电话、平板电脑、笔记本等移动设备正在逐渐走进人们的生活。就好比如我们现在用的是电容笔。我认为&#xff0c;如果我们可以运用它来学习记笔记&#xff0c;做笔记&#xff0c;或其他一些很简单的事情&#xff0c;我们将不必为一支原装…

[CTF/网络安全] 攻防世界 php_rce 解题详析

[CTF/网络安全] 攻防世界 php_rce 解题详析 PHP RECThinkPHP V5漏洞Payload姿势总结 PHP REC PHP RCE 指的是通过远程代码执行漏洞&#xff08;Remote Code Execution&#xff09;来攻击 PHP 程序的一种方式。简单来说&#xff0c;由于PHP应用程序没有正确处理外部输入数据&am…

Python argparse的简单demo与详细使用说明

Python argparse的简单demo测试与使用说明 1. Python argparse是啥&#xff1f;2. demo说明2.1 程序主体结构2.2 demo说明 1. Python argparse是啥&#xff1f; argparse是python用于解析命令行参数的标准模块。我们很多时候&#xff0c;需要用到解析命令行参数的程序&#xf…