《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 京东数科 「猫大人」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

时隔一年,Hmily发布全新架构的2.1.0版本

感谢朋友们一路以来的支持,让大家久等了。在这一个版本中,我们团队重构了整个项目,
合理的划分功能模块,新增配置中心,调整底层存储结构,解决疑难bug,以及其他新功能的支持,也吸收了更多开源社区的优秀人才的加入。

架构全景图

功能

  • 高可靠性 :支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂。

  • 易用性 :提供零侵入性式的 Spring-Boot, Spring-Namespace 快速与业务系统集成。

  • 高性能 :去中心化设计,与业务系统完全融合,天然支持集群部署。

  • 可观测性 :Metrics多项指标性能监控,以及admin管理后台UI展示。

  • 多种RPC : 支持 Dubbo, SpringCloud,Montan ,sofa-rpc等知名RPC框架。

  • 日志存储 : 支持 mysql, oracle, mongodb, redis, zookeeper 等方式。

  • 复杂场景 : 支持RPC嵌套调用事务。

重构部分

在模块划分上

  • 抽离出开箱即用的SPI自定义模块。

  • 定义事务日志多种存储方式的SPI模块。

  • 定义事务日志多种序列化方式的SPI模块。

  • 新增配置中心,支持各种主流的配置中心(nacos,apollo,zookeeper等),并支持配置的动态刷新。

  • 新增metrics模块,用来监控运行时候的各种信息。

  • 抽离出核心的事务执行模块。

  • 抽离出多种RPC支持模块。

  • 抽离出spring与spring boot 支持模块。

在依赖包版本上

  • guava升级到29.0

  • curator 升级到5.1.0

在代码质量上

  • 严格的check-style代码检查,秉承优雅,简单易懂原则(talk is cheap ,show you code)。

在开放性上

  • 社区奉行简单,快乐,和谐基本原则

在目标上

  • 打造一款高可用,高性能,简单易用金融级的分布式事务解决方案。

解决疑难bug:

  • dubbo框架不支持注解方式的使用(spring-boot-starter-dubbo)。h

  • motan框架不支持注解方式的使用。

  • spring-cloud用户如果使用feign与hystrix整合hmily时候的线程切换问题。

  • 极端情况下事务日志序列化异常。

  • try阶段超时异常,导致事务悬挂bug。

  • confirm与cancel阶段异常时候,事务未能正确恢复bug。

  • 在事务日志存储上,支持同步与异步2种模式,供用户选择。

用户使用与升级指南

对于hmily用户来说,只需三个步骤,即可解决RPC服务调用之间的柔性事务

  • 引用hmily对各种rpc支持的jar包。
  • 添加hmily配置。
  • 在rpc接口方法上添加 @Hmily注解。

依赖的变更

用户依赖的方式没有更改,只需要将版本升级到2.1.0。 下面举dubbo微服务列子

dubbo rpc 微服务

  • dubbo接口服务依赖
<dependency>
<groupId>org.dromara</groupId>
<artifactId>hmily-annotation</artifactId>
<version>2.1.0</version>
</dependency>
  • dubbo服务提供者依赖(<2.7)
   <dependency>
<groupId>org.dromara</groupId>
<artifactId>hmily-dubbo</artifactId>
<version>2.1.0</version>
</dependency>

or

<dependency>
<groupId>org.dromara</groupId>
<artifactId>hmily-spring-boot-starter-dubbo</artifactId>
<version>2.1.0</version>
</dependency>

hmily配置的变更

在新版2.1.0中,新增了hmily-config模块,支持本地与注册中心模式。用户首先需要在项目resouce文件下新建一个名称为hmily.yml的文件。默认路径为项目的 resource目录下,也可以使用 -Dhmily.conf 指定,也可以把配置放在 user.dir 目录下。 优先级别 -Dhmily.conf > user.dir >resource。 文件格式如下(一部分,以下是配置成本地模式):

  server:
configMode: local
appName: account-dubbo
# 如果server.configMode eq local 的时候才会读取到这里的配置信息.
config:
appName: account-dubbo
serializer: kryo
contextTransmittalMode: threadLocal
scheduledThreadMax: 16
scheduledRecoveryDelay: 60
scheduledCleanDelay: 60
scheduledPhyDeletedDelay: 600
scheduledInitDelay: 30
recoverDelayTime: 60
cleanDelayTime: 180
limit: 200
retryMax: 10
bufferSize: 8192
consumerThreads: 16
asyncRepository: true
autoSql: true
phyDeleted: true
storeDays: 3
repository: mysql

repository:
database:
driverClassName: com.mysql.jdbc.Driver
url : jdbc:mysql://127.0.0.1:3306/hmily?useUnicode=true&characterEncoding=utf8
username: root
password:
maxActive: 20
minIdle: 10
connectionTimeout: 30000
idleTimeout: 600000
maxLifetime: 1800000

如果你想将配置文件放在Nacos配置中心:

  • 第一步:
hmily:
server:
configMode: nacos
appName: xxxxx
# 如果server.configMode eq local 的时候才会读取到这里的配置信息.

remote:
nacos:
server: 192.168.3.22:8848
dataId: hmily.properties
group: DEFAULT_GROUP
timeoutMs: 6000
fileExtension: yml
passive: true
  • 第二步:将hmily的配置,放在 nacos配置中心上

如果你想将配置文件放在Apollo配置中心:

  • 第一步:
hmily:
server:
configMode: apollo
appName: xxxx
# 如果server.configMode eq local 的时候才会读取到这里的配置信息.

remote:
apollo:
appId: hmily-xxxxx
configService: http://192.168.3.22:8080
namespace: byin_hmily
secret:
fileExtension: yml
passive: true
env: dev
meta: http://192.168.3.22:8080
  • 第二步:将hmily的配置,放在 apollo 配置中心上

还有其他的配置方式以及配置内容的详解,请参考:https://dromara.org/zh-cn/docs/hmily/config.html

注解方式的使用的变更

在之前的版本中,rpc接口与实现都只需要添加 @Hmily 注解, 现在需要进行变更,在rpc接口方法上是添加 @Hmily,用来标识这是一个hmily分布式事务的接口方法, 在接口的方法实现上则需要添加 @HmilyTCC,然后指定 confirmcancel方法名称.

举例(dubbo中say方法需要参与分布式事务):

public interface HelloService {

@Hmily
void say(String hello);
}

public class HelloServiceImpl implements HelloService {

@HmilyTCC(confirmMethod = "sayConfrim", cancelMethod = "sayCancel")
public void say(String hello) {
System.out.println("hello world");
}

public void sayConfrim(String hello) {
System.out.println(" confirm hello world");
}

public void sayCancel(String hello) {
System.out.println(" cancel hello world");
}
}

举例(springcloud中say方法需要参与分布式事务):

  • spring-cloud服务调用方FeignClient
@FeignClient(value = "helle-service")
public interface HelloService {

@Hmily
@RequestMapping("/helle-service/sayHello")
void say(String hello);
}
  • spring-cloud服务提供方
@RestController
public class HelloController {

private final HelloService helloService ;

@Autowired
public AccountController(HelloService helloService) {
this.helloService= helloService;
}

@RequestMapping("/sayHello")
public void payment(String hello) {
return helloService.say(hello);
}

}

public interface HelloService {

void say(String hello);
}

public class HelloServiceImpl implements HelloService {

@HmilyTCC(confirmMethod = "sayConfrim", cancelMethod = "sayCancel")
public void say(String hello) {
System.out.println("hello world");
}

public void sayConfrim(String hello) {
System.out.println(" confirm hello world");
}

public void sayCancel(String hello) {
System.out.println(" cancel hello world");
}
}

事务日志存储结构的更改

在使用上,用户使用或者升级不用关心,框架会默认初始化好。

下一个版本

  • 因为调整了架构,在其他模式的支持上将会变得更加容易,在下一个版本,将会发布 TAC 模式(try-auto-cancel)使用此模式,将大大简化框架的使用程度,开发者不需要关心 confirm 以及 cancel 方法的开发,对老系统的改造提供了更好的兼容性,不用担心额外的开发任务,一切就交给 hmily 吧。
  • 将对 brpc 用户进行支持。

  • 将对 tars-rpc 用户进行支持。

社区共建

我们秉承和谐快乐,代码至上的原则,如果你有想法,愿意和我们一起成长,一起贡献,快来加入我们吧!

文章目录
  1. 1. 架构全景图
  2. 2. 功能
  3. 3. 重构部分
    1. 3.0.1. 解决疑难bug:
    2. 3.0.2. 用户使用与升级指南
  4. 3.1. 依赖的变更
    1. 3.1.1. dubbo rpc 微服务
  5. 3.2. hmily配置的变更
    1. 3.2.1. 如果你想将配置文件放在Nacos配置中心:
    2. 3.2.2. 如果你想将配置文件放在Apollo配置中心:
  6. 3.3. 注解方式的使用的变更
    1. 3.3.1. 举例(dubbo中say方法需要参与分布式事务):
    2. 3.3.2. 举例(springcloud中say方法需要参与分布式事务):
  7. 3.4. 事务日志存储结构的更改
    1. 3.4.1. 下一个版本
    2. 3.4.2. 社区共建