微服务框架支持

article/2025/8/27 9:59:16

事务上下文

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.Seata 的事务上下文由 RootContext 来管理。
      • 2.应用可以通过 RootContext 的 API 接口来获取当前运行时的全局事务 XID。
      • 3.应用是否运行在一个全局事务的上下文中,就是通过 RootContext 是否绑定 XID 来判定的。
      • 4.事务传播
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

Seata 的事务上下文由 RootContext 来管理。

需求:

Seata 的事务上下文由 RootContext 来管理。

设计思路

应用开启一个全局事务后,RootContext 会自动绑定该事务的 XID,事务结束(提交或回滚完成),RootContext 会自动解绑 XID。

实现思路分析

1.Seata 的事务上下文由 RootContext 来管理。

// 绑定 XID
RootContext.bind(xid);// 解绑 XID
String xid = RootContext.unbind();

2.应用可以通过 RootContext 的 API 接口来获取当前运行时的全局事务 XID。

// 获取 XID
String xid = RootContext.getXID();

3.应用是否运行在一个全局事务的上下文中,就是通过 RootContext 是否绑定 XID 来判定的。

public static boolean inGlobalTransaction() {
return CONTEXT_HOLDER.get(KEY_XID) != null;
}

4.事务传播

  1. 服务内部的事务传播

默认的,RootContext 的实现是基于 ThreadLocal 的,即 XID 绑定在当前线程上下文中。

  1. 服务内部的事务传播
    默认的,RootContext 的实现是基于 ThreadLocal 的,即 XID 绑定在当前线程上下文中。
public class ThreadLocalContextCore implements ContextCore {private ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<Map<String, String>>() {@Overrideprotected Map<String, String> initialValue() {return new HashMap<String, String>();}};@Overridepublic String put(String key, String value) {return threadLocal.get().put(key, value);}@Overridepublic String get(String key) {return threadLocal.get().get(key);}@Overridepublic String remove(String key) {return threadLocal.get().remove(key);}
}

所以服务内部的 XID 传播通常是天然的通过同一个线程的调用链路串连起来的。默认不做任何处理,事务的上下文就是传播下去的。

如果希望挂起事务上下文,则需要通过 RootContext 提供的 API 来实现:

// 挂起(暂停)
String xid = RootContext.unbind();

// TODO: 运行在全局事务外的业务逻辑

// 恢复全局事务上下文
RootContext.bind(xid);

  1. 跨服务调用的事务传播
    通过上述基本原理,我们可以很容易理解:
    跨服务调用场景下的事务传播,本质上就是要把 XID 通过服务调用传递到服务提供方,并绑定到 RootContext 中去。
    只要能做到这点,理论上 Seata 可以支持任意的微服务框架。

对 Dubbo 支持的解读:
下面,我们通过内置的对 Dubbo RPC 支持机制的解读,来说明 Seata 在实现对一个特定微服务框架支持的机制。

对 Dubbo 的支持,我们利用了 Dubbo 框架的 org.apache.dubbo.rpc.Filter 机制。

/*** The type Transaction propagation filter.*/
@Activate(group = { Constants.PROVIDER, Constants.CONSUMER }, order = 100)
public class TransactionPropagationFilter implements Filter {private static final Logger LOGGER = LoggerFactory.getLogger(TransactionPropagationFilter.class);@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String xid = RootContext.getXID(); // 获取当前事务 XIDString rpcXid = RpcContext.getContext().getAttachment(RootContext.KEY_XID); // 获取 RPC 调用传递过来的 XIDif (LOGGER.isDebugEnabled()) {LOGGER.debug("xid in RootContext[" + xid + "] xid in RpcContext[" + rpcXid + "]");}boolean bind = false;if (xid != null) { // Consumer:把 XID 置入 RPC 的 attachment 中RpcContext.getContext().setAttachment(RootContext.KEY_XID, xid);} else {if (rpcXid != null) { // Provider:把 RPC 调用传递来的 XID 绑定到当前运行时RootContext.bind(rpcXid);bind = true;if (LOGGER.isDebugEnabled()) {LOGGER.debug("bind[" + rpcXid + "] to RootContext");}}}try {return invoker.invoke(invocation); // 业务方法的调用} finally {if (bind) { // Provider:调用完成后,对 XID 的清理String unbindXid = RootContext.unbind();if (LOGGER.isDebugEnabled()) {LOGGER.debug("unbind[" + unbindXid + "] from RootContext");}if (!rpcXid.equalsIgnoreCase(unbindXid)) {LOGGER.warn("xid in change during RPC from " + rpcXid + " to " + unbindXid);if (unbindXid != null) { // 调用过程有新的事务上下文开启,则不能清除RootContext.bind(unbindXid);LOGGER.warn("bind [" + unbindXid + "] back to RootContext");}}}}}
}

参考资料和推荐阅读

  1. https://seata.io/zh-cn/docs/user/microservice.html

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~


http://chatgpt.dhexx.cn/article/M6xUdFvg.shtml

相关文章

开源微服务框架

诞生于 2014 年的“微服务架构”&#xff0c;其思想经由 Martin Fowler 阐述后&#xff0c;在近几年持续受到重视&#xff0c;理论与相关实践都不断发展&#xff0c;目前它已经成为了主流软件架构模式。 关于微服务架构是什么&#xff0c;没有一个明确的定义&#xff0c;每个实…

微服务框架入门(springcloud)

在学习微服务之前我们先理解一下什么是微服务? 微服务是springcloud吗? 微服务是分布式架构的一种,分布式架构就是要把服务拆分,拆分的过程中存在着许多的问题,springcloud仅仅是解决了拆分过程中的服务治理问题,至于其他的复制的问题并没有给出方案 传统的架构把业务写在…

golang 微服务框架

rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架&#xff0c;基于Golang net/rpc实现。 谈起分布式的RPC框架&#xff0c;比较出名的是阿里巴巴的dubbo,包括由当当网维护的dubbox。 不知道dubbo在阿里的内部竞争中败给了HSF&#xff0c;还是阿里有意将其闭源…

微服务框架-SpringCloud

3 总结 拜托&#xff01;面试请不要再问我Spring Cloud底层原理_云深i不知处的博客-CSDN博客 最后再来总结一下&#xff0c;上述几个Spring Cloud核心组件&#xff0c;在微服务架构中&#xff0c;分别扮演的角色&#xff1a; Eureka&#xff1a;各个服务启动时&#xff0c;E…

SpringCloud微服务框架(通俗易懂,一秒上手)

&#x1f381;&#x1f381;资源&#xff1a;https://pan.baidu.com/s/1zRmwSvSvoDkWh0-MynwERA&pwd1234 SpringCloud微服务框架 &#xff08;一&#xff09;认识微服务服务架构演变SpringCloud &#xff08;二&#xff09;微服务拆分案例服务拆分服务间调用 &#xff08;三…

微服务学习——微服务框架

Nacos配置管理 统一配置管理 配置更改热更新 将配置交给Nacos管理的步骤&#xff1a; 在Nacos中添加配置文件在微服务中引入nacos的config依赖在微服务中添加bootstrap.yml&#xff0c;配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个…

SpringCloud 微服务框架

单体架构&#xff1a;将业务全部功能集中到一个项目中&#xff0c;打成一个war包存储,部署在一台服务器中&#xff0c;只有一个数据库 优点 &#xff1a;架构简单&#xff0c;部署成本低。适合小型项目 问题&#xff1a;高并发性能问题&#xff0c;开发时代码耦合问题&#x…

零基础秒懂:手把手教你搭建一套微服务框架!

个人博客请访问 http://www.x0100.top 这套微服务框架能干啥&#xff1f; 这套系统搭建完之后&#xff0c;可以实现&#xff1a; 微服务架构&#xff0c;你的整个应用程序将会被拆分成一个个功能独立的子系统&#xff0c;独立运行&#xff0c;系统与系统之间通过 RPC 接口通…

微服务架构 — 微服务框架

目录 文章目录 目录微服务框架第一代微服务框架Spring CloudDubbo下一代微服务框架 — Service MeshIstioEnvoyKubernetes + Service Mesh = 完整的微服务框架微服务框架 微服务架构首先要面对分布式架构的内生复杂性,即:服务通信和服务治理的复杂性,例如:服务发现、熔断、…

微服务架构与开源框架

微服务架构介绍及实践 微服务现在是一个很火的概念&#xff0c;尤其是搞IT的大多数都对其有所了解。 到底火到什么程度呢&#xff1f;2016年有一个统计说&#xff0c;两千家企业里&#xff0c;30%在使用微服务&#xff0c;15%在实验开发和测试微服务架构&#xff0c;24%在学习…

微服务框架

这里写自定义目录标题 微服务框架功能Spring Cloud简介Eureka简介Eureka⼊⻔源码解析Eureka的⼀些概念 Register 服务注册 微服务框架功能 微服务具有以上的这些特点&#xff0c;那么作为⼀个微服务框架&#xff0c;⽐如Spring Cloud&#xff0c;应该具备⼀些什么功能 呢&…

微服务框架springcloud

基础 单体架构&#xff1a;将业务全部功能集中到一个项目中&#xff0c;打成一个war包存储,部署在一台服务器中&#xff0c;只有一个数据库 优点 &#xff1a;架构简单&#xff0c;部署成本低。适合小型项目 问题&#xff1a;高并发性能问题&#xff0c;开发时代码耦合问题&…

微服务框架的介绍

一、什么是微服务 微服务并没有一个官方的定义&#xff0c;可以理解为一种架构风格&#xff0c;将一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署&#xff0c;各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在…

第六篇:微服务框架(SpringBoot、SpringCloud)

目录 一. 微服务框架 1. 微服务架构概念 2. 微服务的利与弊&#xff08;为什么要用微服务&#xff09; 二. SpringBoot 1. SpringBoot是什么&#xff1f; 2. SpringBoot核心注解是什么&#xff1f; 3. 什么是SpringBoot的自动配置&#xff1f;原理是什么&#xff1f; 4…

DLL文件的创建和调用

文章目录 前言一、DLL的优势二、使用步骤1.创建DLL文件2.调用DLL文件 总结 前言 动态数据库 (DLL) 是作为共享函数库的可执行文件。动态数据库提供了一种方法&#xff0c;使进程可以调用不属于其可执行代码的函数。本文将对DLL的创建和调用步骤进行保姆级讲解。 一、DLL的优势…

C# 调用 dll 文件

一、先使用C来创建一个 .dll 文件 1、创建新项目&#xff1a;CreateDll01 2、选择 “动态链接库(.dll)” 文件 3、在 CreateDll01.cpp 源文件中添加如下代码 // CreateDll01.cpp : 定义 DLL 应用程序的导出函数。 //#include "stdafx.h"extern "C" __decl…

dll是什么呢?dll丢失如何解决?

DLL的概念 DLL(Dynamic Link Library)文件为动态链接库文件&#xff0c;又称“应用程序拓展”&#xff0c;是软件文件类型。在Windows中&#xff0c;许多应用程序并不是一个完整的可执行文件&#xff0c;它们被分割成一些相对独立的动态链接库&#xff0c;即DLL文件&#xff0…

C++ 制作动态链接库.dll及.dll使用

声明&#xff1a;IDE是Visual studio -version 2022 其制作的动态链接库dll里面实现简单的加减法&#xff0c;提供给其他项目调用。 一、动态链接库&#xff08;DLL&#xff09;创建 1、创建DLL工程 流程&#xff1a;文件 -> 新建 -> 项目 -> 动态链接库&#xf…

.dll、.lib、.dll.a 的区别

我们已 ffmpeg 的动态链接库为例&#xff0c;描述一下这三个文件的作用&#xff1a; 目录整体结构&#xff1a; 分析 bin 目录&#xff1a; ffmpeg、ffplay、ffprobe 之所以这么小&#xff0c;是因为他们运行的时候会调用 .dll 文件当中的代码。dll&#xff1a;真正存放函数…

Java调用dll文件

目录 1 C创建dll 1.1 项目与工具 1.2 步骤与代码 2 Java使用JNA调用dll 2.1 项目与工具 2.2 步骤与代码 3 实际效果 4 参考链接 1 C创建dll 1.1 项目与工具 Visual Studio 2019 1.2 步骤与代码 ①使用VS创建动态链接库&#xff08;DLL&#xff09;项目 ②设置项目名与…