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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 分布式系列教程(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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
29天前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
19天前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
37 1
|
26天前
|
机器学习/深度学习 人工智能 负载均衡
【AI大模型】分布式训练:深入探索与实践优化
在人工智能的浩瀚宇宙中,AI大模型以其惊人的性能和广泛的应用前景,正引领着技术创新的浪潮。然而,随着模型参数的指数级增长,传统的单机训练方式已难以满足需求。分布式训练作为应对这一挑战的关键技术,正逐渐成为AI研发中的标配。
118 5
|
28天前
|
存储 Kubernetes 监控
深入浅出分布式事务:理论与实践
在数字化时代的浪潮中,分布式系统如同星辰大海般浩瀚而深邃。本文将带你航行于这片星辰大海,探索分布式事务的奥秘。我们将从事务的基本概念出发,逐步深入到分布式事务的核心机制,最后通过一个实战案例,让你亲自体验分布式事务的魅力。让我们一起揭开分布式事务的神秘面纱,领略其背后的科学与艺术。
60 1
|
1月前
|
存储 监控 数据可视化
性能监控之JMeter分布式压测轻量日志解决方案
【8月更文挑战第11天】性能监控之JMeter分布式压测轻量日志解决方案
46 0
性能监控之JMeter分布式压测轻量日志解决方案
|
11天前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
19 0
|
1月前
|
Go API 数据库
[go 面试] 分布式事务框架选择与实践
[go 面试] 分布式事务框架选择与实践
|
16天前
|
消息中间件 存储 Kafka
微服务实践之分布式定时任务
微服务实践之分布式定时任务
|
1月前
|
存储 负载均衡 中间件
构建可扩展的分布式数据库:技术策略与实践
【8月更文挑战第3天】构建可扩展的分布式数据库是一个复杂而具有挑战性的任务。通过采用数据分片、复制与一致性模型、分布式事务管理和负载均衡与自动扩展等关键技术策略,并合理设计节点、架构模式和网络拓扑等关键组件,可以构建出高可用性、高性能和可扩展的分布式数据库系统。然而,在实际应用中还需要注意解决数据一致性、故障恢复与容错性以及分布式事务的复杂性等挑战。随着技术的不断发展和创新,相信分布式数据库系统将在未来发挥更加重要的作用。
|
16天前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
43 2
基于Redis的高可用分布式锁——RedLock