分布式系列教程(23) -分布式事务解决方案(实践篇)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 分布式系列教程(23) -分布式事务解决方案(实践篇)

1. SpringCloud 集成LCN框架

目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。

因为LCN本身是开源的,网上有大牛对LCN框架源码做修改,可以支持SpringCloud2.0版本。

下面来讲解下SpringCloud2.0集成LCN框架的步骤:

1.添加maven依赖

<dependency>
  <groupId>com.codingapi</groupId>
  <artifactId>transaction-springcloud</artifactId>
  <version>4.1.2</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>com.codingapi</groupId>
  <artifactId>tx-plugins-db</artifactId>
  <version>4.1.2</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.applicatoin.yml引入

tm: 
  manager: 
     url: http://127.0.0.1:8899/tx/manager/

3.LCN基本配置代码

@Service
public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService {
  @Value("${tm.manager.url}")
  private String url;
  @Override
  public String getTxUrl() {
    System.out.println("load tm.manager.url ");
    return url;
  }
}
@Service
public class TxManagerHttpRequestServiceImpl implements TxManagerHttpRequestService {
  @Override
  public String httpGet(String url) {
    System.out.println("httpGet-start");
    String res = HttpUtils.get(url);
    System.out.println("httpGet-end");
    return res;
  }
  @Override
  public String httpPost(String url, String params) {
    System.out.println("httpPost-start");
    String res = HttpUtils.post(url, params);
    System.out.println("httpPost-end");
    return res;
  }
}

4.分布式事务案例

// 下单扣库存
@TxTransaction(isStart = true)
@Transactional
@GetMapping(value = "/addOrderAndStock")
public ResponseBase addOrderAndStock(int i) {
  //1.填写订单信息
  OrderEntity orderEntity = new OrderEntity();
  orderEntity.setName("订单-001");
  orderEntity.setOrderCreatetime(new Date());
  // 价格是300元
  orderEntity.setOrderMoney(300d);
  // 状态为 未支付
  orderEntity.setOrderState(0);
  Long commodityId = 30l;
  // 商品id
  orderEntity.setCommodityId(commodityId);
  // 2.先下单,创建订单
  int orderResult = orderMapper.addOrder(orderEntity);
  System.out.println("orderResult:" + orderResult);
  // 3.下单成功后,调用库存服务
  ResponseBase inventoryReduction = stockFeign.inventoryReduction(commodityId);
  // if (inventoryReduction.getRtnCode() != 200) {
  // // 手动回滚事务
  // }
  //4.模拟异常
  int reuslt = 1 / i;
  return setResultSuccess("下单成功!");
}

使用@TxTransaction解决分布式事务 isStart

  • true :是发起方
  • false :是参与方

同理生产者 同样配置集成即可,只需要把Transaction中的isStart改为fasle即可

2. LCN协调者服务集群

官方文档: https://github.com/codingapi/tx-lcn/wiki/TxManager%E9%9B%86%E7%BE%A4%E8%AF%B4%E6%98%8E

核心原理通过该实现类:NettyDistributeServiceImpl 38行获取服务器集群地址

private void getTxServer() {
    //获取负载均衡服务地址
    String json = null;
    while (StringUtils.isEmpty(json)) {
        json = txManagerService.httpGetServer();
        logger.info("get txManager ->" + json);
        if (StringUtils.isEmpty(json)) {
            logger.error("TxManager服务器无法访问.");
            try {
                Thread.sleep(1000 * 2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    TxServer txServer = TxServer.parser(json);
    if (txServer != null) {
        logger.debug("txServer -> " + txServer);
        logger.info(txServer.toString());
        Constants.txServer = txServer;
        logger.info(Constants.txServer.toString());
        connectCont = 0;
    }
}

LCN协调者服务集群原理:

  1. 首先通过nginx配置多个tm协调者负载均衡配置,然后 LCN客户端启动项目的时候访问Nginx负载均衡地址获取LCN协议通讯IP地址和端口号,并且对该连接保持长连接。
  2. 因为LCN客户端与TM协调者保持的是长连接,当tm协调者宕机之后,LCN会客户端会立即重新进入到获取负载均衡地址LCN协议通讯IP地址和端口号。

Nginx负载均衡配置:

#### 上游服务器 集群 默认轮训机制
    upstream  backServer{
      server 127.0.0.1:8899;
      server 127.0.0.1:8898;
  }
    server {
        listen       80;
        server_name  wg.xxx.com;
        location / {
            ### 指定上游服务器负载均衡服务器
        proxy_pass http://backServer/;
      ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
      proxy_connect_timeout 5s;
      ###nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 5s;
      ### nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 5s;
            index  index.html index.htm;
        }

Yml配置文件连接:

tm: 
  manager: 
      url: http://wg.xxx.com/tx/manager/


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
2月前
|
关系型数据库 MySQL
常见分布式事务的解决方案(一)
常见分布式事务的解决方案(一)
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
1月前
|
消息中间件 存储 算法
分布式系列第二弹:分布式事务!
分布式系列第二弹:分布式事务!
|
1月前
|
SQL NoSQL MongoDB
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
41 0
|
2月前
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
2月前
常用的分布式事务解决方案(二)
常用的分布式事务解决方案(二)
|
3月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
88 0
|
3月前
|
机器学习/深度学习 TensorFlow 数据处理
分布式训练在TensorFlow中的全面应用指南:掌握多机多卡配置与实践技巧,让大规模数据集训练变得轻而易举,大幅提升模型训练效率与性能
【8月更文挑战第31天】本文详细介绍了如何在Tensorflow中实现多机多卡的分布式训练,涵盖环境配置、模型定义、数据处理及训练执行等关键环节。通过具体示例代码,展示了使用`MultiWorkerMirroredStrategy`进行分布式训练的过程,帮助读者更好地应对大规模数据集与复杂模型带来的挑战,提升训练效率。
80 0
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?

热门文章

最新文章