热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:又一款国产大厂开源的分布式事务组件,支持SpringBoot+SpringCloud+Dubbo等等等!!!

本文由编程笔记#小编为大家整理,主要介绍了又一款国产大厂开源的分布式事务组件,支持SpringBoot+SpringCloud+Dubbo等等等!!!相关的知识,希望对你有一定的参考价
本文由编程笔记#小编为大家整理,主要介绍了又一款国产大厂开源的分布式事务组件,支持 Spring Boot + Spring Cloud + Dubbo 等等等!!!相关的知识,希望对你有一定的参考价值。




管她前浪,还是后浪?


能浪的浪,才是好浪!


每天 8:55 更新文章,每天掉亿点点头发...









源码精品专栏

 




































  • 架构全景图



  • 功能



  • 重构部分




    • 依赖的变更



    • hmily配置的变更



    • 注解方式的使用的变更



    • 事务日志存储结构的更改






旁白君:Hmily 是 京东数科 技术团队主导的开源项目!!!




艿艿撸过 Hmily 的源码,灰常 nice,请放心食用~



时隔一年,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.dromaragroupId>
          <artifactId>hmily-annotationartifactId>
          <version>2.1.0version>
      dependency>




  • dubbo服务提供者依赖(<2.7)


       <dependency>
            <groupId>org.dromaragroupId>
            <artifactId>hmily-dubboartifactId>
           <version>2.1.0version>
        dependency>
    or
      <dependency>
            <groupId>org.dromaragroupId>
            <artifactId>hmily-spring-boot-starter-dubboartifactId>
           <version>2.1.0version>
        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 用户进行支持。




社区共建





  • github:https://github.com/dromara/hmily



  • gitee:https://gitee.com/shuaiqiyu/hmily



  • qq群: 162614487












已在知识星球更新源码解析如下:











最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。


提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。


兄弟,一口,点个

推荐阅读
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
author-avatar
up61
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有