Hmily 基础

一、Hmily 概述

  • Hmily 是一款由 Dromara 开源组织提供的高性能、零侵入、金融级分布式事务解决方案,目前主要提供柔性事务的支持,包含 TCC、TAC(自动生成回滚 SQL)方案。架构图如下:

  • 功能特性
    • 高可靠性:支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂
    • 易用性:提供零侵入性式的 SpringBoot、SpringNamespace 快速与业务系统集成
    • 高性能:去中心化设计,与业务系统完全融合,天然支持集群部署
    • 可观测性:Metrics 多项指标性能监控,以及 admin 管理后台 UI 展示
    • 多种 RPC:支持 Dubbo、SpringCloud、Motan、BRPC、Tars 等知名 RPC 框架
    • 日志存储:支持 MySQL、Oracle、MongoDB、Redis、ZooKeeper 等方式
    • 复杂场景:支持 RPC 嵌套调用事务

二、Hmily TCC 分布式场景的搭建

1. 环境准备

  • IDEA、Git、JDK、Maven、MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
CREATE DATABASE IF NOT EXISTS `hmily` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 账户业务 hmily_account.account
CREATE DATABASE IF NOT EXISTS `hmily_account` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
USE `hmily_account`;
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` varchar(128) NOT NULL,
`balance` decimal(10,0) NOT NULL COMMENT '用户余额',
`freeze_amount` decimal(10,0) NOT NULL COMMENT '冻结金额,扣款暂存余额',
`create_time` datetime NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
insert into `account`(`id`,`user_id`,`balance`,`freeze_amount`,`create_time`,`update_time`) values (1,'10000', 10000000,0,'2017-09-18 14:54:22',NULL);

-- 库存业务 hmily_stock.inventory
CREATE DATABASE IF NOT EXISTS `hmily_stock` DEFAULT CHARACTER SET utf8mb4;
USE `hmily_stock`;
DROP TABLE IF EXISTS `inventory`;
CREATE TABLE `inventory` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`product_id` VARCHAR(128) NOT NULL,
`total_inventory` int(10) NOT NULL COMMENT '总库存',
`lock_inventory` int(10) NOT NULL COMMENT '锁定库存',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
insert into `inventory`(`id`,`product_id`,`total_inventory`,`lock_inventory`) values (1,'1',10000000,0);

-- 订单业务 hmily_order.order
CREATE DATABASE IF NOT EXISTS `hmily_order` DEFAULT CHARACTER SET utf8mb4;
USE `hmily_order`;
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`create_time` datetime NOT NULL,
`number` varchar(20) COLLATE utf8mb4_bin NOT NULL,
`status` tinyint(4) NOT NULL,
`product_id` varchar(128) NOT NULL,
`total_amount` decimal(10,0) NOT NULL,
`count` int(4) NOT NULL,
`user_id` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

2. 运行代码