京東技術(shù)主導(dǎo):全新架構(gòu)的分布式事務(wù)Hmily 2.1.1發(fā)布
點(diǎn)擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”
回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!

時(shí)隔一年,Hmily發(fā)布全新架構(gòu)的2.1.1版本
感謝朋友們一路以來的支持,讓大家久等了。在這一個(gè)版本中,我們團(tuán)隊(duì)重構(gòu)了整個(gè)項(xiàng)目,
合理的劃分功能模塊,新增配置中心,調(diào)整底層存儲(chǔ)結(jié)構(gòu),解決疑難bug,以及其他新功能的支持,也吸收了更多開源社區(qū)的優(yōu)秀人才的加入。
架構(gòu)全景圖

功能
高可靠性 :支持分布式場景下,事務(wù)異常回滾,超時(shí)異常恢復(fù),防止事務(wù)懸掛。
易用性 :提供零侵入性式的?
Spring-Boot,?Spring-Namespace?快速與業(yè)務(wù)系統(tǒng)集成。高性能 :去中心化設(shè)計(jì),與業(yè)務(wù)系統(tǒng)完全融合,天然支持集群部署。
可觀測(cè)性 :Metrics多項(xiàng)指標(biāo)性能監(jiān)控,以及admin管理后臺(tái)UI展示。
多種RPC :支持?
Dubbo,?SpringCloud,Montan?,sofa-rpc等知名RPC框架。日志存儲(chǔ) :支持?
mysql,?oracle,?mongodb,?redis,?zookeeper?等方式。復(fù)雜場景 :支持RPC嵌套調(diào)用事務(wù)。
重構(gòu)部分
在模塊劃分上:
抽離出開箱即用的SPI自定義模塊。
定義事務(wù)日志多種存儲(chǔ)方式的SPI模塊。
定義事務(wù)日志多種序列化方式的SPI模塊。
新增配置中心,支持各種主流的配置中心(nacos,apollo,zookeeper等),并支持配置的動(dòng)態(tài)刷新。
新增metrics模塊,用來監(jiān)控運(yùn)行時(shí)候的各種信息。
抽離出核心的事務(wù)執(zhí)行模塊。
抽離出多種RPC支持模塊。
抽離出spring與spring boot 支持模塊。
在依賴包版本上:
guava升級(jí)到29.0
curator 升級(jí)到5.1.0
在代碼質(zhì)量上:
嚴(yán)格的check-style代碼檢查,秉承優(yōu)雅,簡單易懂原則(talk is cheap ,show you code)。
在開放性上:
社區(qū)奉行簡單,快樂,和諧基本原則
在目標(biāo)上:
打造一款高可用,高性能,簡單易用金融級(jí)的分布式事務(wù)解決方案。
解決疑難bug:
dubbo框架不支持注解方式的使用(spring-boot-starter-dubbo)。hmotan框架不支持注解方式的使用。spring-cloud用戶如果使用feign與hystrix整合hmily時(shí)候的線程切換問題。極端情況下事務(wù)日志序列化異常。
try階段超時(shí)異常,導(dǎo)致事務(wù)懸掛bug。
confirm與cancel階段異常時(shí)候,事務(wù)未能正確恢復(fù)bug。
在事務(wù)日志存儲(chǔ)上,支持同步與異步2種模式,供用戶選擇。
用戶使用與升級(jí)指南
對(duì)于hmily用戶來說,只需三個(gè)步驟,即可解決RPC服務(wù)調(diào)用之間的柔性事務(wù)
引用hmily對(duì)各種rpc支持的jar包。
添加hmily配置。
在rpc接口方法上添加?
@Hmily注解。
依賴的變更
用戶依賴的方式?jīng)]有更改,只需要將版本升級(jí)到2.1.0。下面舉dubbo微服務(wù)列子
dubbo rpc微服務(wù)
dubbo接口服務(wù)依賴
?????<dependency>
??????????<groupId>org.dromaragroupId>
??????????<artifactId>hmily-annotationartifactId>
??????????<version>2.1.0version>
??????dependency>
dubbo服務(wù)提供者依賴(<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模塊,支持本地與注冊(cè)中心模式。用戶首先需要在項(xiàng)目resouce文件下新建一個(gè)名稱為hmily.yml的文件。默認(rèn)路徑為項(xiàng)目的?resource目錄下,也可以使用?-Dhmily.conf?指定,也可以把配置放在?user.dir?目錄下。優(yōu)先級(jí)別?-Dhmily.conf?>?user.dir?>resource。文件格式如下(一部分,以下是配置成本地模式):
??server:
????configMode:?local
????appName:?account-dubbo
??#??如果server.configMode?eq?local?的時(shí)候才會(huì)讀取到這里的配置信息.
??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?的時(shí)候才會(huì)讀取到這里的配置信息.
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?的時(shí)候才會(huì)讀取到這里的配置信息.
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配置中心上
還有其他的配置方式以及配置內(nèi)容的詳解,請(qǐng)參考:https://dromara.org/zh-cn/docs/hmily/config.html
注解方式的使用的變更
在之前的版本中,rpc接口與實(shí)現(xiàn)都只需要添加?@Hmily?注解, 現(xiàn)在需要進(jìn)行變更,在rpc接口方法上是添加?@Hmily,用來標(biāo)識(shí)這是一個(gè)hmily分布式事務(wù)的接口方法, 在接口的方法實(shí)現(xiàn)上則需要添加?@HmilyTCC,然后指定?confirm?與?cancel方法名稱.
舉例(dubbo中say方法需要參與分布式事務(wù)):
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方法需要參與分布式事務(wù)):
spring-cloud服務(wù)調(diào)用方
FeignClient中
@FeignClient(value?=?"helle-service")
public?interface?HelloService?{
????@Hmily
????@RequestMapping("/helle-service/sayHello")
????void?say(String?hello);
}
spring-cloud服務(wù)提供方
@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");
????}
}
事務(wù)日志存儲(chǔ)結(jié)構(gòu)的更改
在使用上,用戶使用或者升級(jí)不用關(guān)心,框架會(huì)默認(rèn)初始化好。
下一個(gè)版本
因?yàn)檎{(diào)整了架構(gòu),在其他模式的支持上將會(huì)變得更加容易,在下一個(gè)版本,將會(huì)發(fā)布
TAC模式(try-auto-cancel)使用此模式,將大大簡化框架的使用程度,開發(fā)者不需要關(guān)心confirm以及cancel?方法的開發(fā),對(duì)老系統(tǒng)的改造提供了更好的兼容性,不用擔(dān)心額外的開發(fā)任務(wù),一切就交給hmily吧。將對(duì)brpc用戶進(jìn)行支持。
將對(duì)tars-rpc用戶進(jìn)行支持。
社區(qū)共建
我們秉承和諧快樂,代碼至上的原則,如果你有想法,愿意和我們一起成長,一起貢獻(xiàn),快來加入我們吧!
github:
https://github.com/dromara/hmilygitee:
https://gitee.com/shuaiqiyu/hmilyqq群:
162614487
往期推薦
﹀
﹀
﹀
推薦加入
最近熱門內(nèi)容回顧? ?#技術(shù)人系列

