servicecomb-pack分布式事务解决方案之学习之路(一):saga和tcc-spring-demo

使用华为servicecomb-pack框架实现协调器以处理分布式事务 记录一下公司开发社区讲解的有关微服务中分布式事务 对于我而言还是有点难以理解的。学习中。 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发,从而被越来越多的开发者和公司推崇运用。但系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并操作多个数据库实现,服务调用的分布式事务问题变的非常突出,几乎可以说是无法避免。分布式事务已经成为... 阅读详情

本片文章是一篇servicecomb-pack的使用教程说明,理论知识会另起一篇文章再详细说明(架构理论传送门1,架构理论传送门2)

servicecomb是华为开源的一个微服务框架,后进入Apache软件基金会孵化,现已毕业,是apache顶级开源项目,而servicecomb-pack是servicecomb孵化的三个子项目之一,是分布式事务最终一致性解决方案,0.3.0版本之前叫saga,现改名为servicecomb-pack,支持saga和tcc两种分布式事务协议,相关理论知识请移步(传送门),本文主要介绍saga模式,下一篇介绍tcc模式

1.先配置和运行alpha-server

注意:alpha-server目前并没有提供starter,因此需要从GitHub上获取源码本地自行编译运行

源码获取

Github地址:https://github.com/apache/servicecomb-pack

git命令:$ git clone https://github.com/apache/servicecomb-pack.git

修改配置文件

找到alpha-server/src/main/resource/application.yaml,修改datasource信息为本地信息即可

本地构建alpha-server

$ cd servicecomb-pack

只构建可执行文件(推荐)

$ mvn clean install -DskipTests -Pspring-boot-2

同时构建可执行文件和docker镜像

$ mvn clean install -DskipTests -Pdocker,spring-boot-2

 

同时构建可执行文件以及pack发行包

$ mvn clean install -DskipTests -Prelease,spring-boot-2

在执行上面任一指令后,可在alpha/alpha-server/target/saga/alpha-server-${version}-exec.jar中找到alpha-server的可执行jar包

启动alpha-server

通过docker运行:

docker run -d -p 8080:8080 -p 8090:8090 -e "JAVA_OPTS=-Dspring.profiles.active=prd -Dspring.datasource.url=jdbc:postgresql://${host_address}:5432/saga?useSSL=false" alpha-server:${saga_version}

通过可执行文件运行:

java -Dspring.profiles.active=prd -D"spring.datasource.url=jdbc:postgresql://${host_address}:5432/saga?useSSL=false" -jar alpha-server-${saga_version}-exec.jar

注意:请在执行命令前将${saga_version}和${host_address}更改为实际值

至此,alpha-server全局事务管理器已经启动成功

替换postgresql为mysql

alpha-server默认使用postgresql,因此如想替换成mysql需以下步骤:

  • 安装并运行mysql
  • 修改pom文件,添加依赖:alpha-server/pom.xml,添加mysql依赖(因为配置文件中需要配置driver信息)

    dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
      <version>8.0.15</version>
    </dependency>
    

     

 

  • 找到alpha-server/src/main/resource/application.yaml,修改datasource信息为本地信息即可;注:url需添加serverTimezone,并增加driver-class-name属性

    spring:
      profiles: mysql
      datasource:
        username: ${username}
        password: ${password}
        url: jdbc:mysql://${host_address}:${port}/${database_name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
        platform: mysql
        continue-on-error: false
        driver-class-name: com.mysql.cj.jdbc.Driver
      jpa:
        properties:
          eclipselink:
            ddl-generation: none
    

     

注意:${username},${password},${host_address},${port},${database_name}需替换为实际值

  • 本地构建alpha-server(和上面步骤一致)
  • 启动alpha-server(和上面步骤一致)

2.Omega配置

添加依赖

<dependency>
    <groupId>org.apache.servicecomb.pack</groupId>
    <artifactId>omega-spring-starter</artifactId>
    <version>${servicecomb-pack.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.servicecomb.pack</groupId>
    <artifactId>omega-spring-cloud-consul-starter</artifactId>
    <version>${servicecomb-pack.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.servicecomb.pack</groupId>
    <artifactId>omega-transport-resttemplate</artifactId>
    <version>${servicecomb-pack.version}</version>
</dependency>

注意:请将${servicecomb-pack.version}更改为实际的版本号(目前最新release为0.4.0)

修改配置文件

添加这一配置即可,其他应用配置自行添加,address可根据alpha-server中的配置实际添加

# 配置alpha-service 集群/单机 服务访问地址
alpha:
  cluster:
    address: localhost:8080

saga模式demo配置

添加saga的注解以及相关的补偿方法配置

  • 在应用入口添加@ EnableOmega 注解来初始化Omega的配置并与alpha-server建立连接(@EnableOmega注解在当前版本已经标注为过时注解,但是不妨碍功能,后续应该会把注解转换为在配置文件中配置开关属性,目前版本中还没开始这种做)
@SpringBootApplication
@EnableOmega
public class CarApplication {

    public static void main(String[] args) {
        SpringApplication.run(CarApplication.class, args);
    }

}
@SagaStart(timeout = 5)  //开启saga分布式事务,默认情况下,超时设置需要显示声明才生效
@GetMapping("/booking/{name}/{rooms}/{cars}")
public String booking(@PathVariable String name,@PathVariable Integer rooms,
                    @PathVariable Integer cars) throws Exception{}

注意:默认情况下,超时设置需要显示声明才能生效

  • 在子事务处添加@ Compensable 注解并指明其对应的补偿方法
@Override
@Transactional
@Compensable(timeout = 5, compensationMethod = "cancel")
public CarBooking order(CarBooking carBooking) {
    return repository.save(carBooking);
}

补偿方法

//补偿逻辑 入参和try方法一致
    @Transactional
    public void cancel(CarBooking carBooking) {
        //demo只进行取消/删除 设置状态; 实际开发中可针对实际业务进行逻辑编码
        //修改状态
        carBooking.setCancelled(Boolean.TRUE);
        repository.save(carBooking);

        //删除记录
//        repository.delete(toSpecification(carBooking));
    }

注意:实现的服务和补偿方法必须满足幂等的要求

注意:默认情况下,超时需要显示声明

注意:若全局事务起点与子事务重合,需同时声明@SagaStart和@Compensable注解

注意:补偿方法的入参必须与try方法入参一致,否则启动时会报错(alpha-server找不到补偿方法)

至此,正常启动服务即完成saga模式配置

tcc模式demo配置

  • 在应用入口处添加@EnableOmega注解
    @SpringBootApplication
    @EnableOmega
    public class OrderingApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderingApplication.class, args);
        }
    
    }
    

     

  • 在全局事务的起点添加@TccStart注解标注这是tcc事务的start
    @TccStart(timeout = 5)  //当前版本的tcc还不支持timeout
    @PostMapping("/order/{userName}/{productName}/{productUnit}/{unitPrice}")
    public String order(@PathVariable String userName,@PathVariable String productName,
                        @PathVariable Integer productUnit,@PathVariable Integer unitPrice) throws Exception{}
    

    注意:当前版本tcc还不支持timeout

  • 在子事务处添加@Participate注解并指明confirm和cancel方法
    @Override
    @Transactional
    @Participate(confirmMethod = "confirm", cancelMethod = "cancel")
    public void reserve(ProductOrder productOrder) {
        Product product = new Product();
        product.setName(productOrder.getProductName());
        product = productRepository.findOne(toSpecification1(product)).get();
        if (product.getInStock() >= productOrder.getUnits()) {
            product.setInStock(product.getInStock() - productOrder.getUnits());
            productRepository.save(product);
    
            productOrderRepository.save(productOrder);
        } else {
            throw new IllegalArgumentException("The Product is out of stock!");
        }
    }
    

    确认方法

    public void confirm(ProductOrder productOrder) {
        ......
    }
    

    补偿方法

    public void cancel(ProductOrder productOrder) {
        ......
    }
    

    注意:confirm和cancel方法的入参必须和try方法一致

    至此,正常启动服务即完成tcc模式配置

到此,saga和tcc已经基本搭建完成

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

spring seate实战2pc、3pc、tcc、saga(2) spring seate实战2pc、3pc、tcc、saga。 阅读详情

相关推荐

记一次使用STM32F042K6芯片内部HSI48M时钟导致CAN总线报错问题

深入去解决某个问题时,也会加深你对其它部分的了解和思考,比如这里让我又重新了解和CAN的采样点和CAN报错机制。

ApexYuan 860

分布式事务(Saga模式)

分布式事务(Saga模式)(解决mq,api分布式事务问题) 一 概览 1.分布式事务包含两个组件TxServer和TxClient TxServer是分布式事务协调器,主要负责接收每个参与者事务开启和结束的上报信息,并做持久化。协调补偿子事务,达到事务的最终一致。 TxClient是分布式事务客户端,主要负责上报事务开启和结束结果信息。 2.业务接入 业务服务需要引入TxClient依赖 <dependency> <groupId>com.mw</groupId&gt

qq_40354931的博客 1585

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 297

分布式事务之servicecomb-pack saga springcloud开发框架接入

分布式事物之servicecomb-pack简单原理介绍及接入详情

哆啦A梦 972

基于分数阶傅里叶变换的chirp信号检测与参数估计(原理附代码)

线性调频信号(chirp信号) 顾名思义,该信号的频率随着时间线性变换,其复数表达形式如下: s(t)=e2jπ(f0t+0.5μt2)s(t)=e^{2j\pi(f_0 t+ 0.5\mu t^2)}s(t)=e2jπ(f0​t+0.5μt2) 根据欧拉公式,其相位项为2π(f0t+0.5μt2))2\pi(f_0 t+ 0.5\mu t^2))2π(f0​t+0.5μt2))。信号的角频率是相位对时间的导数。对相位求导后有2π(f0+μt)2\pi(f_0+\mu t)2π(f0​+μt),显然,f0f

weixin_42845306的博客 1万+

LFM调制信号分类与检测识别

支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗干扰(DDJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)。Faster-RCNN支持检测识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)等8种信号。

菜yuan~的博客 1029

分布式事务数据最终一致性之serviceComb-Saga使用方法

准备环境 1.安装JDK 1.8 2.安装Maven 3.x 3.安装Docker 编译 $ git clonehttps://github.com/apache/incubator-servicecomb-saga.git $ cd incubator-servicecom...

chouyun6496的博客 833

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

传统事务与柔性事务

柔性事务之前我们先来回归传统事务传统事务第一次接触事务的时候,被人告知事务是原子的,要么都成功要么都失败。再进一步就有ACID这四个属性,原子性(Atomictiy)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabilit)。我们首先看下一些书籍中的官方描述:原子性:事务是一个包含一系列操作的原子操作。事务的原子性确保这些操作全部完成或者全部失败。一致性:一旦事...

白小菜的博客 3484

Python爬虫实战:高效爬取法律法规数据库的完整指南

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的法律法规数据库爬虫。我们将从爬虫的基本原理讲起,逐步深入到反爬机制应对、数据解析与存储、性能优化等高级话题。文章包含完整的代码实现,使用requests-html、aiohttp等现代库,以及应对法律数据库特殊结构的处理技巧。通过本文,您将掌握构建专业级法律数据采集系统的全套技能。关键词:Python爬虫、法律法规、数据采集、异步爬虫、反反爬本文详细介绍了使用Python爬取法律法规数据库的完整技术方案。

2201_76125261的博客 1275

电磁场仿真:电磁场基础理论_(13).微波技术基础

微波是指频率在300 MHz到300 GHz之间的电磁波。这一频率范围对应的波长为1米到1毫米。

2401_87715305的博客 1319

完整微服务化示例:使用 Apache ServiceComb (incubating) 进行微服务开发、容器化、弹性伸缩...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34232363的博客 663

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

spring boot 事务_体验微服务分布式事务开源框架ServiceComb的Saga TCC模型

前言微服务与分步式系统架构里的事务问题一直就是痛点,在高并发与高吞吐下,伴随网络的不确定性,数据很难达到强一致性,业界一直没有完美的解决方案。基于分布式CAP理论,只能选择放弃强一致性,追求可用性,提出柔性事务、最终一致性。微服务等分布式架构中,要实现最终一致性,只能采用事务补偿方式(可能还需要手动补偿)。分布式事务在使用时应该尽量少用或不用,在不得以的情况下。最好定下分布式事务的开发规范来,对开...

weixin_39884100的博客 397

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

servicecomb-pack

前言: servicecomb-pack 包括2大部分即 alpha、omega ,其中alpha相当于管理端服务端,而omega是需要嵌入到业务代码中,是一个client端,接收、上报给alpha事务ID以及执行状态。而事务协议又包括2种即saga与tcc,我们在omega-transport这个项目模块,包括支持的项目框架:dubbo、feign、hystrix、resttemplate、servicecomb,在官方文档里或者代码demo里没有关于springcoud feign的相关实例,可能感觉

猎户星座 445

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

(精华)2020年10月4日 微服务 docker部署的各种工具镜像文件

微服务项目docker部署 前提准备 docker网络 ​ 网络命令:docker network create -d bridge --gateway 172.18.0.1 --subnet 172.18.0.0/16 microservice ​ -d bridge 为网络模式 类似于NAT模式,类似于局域网 ​ --gateway 172.18.0.1 为局域网的网关 ​ --subnet 172.18.0.0/16 为局域网的网段,所有在局域网内的容器都能互相通信 环境镜像 1、mcr.micro

愚公智库 37万+

分布式事务+ServiceCom Pack Saga介绍

分布式事务相关知识、Saga实现详解及示例

dreamsofa的专栏 1607

分布式微服务技术,模拟面试与解答。ServiceComb-Pack(九)

答:Alpha 组件是 ServiceComb-Pack 框架中的重要组成部分,它主要负责具体应用程序代码的事务管理工作。具体实现方式主要有以下几个步骤:(1)在代码中使用 @Compensable 注解标注需要进行分布式事务管理的方法,例如:java// 具体业务逻辑// 取消订单逻辑(2)Alpha 组件通过 AOP 技术在运行时自动创建事务记录,记录当前事务的上下文和参与者信息;

zxb11c的博客 332

springboot集成分布式事务框架:servicecomb-pack

源码地址:https://github.com/apache/servicecomb-pack。 一、官网介绍: 概览 Pack中包含两个组件,即 alpha 和 omega。 alpha充当协调者的角色,主要负责对事务的事件进行持久化存储以及协调子事务的状态,使其得以最终与全局事务的状态保持一致。 omega是微服务中内嵌的一个agent,负责对网络请求进行拦截并向alpha上报事务事件,并在异常情况下根据alpha下发的指令执行相应的补偿操作。 Omega内部运行机制 omega是微服务

u014050029的专栏 1878

分布式事务实战

文章结尾有彩蛋 目录: 1.分布式事务讲解 2.分布式事务解决方案-servicecomb-pack 3.分布式事务实战讲解 1. 分布式事务讲解 1.1事务原理 在讲分布式事务之前,先聊一下事务。简单讲事务是数据库管理系统执行过程中的一个逻辑单元,它能保证要么一组数据库操作全部执行成功,要么全部失败,而做到这些的原理就是事务的ACID四大特性。 A. Atomic原子性的简称,事务作为一个整体来执行,要么全部成功,要么全部失败。 C. Consi...

lyb9292的博客 1210

【亲测免费】 探索分布式事务的新星:servicecomb-pack-csharp

探索分布式事务的新星:servicecomb-pack-csharp 在微服务架构日益普及的今天,分布式事务管理成为了开发者必须面对的挑战。Apache ServiceComb 社区推出的 servicecomb-pack-csharp 项目,为 .NET 开发者提供了一个强大的工具,用于处理分布式事务。本文将深入介绍这一开源项目,分析其技术特点,并探讨其在实际应用中的场景和优势。 项目介绍 se...

gitblog_01090的博客 1070

微服务--alpha使用

如果你的项目使用的不是spring boot 2.1.1版本,那么请参照此列表增加兼容的spring-cloud-starter-alibaba-nacos-discovery版本。如果你的项目使用的不是spring boot 2.1.1版本,那么请参照此列表增加兼容的spring-cloud-starter-zookeeper-discovery版本。实现的服务使用相当的参数,实现的服务和补偿必须满足幂等的条件,同时建议使用Spring @Transactional标注提供本地事务保证。

不求上进的码农的博客 1283

分布式事务——华为servicecomb-pack

补偿方式 在讲servicecomb-pack之前先了解两个概念:不完美补偿(saga)和完美补偿(tcc)。 saga:不完美补偿,一般在系统中我们会专门为业务逻辑对应写一个补偿逻辑,如果业务逻辑执行失败,就会去执行这个补偿逻辑,我们称这个补偿逻辑为反向操作,这个反向操作同样会留下操作痕迹,例如:在银行系统中,客户去ATM取钱,银行会先对用户账户进行扣款操作,如果本次取钱不成功,银行系统...

itwxming的博客 1145

ServiceComb Pack C 项目教程

ServiceComb Pack C# 项目教程 1. 项目的目录结构及介绍 servicecomb-pack-csharp/ ├── src/ │ ├── OmegaCore/ │ │ ├── Properties/ │ │ ├── Controllers/ │ │ ├── Models/ │ │ ├── Services/ │ │ ├── Omega...

gitblog_00609的博客 464
上一篇: java实现PDF转图片
下一篇: 分布式事务解决方案
Ice166
博客等级 码龄9年 151粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值