1.「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md
2.Springå®å®£ï¼SpringFramework6åSpringBoot3èå¿å¾
åï¼
3.SpringBoot中的源码Swagger2如何使用?
4.springcloudstreamç¨çå¤åï¼
5.Spring Boot官方文档翻译
「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md
原文链接为: Spring Transaction Management: @Transactional In-Depth | MarcoBehler
你可以通过本文,对@Transactional 注解在 Spring 事务管理中的翻译运行机制,形成一个简明实用的源码理解。
唯一的翻译阅读前提?你需要对数据库 ACID 原则有个大致了解,即数据库事务是源码什么,我们为什么需要它。翻译源码资本和源码时代的区别此外,源码本文没有覆盖分布式事务和反应式事务(reactive transactions),翻译尽管在 Spring 中下文提到的源码一些通用原则也是适用的。
在本文中,翻译你将学到 Spring 事务抽象框架的源码核心概念,同时会有很多示例代码帮助你理解。翻译
相对于 Spring 官方文档,源码本文不会让你迷失在 Spring 的翻译上层概念里。 相反你会以不同寻常的源码路径来学习 Spring 事务管理。从底层开始,一层层向上。也就是说,你将从普通原始的 JDBC 事务学起。
普通的 JDBC 事务是如何工作的?如何 start, commit 或 rollback JDBC 事务?最终,他们都做了同样的事来开启和关闭(或称为“管理”)数据库事务。纯 JDBC 事务管理代码如下:这 4 行高度简化的2dx源码代码,就是 Spring@Transactional 为你在背后做的所有事情。在下一章节中,你将会学到他们是如何工作的。在此之前,我们还有一丁点知识点要补充。
如何使用 JDBC 隔离级别和保存点(savepoints)?如果你已经使用过 Spring@Transactional 注解,你可能碰到过类似用法:我们会在后文更加详细的介绍 Spring 嵌套事务和隔离级别,在这重复提及,是因为这些参数最终可提炼成如下 JDBC 代码:
Spring 或 Spring Boot 的事务是如何工作的?既然现在你对 JDBC 事务有了基础的理解,让我们再去探究下纯粹的 Spring 核心事务。这里所讲都可 1:1 适用于 Spring Boot 和 Sring MVC,但又做了一些补充。到底什么是 Spring 事务管理或事务抽象框架?记住,事务管理可简单理解为:Spring 如何 start, commit 或 rollback JDBC 事务?是不是听着和前文讲得很相似?抓住重点:基于 JDBC 你只有一个方法(setAutocommit(false))来开启事务管理,Spring 提供了许多不同,但更方便的封装来做相同的事情。
如何使用 Spring 编程式事务管理?最初,但现在很少使用方式,是在 Spring 通过编程定义事务:通过TransactionTemplate 或者直接使用 PlatformTransactionManager。代码示例如下「译者注:参见配套项目 BookingServcie 实现」:与 JDBC 示例 比较:尽管这是一个不小的改进,但编程式事务管理并不是易视腾源码 Spring 事务框架主要关注的。相反,声明式事务管理才是重头戏。让我们一探究竟
如何使用 Spring 的@Transactional 注解(声明式事务管理)?让我们看下时下的 Spring 事务管理通常怎么用:这是怎么做到的?没有了冗余的 XML 配置和额外的编码。相反,你只需要做两件事:所以,为了让@Transactional 工作,你需要:现在,我说 Spring 透明的为你处理事务,到底在指什么? 在有了 JDBC 事务示例 的知识储备后,@Transactional 标注的 UserService 可以翻译简化成:这个示例看起来像魔术,让我们继续探究下 Spring 是如何为你自动插入这些连接代码的。
CGLIB & JDK 代理 - 在@Transactional 之下?Spring 不能真的像我上面做的那样,去重写你的 Java 类来插入连接代码(除非你使用字节码增强等高级技术,在这我们暂时忽略它)
你的registerUser() 方法还是只是调用了 userDao.save(user),这是无法实时改变的。但是 Spring 有它的优势。在核心层,它有一个 IoC 容器。它实例化一个UserService 单例并可自动注入到任何需要 UserService 的 Bean 中。不管何时你在一个 Bean 上使用@Transactional,Spring 使用了个小伎俩。P20源码它不是直接实例化一个 UserService 原始对象,而是一个 UserService 的事务代理对象。借助 Cglib library 的能力,它可以使用子类继承代理(proxy-through-subclassing)的方式来实现。当然还有其他方式可以构造代理对象(例如 Dynamic JDK proxies 「译者注:这要求代理对象有相应接口类」),这里暂不做展开。
你的UserService 可以动态生成代理类,并且代理可以帮你管理事务。但是并不是代理类本身去处理事务状态(open,commit,close),而是委托给了事务管理器(transaction manager)。
你的UserService 有一个 invoice() 事务方法。它调用了另外一个 InvoiceService 类上的 createPdf() 事务方法。然而从 Spring 看来,这里有 2 个逻辑事务存在:第一个在UserService,另外一个在 InvoiceService。Spring 足够智能知道让两个 @Transactional 标记的方法,在底层使用同一个物理数据库事务。
更改事务传播模式为requires_new 告诉 Spring:createPDF() 需要在它自己的、独立于其他任何已经在的聚e起源码事务里执行。这意味着你的底层代码会打开 2(物理)连接/事务 到数据库。Spring 依旧能够机智的把 2 个 逻辑事务( invoice()/createPdf() )映射到两个不同的物理数据库事务上。
每个 Spring 传播模式在 数据库或 JDBC 连接层面到底做了什么?练习: 在原始 Java 实现那节,我展示了 JDBC 能够对事务进行的所有操作。花几分钟思考下,每个 Spring 传播模式在数据库或 JDBC 连接层面到底做了什么。然后再看下下面的解答。
答案:如你所见,大多数传播模式并没有在数据库或 JDBC 层面做什么事情。更多的是通过 Spring 来组织你的代码,告诉 Spring 如何/什么时候/哪里需要事务处理。
在示例中,任何时候你调用UserService 的 myMethod() 方法,Spring 期望这里有一个打开的事务。它不会为自己开启,相反,在没有已开启事务的情况下调用方法,Spring 会抛出异常。请记住这 “逻辑事务处理”的补充知识点。
@Transactional 上隔离级别(Isolation Levels)代表什么?这是个抖机灵的问题,但当你如下配置的时候,到底发生了什么?哈,这可以简单地等价于:然而数据库事务隔离级别,是一个复杂的主题,你需要自己花些时间去掌握。Pstgres 的官方文档中的 isolation levels 章节,是个不错的入门文档。
最容易踩的@Transactional 的坑?这里有一个 Spring 新手经常踩的坑,看下如下代码:你有一个UserService 类,事务方法 invoice 内部调用了事务方法 createPdf()。所以,当有人调用invoice() 的时候,最终有个多少个物理事务被打开?答案不是 2 个,而是 1 个,为什么呢?让我们回到本文中代理那章节。Spring 为你创建了UserService 代理类,但代理类内部的方法调用,是无法被代理的。也就是说,没有新的事务为你生成。这里有技巧(例如: self-injection 「译者注:参见示例项目 InnerCallSercie」),可以帮助你绕过该限制。但主要收获是:始终牢记代理事务的边界。
在 Spring Boot 或 Spring MVC 中使用@Transactional?我们目前只是讨论了纯粹的核心 Spring 上的用法。那在 Spring Boot 或 Spring MVC 中会有什么使用差异吗?答案是:没有。无论使用何种框架(或更确切地说:Spring 生态系统中的所有框架),您都将始终使用 @Transactional 注解,配合事务管理器,以及@EnableTransactionManagement 注解。没有其他用法了。但是,与 Spring Boot 的唯一区别是,通过 JDBC 自动配置,它会自动设置@EnableTransactionManagement 注解,并为你创建 PlatformTransactionManager。
关于 Spring 回滚的部分,将会在下一次文章修订中补充。Spring Boot 内回滚是通过@Transactional 注解上 rollback 系列配置实现的,读者可查阅源码注释了解使用方式,注释还是写得很完备的,本质上也是根据配置条件,确定何时调用 commit,何时调用 rollback。
Spring 和 JPA / Hibernate 事务管理是如何一起工作的?目标:同步 Spring@Transactional 和 Hibernate / JPA。在这个节点上,你期望 Spring 可以和其他数据库框架,类似 Hibernate(一个流行的 JPA 实现)或 Jooq 等整合。让我来看一个纯粹的 Hibernate 示例(注意:直接使用 Hibernate 还是通过 JPA 使用 Hibernate 都没关系)。用 Hibernate 将UserService 重写如下:然而上述代码有一个大问题:但最终我们还是可以将 Spring 和 Hibernate 无缝整合,也就是说他们其实可以理解对象的事务概念。代码如下:这是怎么做到的?使用 HibernateTransactionManager 有一个非常简单的解决此集成问题的方法:相比在 Spring 配置里使用 DataSourcePlatformTransactionManager,你可以替换成 HibernateTransactionManager(如果使用了原生 Hibernate)或 JpaTransactionManager(如果通过 JPA 使用了 Hibernate)。这个定制化的 HibernateTransactionManager 会确保:与往常一样,一图胜千言(不过请注意,代理和真实服务之间的流程在这被高度抽象和简化了)。
理解 Spring 事务管理后,你应该对 Spring 框架是如何处理事务,以及如何应用于其他 Spring 类库(例如 Spring Boot 或 Spring WebMVC)有了一个很好的了解。最大的收获应是:最终使用哪种框架都无关紧要,这一切可以映射到 JDBC 的基础概念上。正确理解它们(记住:getConnection(),setAutocommit(false),commit()),在以后碰到复杂的企业级项目的使用,你能更容易抓住本质。
到目前为止,你已经对 Spring 事务管理有了全面的了解,希望你在实践中能够灵活运用这些知识,解决实际项目中的事务问题。感谢阅读。
Springå®å®£ï¼SpringFramework6åSpringBoot3èå¿å¾ åï¼
SpringOne大ä¼ä¸å®£å¸äºä¸ä»¶é大çäºæ ï¼SpringFramework6åSpringBoot3计åå¨å¹´ç¬¬åå£åº¦è½å¤è¾¾å°ç产å¯ç¨çåå¸æ åãSpring6.0çå®æ´åå¸è·¯çº¿å¾å¦ä¸ï¼
ç®å解éä¸ä¸ä¸åçæ¬çåºå«ï¼
M1M2M3M4ä¸Mæ¯Milestoneéç¨ç¢çææã代表åè½å¯è½è¿ä¸å®æ´ï¼å¯è½åå¨ä¸äºé®é¢ã
RC1RC2RC3ä¸çRCæ¯ReleaseCandidateç缩åï¼ç¿»è¯è¿æ¥çææå°±æ¯åå¸åéã代表åè½å®æ´ä¸ç¸å¯¹ç¨³å®ï¼ä¸»è¦è¿è¡é®é¢è§£å³ã
GAæ¯GeneralAvailabilityç缩åï¼ç¿»è¯è¿æ¥çä¸è¬å¯ç¨ï¼ä»£è¡¨ç¨³å®å¯ç¨äºç产ççæ¬ã
SpringFramework6å¯ä»¥è¯´æ¯Springä¸ä¸æ¥éç¹è§åçä¸ä¸ªé¡¹ç®ï¼æ å¿çSpringè¿å ¥æ°çæ¶ä»£ï¼å¾å¤§ç¨åº¦ä¸å ³ç³»äºSpringè½å¤æ²¿è¢è¿å»çè¾ç ã
å¨æ¡æ¶è®¾è®¡ä¸ï¼SpringFramework6ç¸å¯¹æ¥è¯´æ¯è¾æ¿è¿ãSpringFramework6åSpringBoot3å¨è¿è¡æ¶è³å°éè¦JDKï¼ä»¥åè³å°Tomcat/Jettyï¼ä¸ºäºä¸JakartaEE9å ¼å®¹ï¼ã
JakartaEE:JavaEEï¼Javaå¹³å°ä¼ä¸çï¼JavaPlatformEnterpriseEditionï¼ï¼ä¹å称为Java2Platform,EnterpriseEdition(J2EE)ï¼å¹´3ææ´å为JakartaEE
è¿ä¸ªä¹æ¯å¨Springå®æ¹å¨æ·±æçèä¹ååå®çç»æã
å 为ï¼JDKå¨å¹´ç¬¬åå£åº¦å表ä¹åå°å代JDKä½ä¸ºä¸ä¸ä¸ªé¿ææ¯æçJDKçæ¬ãåæ¶ï¼è¿ä¹æ¯ä¸ºJDKåJDKï¼JakartaEEçå°æ¥ååå¤ã
Springå®æ¹è®¤ä¸ºJDKä» ä» æ¯ä¸ä¸ªè¿æ¸¡ä½¿ç¨çJDKçæ¬ï¼èJDKå ä¹æ¯ä¸ä¸ªå ¨æ°çç¼ç¨è¯è¨ï¼å¢å¼ºåå®åäºAPIåJVMï¼è¿è®©å级JDKæ为æ´å ·å¸å¼åçéæ©ã
åè¯æ¯è¿æ ·è¯´çï¼âincomparison,JDKisatransitionalrelease.Also,JDKprovidesanaccumulatedsetofrecentlanguage,APIandJVMenhancements,makingitamorecompellingupgrade.â
SpringFramework5.3.xåSpringBoot2.xææ¶ä»å¨ç§¯æå¼åä¸ï¼SpringBoot2.6åSpringBoot2.7ä»ç¶ä¼åºäºSpringFramework5.3.xã
é¢è®¡ä¼å¨ä»å¹´ææ¨åºSpringBoot2.6ï¼æå¹´5æ份æ¨åºSpringBoot2.7ã
SpringOne大ä¼ä¸è¿è¯¦ç»ä»ç»äºSpringNativeçç¸å ³æ åµä»¥åææ°è¿å±ã
SpringNativeæ¯ä»ä¹å¢ï¼å®æ¹æ¯è¿æ ·ä»ç»çï¼
âSpringNativeprovidesbetasupportforcompilingSpringBootapplicationstonativeexecutableswithGraalVM,providinganewwaytodeploySpringBootapplicationsthatthenrunextremelyefficiently.â
ç®åæ¥è¯´ï¼è¿å°±æ¯ä¸ç§ä½¿ç¨GraalVMå°Springåºç¨ç¼è¯æåçéåçææ¯ï¼ä½ å¯ä»¥å°å ¶çä½æ¯é¨ç½²SpringBootåºç¨ç¨åºçæ°æ¹æ³ï¼æ´å é«æå¿«éï¼
æ ¹æ®å®æ¹ä»ç»ï¼SpringNativeçæ建æ¶é´é常è¦é¿ä¸äºï¼ä¸è¿å¨å®¹å¨éå大å°ãå åå ç¨ãå¯å¨æ¶é´ä¸ä¼å¿é常大ï¼
强ç建议å°ä¼ä¼´ä»¬æ¾å°å¯¹åºçPPTï¼æå·²æ´çï¼ææ«é¢åå³å¯ï¼åè§é¢çä¸çï¼è®²è§£çéå¸¸æ¸ æ¥ã
为äºåºå¯¹äºåçæ¶ä»£å ¶ä»ç¼ç¨è¯è¨çææï¼Spring表示èªå·±æ£å¨ç«å°½å ¨åæé ä¸ä¸ªå¼ºå¤§çJavaäºåççæç³»ç»ãæç®ä»¥å¾ å§ï¼
ç¸å ³èµæï¼
FromSpringFramework5.3to6.0
AJavaandJakartaEE9baselineforSpringFramework6
ä½è ï¼JavaGuideSpringBoot中的Swagger2如何使用?
背景
在之前我们已经在SpringBoot项目中集成好了Swagger2组件,同时已经可以成功访问了相关的swagger-ui.html,那么现在我们就来看一下Swagger的相关注解如何使用吧。
Swagger2的一些注解应用先看一下官方的一些解释。
如果有兴趣,可以自行查看这里。
接下来我们来看一下具体的翻译信息:
注解名称功能描述@Api将类标记为Swagger资源。@ApiImplicitParam表示API操作中的单个参数。@ApiImplicitParams允许多个ApiImplicitParam对象列表的包装器。@ApiModel提供有关Swagger模型的其他信息。@ApiModelProperty添加和操作模型属性的数据。@ApiOperation描述针对特定路径的操作或通常的HTTP方法。@ApiParam为操作参数添加额外的元数据。@ApiResponse描述操作的可能响应。@ApiResponses允许多个ApiResponse对象列表的包装器。@Authorization声明用于资源或操作的授权方案。@AuthorizationScope描述OAuth2授权范围。@ResponseHeader表示可以作为响应的一部分提供的标头。通过这些,我们就可以对具体的类进行修饰。
下面我们来看一下一个Demo。
@Api(tags="Demo演示接口")@Slf4j@RestController("demo")publicclassDemoController{ @ApiOperation(value="@Demo演示接口1",notes="@Demo演示接口1")@GetMapping("/list/{ name}")@ResponseBodypublicStringtest(@PathVariableStringname){ log.info(name);System.out.println("test");returnname;}@ApiOperation(value="Demo演示接口2",notes="Demo演示接口2")@GetMapping("/test")@ResponseBodypublicStringtest1(){ log.info("test");return"test1";}}springcloudstreamç¨çå¤åï¼
SpringCloudStreamä»ç»
SpringCloudStreamæ¯å建æ¶æ¯é©±å¨å¾®æå¡åºç¨çæ¡æ¶ãSpringCloudStreamæ¯åºäºspringbootå建ï¼ç¨æ¥å»ºç«åç¬çï¼å·¥ä¸çº§springåºç¨ï¼ä½¿ç¨springintegrationæä¾ä¸æ¶æ¯ä»£çä¹é´çè¿æ¥ãæ¬ææä¾ä¸å代çä¸çä¸é´ä»¶é ç½®ï¼ä»ç»äºæä¹ ååå¸è®¢é æºå¶ï¼ä»¥åæ¶è´¹ç»ä»¥ååå²çæ¦å¿µãå°æ³¨è§£@EnableBindingå å°åºç¨ä¸å°±å¯ä»¥å®ç°ä¸æ¶æ¯ä»£ççè¿æ¥ï¼@StreamListener注解å å°æ¹æ³ä¸ï¼ä½¿ä¹å¯ä»¥æ¥æ¶å¤çæµçäºä»¶ã
åç:
ç¿»è¯ï¼
PS:ç产è ymlé ç½®
PS:Baristaæ¥å£ä¸ºèªå®ä¹ç®¡é
PS:ç产è æ¶æ¯æé
PS:SpringBootåºç¨å ¥å£
PS:æ¶è´¹è ymlé ç½®
PS:Baristaæ¥å£ä¸ºèªå®ä¹ç®¡é
PS:æ¶è´¹è æ¶æ¯è·å
PS:SpringBootåºç¨å ¥å£
SpringCloud()ââStreamä»ç»
å½æ们çåå¸å¼ç³»ç»å»ºè®¾å°ä¸å®ç¨åº¦äºï¼æè æå¡é´æ¯éè¿å¼æ¥è¯·æ±æ¥é讯çï¼é£ä¹æ们é¿å ä¸äºä½¿ç¨MQæ¥è§£å³é®é¢ã
åå¦å ¬å¸å é¨è¿è¡äºä¸å¡å并æè æ´åï¼éè¦æå¡Aåæå¡Béè¿MQçæ¹å¼è¿è¡æ¶æ¯ä¼ éï¼èæå¡Aç¨çæ¯RabbitMQï¼æå¡Bç¨çæ¯Kafkaï¼é£ä¹æè¦å¨æå¡éåæ¶ä½¿ç¨ä¸¤ä¸ªæ¶æ¯ç»ä»¶åï¼
æ没æä¸ç§ææ¯è®©æ们ä¸åå ³æ³¨å ·ä½MQçç»èï¼åªéè¦ç¨ä¸ç§éé ç»å®çæ¹å¼å¢ï¼
å½ç¶æï¼cloudStream就解å³äºè¿ä¸ªé®é¢ã
å®ç½å°åï¼
å®æ¹å®ä¹SpringCloudStreamæ¯ä¸ä¸ªæ建æ¶æ¯é©±å¨å¾®æå¡çæ¡æ¶ã
åºç¨ç¨åºéè¿inputsæè outputsæ¥ä¸SpringCloudStreamä¸çbinder对象交äºã
éè¿æ们é ç½®æ¥binding(ç»å®)ï¼èSpringCloudStreamçbinder对象è´è´£ä¸æ¶æ¯ä¸é´ä»¶äº¤äºã
æ以ï¼æ们åªéè¦ææ¸ æ¥å¦ä½ä¸SpringCloudStream交äºå°±å¯ä»¥æ¹ä¾¿ä½¿ç¨æ¶æ¯é©±å¨çæ¹å¼ã
èéè¿SpringInterationæ¥è¿æ¥æ¶æ¯ä»£çä¸é´ä»¶ä»¥å®ç°æ¶æ¯äºä»¶é©±å¨ã
SpringCloudStream为ä¸äºä¾åºåçæ¶æ¯ä¸é´ä»¶äº§åæä¾äºä¸ªæ§åçèªå¨åé ç½®å®ç°ï¼å¼ç¨äºåå¸-订é ãæ¶è´¹ç»ãååºçä¸ä¸ªæ ¸å¿æ¦å¿µã
ä½æ¯ç®åä» æ¯æRabbitMQãKafka
å¨æ²¡æç»å®å¨è¿ä¸ªæ¦å¿µçæ åµä¸ï¼æ们çSpringBootåºç¨
è¦ç´æ¥ä¸æ¶æ¯ä¸é´ä»¶è¿è¡ä¿¡æ¯äº¤äºçæ¶åï¼ç±äºåæ¶æ¯ä¸é´ä»¶æ建çåè¡·ä¸åï¼å®ä»¬çå®ç°ç»èä¸ä¼æè¾å¤§çå·®å¼æ§ã
éè¿å®ä¹ç»å®å¨ä½ä¸ºä¸é´å±ï¼å®ç¾å°å®ç°äºåºç¨ç¨åºä¸æ¶æ¯ä¸é´ä»¶ç»èä¹é´çé离ã
éè¿ååºç¨ç¨åºæ´æ¼ç»ä¸çChannelééï¼ä½¿å¾åºç¨ç¨åºä¸éè¦åèèåç§ä¸åçæ¶æ¯ä¸é´ä»¶å®ç°ã
éè¿å®ä¹ç»å®å¨Binderä½ä¸ºä¸é´å±ï¼å®ç°äºåºç¨ç¨åºä¸æ¶æ¯ä¸é´ä»¶ç»èä¹é´çé离
Binderï¼å¾æ¹ä¾¿çè¿æ¥ä¸é´ä»¶ï¼å±è½å·®å¼
Channelï¼ééï¼æ¯éåQueueçä¸ç§æ½è±¡ï¼å¨æ¶æ¯é讯系ç»ä¸å°±æ¯å®ç°åå¨å转åçåªä»ï¼éè¿Channel对éåè¿è¡é ç½®ã
SourceåSinkï¼ç®åçå¯ç解为åç §å¯¹è±¡æ¯SpringCloudStreamèªèº«ï¼ä»Streamåå¸æ¶æ¯å°±æ¯è¾åºï¼æ¥åæ¶æ¯å°±æ¯è¾å ¥ã
SpringCloud|æ¶æ¯é©±å¨ââStreamå¨å¾®æå¡çæ¶æä¸ï¼åæåä¸çåºç¨è¢«æåæäºå¤ä¸ªæå¡ï¼æ以微æå¡ä¹é´çæ¶æ¯ä¼ éä¹è¶æ¥è¶é¢ç¹ã
为äºè§£å³è¿ä¸ªé®é¢ï¼å°±éæ©æ¶æ¯ä¸é´ä»¶ââStreamã
éè¿æ¶æ¯ä¸é´ä»¶å°±å¯ä»¥åå¨å转åå¾®æå¡ä¹é´çå¼æ¥æ°æ®ï¼ä½¿å¾å¾®æå¡ä¹é´ä¸ç¨ç´æ¥éä¿¡ï¼ä»è使微æå¡çåºç¨éä¸å¨ä¸å¤ã
å½å¾®æå¡Aåå¾®æå¡Båéæ¶æ¯æ¶ï¼è¥ç½ç»ä¸å¯ç¨æå¾®æå¡Bä¸å¨çº¿ï¼åæ¶æ¯ä¸é´ä»¶ä¼åå¨æ¶æ¯ï¼ç´å°è¿æ¥åå¾å¯ç¨æå¾®æå¡Bæ¢å¤ï¼æ¶æ¯ä¸é´ä»¶å¨å°æ¶æ¯è½¬åå°å¾®æå¡Bä¸ã
è¿æ ·å°±ä¿éäºæ¶æ¯çå¯é æ§ï¼åæ¶ï¼ä¹é¿å äºå¾®æå¡Açå¾ å¾®æå¡Bå¤çæ¶æ¯èé æçå¾ é»å¡ï¼è½å¤ä¿è¯ç³»ç»æ éæ¶æ¶æ¯çæ£å¸¸ä¼ è¾ã
åæ¶SpringCloudStreamæ¯æå¤ç§æ¶æ¯ä¸é´ä»¶çæ´åï¼ä¾å¦ï¼KafkaãRabbitMQçï¼ç»§æ¿äºSpringåºç¨çæ¡æ¶ç念ï¼å®ç°åºäºæ³¨è§£é©±å¨æ¡æ¶ã
1ãä»ä¹æ¯æ¶æ¯é©±å¨å¼å
2ãSpringCloudStreamç®ä»
3ã使ç¨âåå¸-订é â模å¼
æ¯ä¸ä¸ªä¸æ¾èµ·èçæ¥åï¼é½æ¯å¯¹çå½çè¾è´ãä¸ä¸ªäººç¥éèªå·±ä¸ºä»ä¹èæ´»ï¼å°±å¯ä»¥å¿åä»»ä½ä¸ç§çæ´»ãå ¶å®äººè·æ æ¯ä¸æ ·çï¼è¶æ¯åå¾é«å¤çé³å ï¼å®çæ ¹å°±è¶è¦ä¼¸åé»æçå°åºã
Spring Boot官方文档翻译
为实现公司微服务监控集成,我决定通读Spring Boot Actuator官方文档并尝试翻译。然而,当我翻译至最后一章节时,意外发现网上已有多版本翻译,涵盖范围广泛,不仅限于Actuator部分。此发现令人感到疲惫,转而将其视为英语提升的途径。
我未将拙作翻译发布,反而推荐了两位翻译大神的作品。
版本:1.4.1.RELEASE
版本:2.0.1.RELEASE