《微服务事务管理》 - 教程
目录
引言:
一、微服务事务的挑战
1.1 分布式系统的"CAP定理"
1.2 传统ACID事务的局限性
1.3 网络不可靠性
二、微服务事务模式
2.1 两阶段提交(2PC)
2.2 补偿事务(TCC)
2.3 事件驱动架构与最终一致性
2.4 本地消息表
三、实战:Spring Cloud实现分布式事务
3.1 使用Seata框架
3.2 基于Spring Cloud Stream的事件驱动
四、微服务事务设计最佳实践
五、常见问题与解决方案
5.1 如何选择合适的事务模式?
5.2 如何处理网络超时?
5.3 如何监控分布式事务?
结语
引言:
在传统的单体应用中,事务管理相对简单直接——我们通常使用数据库提供的ACID事务就能满足大多数需求。然而,当系统演进为微服务架构后,事务管理突然变得复杂起来。想象一下,一个电商下单流程可能涉及订单服务、库存服务、支付服务和物流服务,每个服务都有自己的数据库,传统的数据库事务在这里就无能为力了。
这就是微服务架构下我们需要特殊事务管理的原因。本文将带你全面了解微服务事务管理的挑战、解决方案和最佳实践。
一、微服务事务的挑战
1.1 分布式系统的"CAP定理"
CAP定理指出,在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)三者不可兼得。微服务架构本质上就是分布式系统,我们必须在这三者之间做出权衡。
1.2 传统ACID事务的局限性
在微服务架构中,传统的ACID事务面临以下问题:
原子性(Atomicity)难以保证:跨服务的事务无法简单实现"全做或全不做"
隔离性(Isolation)级别难以维持:不同服务的数据可能被不同事务交叉访问
持久性(Durability)虽然单个服务可以保证,但整体状态可能不一致
1.3 网络不可靠性
微服务间通过网络通信,网络延迟、超时、丢包等问题使得事务管理更加复杂。
二、微服务事务模式
2.1 两阶段提交(2PC)
原理:
准备阶段:协调者询问所有参与者是否可以提交
提交阶段:如果所有参与者都同意,则通知提交;否则回滚
优点:强一致性保证 缺点:同步阻塞、性能低、协调者单点故障
// 伪代码示例
public void twoPhaseCommit(ServiceA a, ServiceB b) {
try {
// 阶段一:准备
boolean aReady = a.prepare();
boolean bReady = b.prepare(); // 阶段二:提交或回滚
if(aReady && bReady) {
a.commit(); b.commit();
} else {
a.rollback(); b.rollback();
}
} catch(Exception e) { // 异常处理 } }
2.2 补偿事务(TCC)
TCC(Try-Confirm-Cancel)模式将业务操作分为三个阶段:
- Try:预留资源,完成所有业务检查
- Confirm:确认执行业务操作
- Cancel:取消操作,释放预留资源
适用场景:对一致性要求高,且业务操作可以明确分为预留、确认两个阶段的场景
// 订单服务示例
public class OrderService {
@Transactional
public void tryCreateOrder() {
// 冻结库存等资源 }
@Transactional
public void confirmCreateOrder() {
// 确认创建订单 }
@Transactional
public void cancelCreateOrder() {
// 取消订单,释放资源 } }
2.3 事件驱动架构与最终一致性
Saga模式:
将分布式事务分解为一系列本地事务
每个本地事务发布事件触发下一个服务操作
如果某个操作失败,执行补偿操作
实现方式:
编排式(Choreography):服务间通过事件直接交互
编制式(Orchestration):中央协调器管理流程
2.4 本地消息表
原理:
- 业务操作和消息写入本地数据库(同一事务)
- 消息服务轮询消息表并发送消息
- 消费者处理消息并更新状态
优点:简单可靠,避免消息丢失 缺点:有一定延迟
三、实战:Spring Cloud实现分布式事务
3.1 使用Seata框架
Seata是阿里开源的分布式事务解决方案。
配置示例:
# application.yml
seata:
enabled: true
application-id: order-service
tx-service-group: my_tx_group
service:
vgroup-mapping:
my_tx_group: default
使用示例:
@GlobalTransactional
public void placeOrder(Order order) {
orderService.create(order);
storageService.deduct(order.getProductId(), order.getCount());
accountService.debit(order.getUserId(), order.getMoney());
}
3.2 基于Spring Cloud Stream的事件驱动
// 订单服务
@Autowired
private StreamBridge streamBridge;
@Transactional
public void createOrder(Order order) {
// 保存订单到数据库
orderRepository.save(order);
// 发布订单创建事件
streamBridge.send("orderCreated-out-0",
OrderEvent.of(order.getId(), order.getUserId(), order.getAmount()));
}
// 库存服务监听
@Bean
public Consumer handleOrderCreated() {
return event -> {
// 扣减库存
inventoryService.deduct(event.getProductId(), event.getQuantity());
};
}
四、微服务事务设计最佳实践
- 尽量减小事务范围:避免跨服务事务,优先考虑最终一致性
- 设计幂等操作:所有服务操作都应支持重复执行
- 实现补偿机制:为每个正向操作设计对应的补偿操作
- 合理设置超时:避免长时间阻塞资源
- 完善的监控和告警:及时发现和处理事务失败
- 考虑业务拆分:将强一致性的业务放在同一服务中
五、常见问题与解决方案
5.1 如何选择合适的事务模式?
- 强一致性需求:考虑2PC或TCC
- 最终一致性可接受:Saga或事件驱动
- 简单业务:本地消息表
5.2 如何处理网络超时?
- 实现重试机制
- 设置合理的超时时间
- 设计幂等接口避免重复执行问题
5.3 如何监控分布式事务?
- 分布式追踪系统(Sleuth+Zipkin)
- 事务状态日志
- 健康检查和告警
结语
在实际项目中,我们需要根据业务需求、一致性要求和性能考虑选择最合适的方案。记住,在微服务架构中,我们往往需要在"完美的一致性"和"系统的可用性"之间做出明智的取舍。
随着技术的演进,分布式事务管理也在不断发展。保持学习,理解底层原理,才能在实际工作中做出合理的设计决策。
相关文章:
《微服务事务管理》 - 教程
《微服务事务管理》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-siz…...
python之socket udp服务器实现
import socket# 1. 创建 UDP Socket (SOCK_DGRAM 表示 UDP) receiver_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 绑定地址和端口 receiver_address = (, 1883) # 端口号 9999 receiver_socket.bind(receiver_address)print("UDP 接收方已启动,等待…...
kylin SP3安装mysql 8.4.5
环境:OS:kylin SP3mysql:8.4.5 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...
Unity中是否可以禁用GC
1)Unity中可以禁用GC吗2)项目是URP管线,渲染模块CPU耗时高,经排查主要是Batches数过高,应怎样进一步排查和优化渲染批次这是第445篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。 UWA社区主页:co…...
经典SQL语句大全
经典SQL语句大全一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开始 备份BACKUP D…...
IvorySQL 与 deepin 完成兼容性认证,共创开源生态新篇章
近日,IvorySQL 与 deepin 操作系统成功完成了兼容性适配认证。这一里程碑式的成就标志着 IvorySQL 在国产操作系统生态中的进一步深化,为用户提供更稳定、高效的数据库解决方案。deepin 简介 深度操作系统 deepin 是一款以“简洁、美观、易用”著称的国产 Linux 发行版,拥有…...
在 Nginx 上搭建静态站点
1、新建站点的配置文件 vi /etc/nginx/conf.d/www.xxx.com.conf2、写入如下内容: server {listen 80;#listen [::]:80;server_name www.xxx.com; # 这里可以写你的域名,或者 _ 表示匹配所有 root /var/www/www.xxx.com; # 你的静态文件目录 index index.html index.htm;locat…...
使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战
本文详细介绍了如何通过GitHub Dork技术快速发现企业敏感信息泄露漏洞,包含实用的搜索语法和实际案例,帮助安全研究人员高效挖掘漏洞。使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战 嗨,黑客们,漏洞猎人们! 祝愿你们发现大量漏洞并获得丰厚奖励! 虽然距离…...
kylin SP3安装mysql8.0.41
环境:OS:kylin SP3mysql:8.0.41 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...
DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项
DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…...
代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素、209.长度最小的子数组
704. 二分查找 思路:刷过很多次了,就是双指针思想,初始化一个在数组最左边的指针index_l,一个在最右边的指针index_r,当index_l < index_r 的时候通过判断index_l 和 index_r所确定的区间,缩小区间,最后夹逼出我们的目标值。 注意的点:最终状态会有两个 :1.l与r相等…...
从 MLPerf Storage v2.0 看 AI 训练中的存储性能与扩展能力
8 月 5 日,全球权威 AI 工程联盟 MLCommons 发布了最新的 MLPerf Storage v2.0 基准测试结果。本次评测吸引了众多厂商参与,包括 Cloud、Shared File、Fabric-Attached Block、Direct-Attached Block 这几大类存储厂商。 由于各厂商在硬件配置、节点规模和应用场景上的差异,…...
Revit二次开发 钢筋生成API(二)
2、自由钢筋生成API 创建一条无约束的自由形状钢筋。之后无法对该钢筋添加约束。public static Rebar CreateFreeForm(Document doc,RebarBarType barType,Element host,IList<IList<Curve>> curves,out RebarFreeFormValidationResult error )这个合自由钢筋生成A…...
创建会计凭证报错:FI/CO接口:待更新的不一致的FI/CO凭证标题数据(转)
问题:使用过账BAPI_ACC_DOCUMENT_POST,自动过账时,报错原因是“FI/CO接口:待更新的不一致的FI/CO凭证标题数据”。 原因: 1、如果头数据里面的公司和行项目公司是一致的,检查行项目,不要对行项目赋公司bukrs。 "it_item-comp_code = wa_account-bukrs. 2、检查金额是…...
Uri uri = new Uri(Path); 这行代码的作用
1. 语法校验 字符串里只要多一个空格、少一个 /、中文没转义,后面 HttpClient 会直接炸。 Uri 构造函数会第一时间给你抛 UriFormatException,早发现早处理。 2. 把“一串字符”升级成“有结构的零件箱” 转成 Uri 后,你就能直接拿这些字段,而不用再 Substring、IndexOf 去…...
Qt函数方法传入参数未使用-警告warning错误error提示解决
前言全局说明某些情况下,函数(方法)会传入参数,但并不一定会使用, 但是,不使用编辑器又会警告一、说明 1.1 环境: Windows 7 旗舰版 Visual Studio 2013二、未使用参数解决 原型 Q_UNUSED(未使用参数)三、示例 3.1 文件名: public:MyThread(QWidget *parent = nullptr){Q_…...
mysql 性能监控,关键指标解析与优化案例剖析
你是否经历过数据库突然变慢却无从下手的困境?某金融平台曾因慢查询堆积导致交易响应暴增300%,某电商大促期间因缓冲池命中率骤降引发订单延迟。性能问题往往具备隐蔽性和突发性特征,本文将揭示MySQL监控的核心参数与实战诊断方法。 连接池监控是性能防护的第一道防线。Thre…...
设计模式
1.分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享 元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责…...
Rhinoceros 8.23.25251.13001 犀牛3D建模
描述 Rhinoceros 是由美国Robert McNeel公司最新出品的专业强大的3D建模软件。软件以集百家之长为一体的发展教育理念,拥有NURBS的优秀传统建模教学方法,也有一个网格进行建模插件T-Spline,使建模方式方法有了更多的挑选,然后能创建出更传神、生动的造型。能输入和输出几十…...
Git 常用操作指南
本文为你整理了 Git 的常用操作,无论你是刚接触 Git 还是需要快速查阅,这篇指南都能帮你高效管理代码版本。 🔧 初始配置 开始使用 Git 前,先配置你的用户信息: git config --global user.name "你的用户名" git config --global user.email "你的邮箱&qu…...
《深入理解计算机系统》计算机系统漫游(一) - Invinc
本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。第1章 计算机系统漫游 信息就是位+上下文 系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的…...
从几何分离到语义理解:深度解析3D点云分割与语义分割的本质区别
在三维计算机视觉领域,3D点云作为真实世界场景的核心数据载体,其处理技术直接决定了机器感知环境的精度与效率。 其中,3D点云分割与语义分割是两类关键技术,尽管二者同属点云处理范畴,但在目标定位、信息输出与应用价值上存在本质差异。 前者专注于“几何层面的分离”,通…...
欧拉筛(线性筛)算法分析
前言对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n^2),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期。在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛…...
2021年安徽省大数据与人工智能应用竞赛 大数据(网络赛)-高职组赛题
本套数据数据: 通过网盘分享的文件: 链接: https://pan.baidu.com/s/1ZQXoWQhCOAiGVcFOZozV1g?pwd=json 提取码: json 第二部分:大数据程序编写部分(30分) 任务一、数据抽取转化部分(5分) 1、使用sqoop将MySQL的sakila数据库中的city表中city列以C开头的数据导入到hdfs…...
Alexandresku设计的loki小对象内存分配器
Loki是由 Alexandresku 编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。其中有两个文件 SmallObj.h 、SmallObj.cpp 进行内存管理,可以单独进行使用 三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector&l…...
C++ 内存管理
C++ 内存管理是程序设计的核心环节,直接影响程序的性能、稳定性和安全性。C++ 不像 Java、Python 等语言有自动垃圾回收机制,而是需要开发者手动管理动态内存(或通过智能指针等机制自动管理)。 1、C++ 内存分区内存区域 存储内容 生命周期 管理方式栈 (Stack) 函数参数、局…...
一些写了和没写的数学!
P8114 [Cnoi2021] 六边形战士 传送 非常好玩的题! 首先你大概率看过一些“无字证明”,其中很经典的是这个: 证明:用若干个边长为 \(1\),顶角为 \(60\) 度的菱形拼成一个边长为 \(n\) 的正六边形,三个方向的菱形个数一定相等。这是一个经典的无字证明,虽然前置的说明要费…...
【光照】[自发光Emission]以UnityURP为例
【从UnityURP开始探索游戏渲染】专栏-直达自发光的基本原理 $Cemissive=Memissive$ 自发光是物体表面主动发射光线的现象,在光照模型中通常作为独立于外部光源的附加项。其核心特点是不受其他光照影响,但可以影响周围环境。 实现流程定义发射颜色和强度:确定基础发光颜色…...
mybatis-plus初体验,解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String
解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String 推荐这位大佬的博客: https://www.cnblogs.com/muphy/p/18653627 项目结构MyBatis-Plus配置类MyBatisPlusConfig package com.example.config;import com.baomidou.mybatisplus.annotation…...
浅谈制氢电源及英飞凌解决方案
大家对氢元素肯定都不陌生,认识它基本都是从背元素周期表开始的。近年来我们身边多了很多氢的身影,从北京冬奥会的氢燃料电池大巴,再到广州南沙小虎岛电氢智慧能源站,氢也越来越被大家熟知。工业上,氢的使用可是一点都不少,自 1975 年以来,需求量增长了三倍,而且还在继…...
微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能
在信息时代,数据量呈指数级增长,经典计算机面临算力瓶颈。量子计算以其超强的并行处理能力,被视为下一世代计算范式的颠覆者。然而,单个量子处理器的脆弱性和制造难度限制了其广泛应用。微算法科技(NASDAQ:MLGO)研发团队研究通过分布式量子计算模型,将多个量子计算节点连…...
AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢
AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢在人才竞争进入白热化的今天,招聘早已不是 HR 单方面的 “筛选任务”,而是涉及 HR 效率、候选人体验、企业战略人才储备的三角关系。传统招聘模式下,这三角常常陷入 “HR 疲于奔命却难出成果、候选人等…...
Flash Attention原理
提出问题 Transformer 结构已成为自然语言处理和图像分类等应用中最常用的架构。尽管 Transformer 在规模上不断增大和加深,但处理更长上下文仍然是一个挑战,因为核心的自注意力模块在序列长度上具有二次方的时间和内存复杂度。这导致在处理长序列时速度变慢且内存需求巨大。…...
MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案
转:http://m.blog.csdn.net/blog/2000killer/8904852 在服务器上创建的Queue开发者的 机器只能写数据而不能读数据。.net给出的错误是“对消息队列系统的访问被拒绝”,也就是说拒绝访问队列没有相关权限,我给Everyone和 ANONYMOUS LOGON赋予全部权限都无法解决(正常情况下可…...
opencv学习记录1
img = cv2.imread(pic.jpg)#读图像 #封装函数 def cv_show(name,img):cv2.imshow(image,img)#显示图像cv2.waitKey(0)#显示时间cv2.destroyWindow()#读灰度图 img = cv2.imread(pic.jpg,cv2.IMREAD_GRAYSCALE) #保存 cv2.imwrite(name,img)#读视频 vc = cv2.VideoCapture(name)…...
kylin V10SP3安装mysql5.7.42
环境:OS:kylin V10SP3mysql:5.7.42查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某些特殊目的。由 Roland McGrath …...
MATLAB 仿真无线传感器网络(WSN)三大经典场景
一、统一参数区(建议先调这里) %% 0. 公共参数 clear; clc; close all; rng(2025) % 可重复 field = [0 100; 0 100]; % 100 m 100 m nNode = 200; % 节点数 R = 15; % 通信半径 /m E0 = 0.5; …...
9.05 DP 专题
Permutation Blackhole 按照过题人数顺序做题是这样的,如果要看难一点的建议向下 首先,不要读错题 QAQ 然后你现在发现每个位置只会在它被涂黑之前向最近放位置产生一次贡献,从 P 的角度思考是困难的,考虑从被涂黑的图的角度思考 你注意到我们每次涂完两个点之后,它们中间…...
MySQL主从复制 - 指南
MySQL主从复制 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...
阿里 Qoder 体验超预期,Repo Wiki 功能迎来全新升级
作者:沉默王二 大家好,我是二哥呀。 最近,阿里发布了一款名为 Qoder(/ˈkoʊdər/)的 Agentic 开发工具。我第一时间就去尝鲜了,其 Quest Mode 和 Repo Wiki 给我印象深刻。Quest Mode 主打一个 AI 自主研发,我们只需要把工程任务扔给他,Quest Mode 就会把模糊的需求翻…...
实用指南:ZooKeeper 的选举算法
实用指南:ZooKeeper 的选举算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...
JAVA获取keytab的Principal
依赖<dependency><groupId>org.apache.kerby</groupId><artifactId>kerb-client</artifactId><version>2.0.1</version></dependency> 代码执行Keytab keytab = Keytab.loadKeytab(new File("D:\\dl.keytab"));key…...
基于霍夫变换的MATLAB虹膜检测与分割实现
一、核心代码实现 function [iris_mask, pupil_center, iris_radius] = hough_iris_segmentation(img_path)% 读取图像并预处理img = imread(img_path);gray = rgb2gray(img);blurred = imgaussfilt(gray, 2); % 高斯滤波去噪denoised = medfilt2(blurred, [3 3]); % 中值滤波…...
Linux时间同步---NTP时间同步方案
1.方案背景: 在分布式系统或多服务器集群中,必须建立统一的时间同步机制。服务器间的时间不一致会破坏各类依赖时间交互逻辑,例如导致日志时序混乱、事务顺序错乱、证书验证失败等,从而引发一系列难以排查的不可预知故障。 2.NTP同步网络拓扑图: 3.同步方案 可提前咨询医…...
java预习
课前问题列表 1.什么样的方法应该用static修饰?不用static修饰的方法往往具有什么特性?Student的getName应该用static修饰吗?适合用 static 修饰的方法: 工具类方法(如Math.abs())、工厂方法、不需要访问实例变量 / 方法的方法、单例模式的获取实例方法等,这类方法通常与…...
B/S体系结构风格
三层B/S风格-概述 》浏览器/服务器(B/S)风格就是上述三层应用结构的一种实现方式,其具体结构为:浏览器/Web服务器/数据库服务器。 》B/S体系结构主要是利用不断成熟的WWW浏览技术,结合浏览的多种脚本语言,用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能,…...
The 2024 CCPC Online Contest 7/12 L/B/K/D/J/E/C
Problem L. 网络预选赛 签到,直接模拟即可点击查看代码 #include<bits/stdc++.h> using namespace std; int main(){int n,m;cin>>n>>m;vector<string>a(n);for(int i=0;i<n;i++){cin>>a[i];}int sum=0;for(int i=0;i<n-1;i++){for(int j…...
在joule里面使用agent 功能
test: Dev: 1: structure 2: 本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究...
Feign动态URL配置
方式一、亲测可用,缺点是每个类都需要单独配置@FeignClient(value = "my-biz", url = "${external.my.biz_url}", configuration = FeignHeaderInterceptor.class) public interface MyBizFeign {}@Data @Component @RefreshScope @ConfigurationProperti…...
自动化部署工具 Jenkins 的安装与配置
Jenkins 是一个开源的自动化部署工具,广泛用于持续集成(CI)和持续交付(CD)流程。它支持自动化构建、测试和部署应用程序。以下是 Jenkins 的安装与配置的详细教程。1. 安装 Jenkins 以下步骤适用于 Linux 系统(以 Ubuntu 和 CentOS 为例),并包含安装必要的依赖环境。1.…...