微服务12-分布式服务理论基础+Seata的认识

news2024/10/5 10:39:47

文章目录

  • 分布式服务理论基础
    • 前言
    • 微服务和分布式的区别
    • CAP定理
    • BASE理论
  • Seata
    • 流程:
    • seata部署
    • 微服务集成seata

分布式服务理论基础

前言

单体架构

1.项目过于臃肿,所有服务在一起,一个业务挂了,整个项目就不能用了;

2.资源不能隔离,所有业务用一个资源,共享一个数据库,如果说一个业务突然增大——>导致数据库宕机了,那么其他业务就会受到影响;

3.扩展不灵活,如果我们要对一个服务进行扩展,会将整个系统水平扩展;

4.所有功能得一起上线,一起部署;

分布式:

1.数据一致性:我们先说有个最明显的案例:之前我们的单体架构中,数据库是多个服务共享的,所以事务是ACID的,但是分布式中,每个微服务都有自己独立的数据库,你一个业务串了多个服务,那么分布式下的微服务链路原子性就不能保证了——>比如下面:

例子:创建订单,扣减用户余额,扣减库存(涉及三个服务),在订单业务中远程调用两个服务,我们创建一个订单,假设库存为10,我们下单11个,按道理来说我们是想库存服务和订单服务还有账户服务是会回滚的,因为下单超过库存数,但是实际上只有库存服务会回滚自己的数据库,其余的账户服务和订单服务都会成功;

原因:每个服务都是独立的,有自己的数据库,所以事务也是独立的;

**2.需要考虑网络问题,**因为服务的调用十分依赖网络,尤其是节点非常多,链路非常长的情况下

**3.异步:**引入了各种中间件,GateWay,mq,nacos,seata等等,异步通信增加了功能实现的复杂度;

**4.运维成本:**一个系统被拆成多个服务,每个服务都得配置,部署;

总得来说,就是将原本一个系统分成多个互相调用通信的服务;

在这里插入图片描述
在这里插入图片描述

微服务和分布式的区别

所以:
~ 分布式 的意思是多个模块共同完成一件事情(也可以是一个模块分多个部署),每个节点可以单独完成任务;(分开不同机器部署)
~ 微服务的意思也是多个模块共同完成一件事情,(不管应用部署在哪里)

总结:

微服务和分布式都是拆分单体应用的产物,可以理解为,微服务只是对服务拆分的形容词,分布式是对服务部署方面的考量,微服务是可以包含分布式的,但是分布式不一定是微服务;

CAP定理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
分区:因为网络故障导致分布式中部分节点与其他节点失去连接,从而形成独立分区——>一定会有的;

在这里插入图片描述
解决:
让node03节点等待网络的恢复,在恢复之前不允许访问;——>满足了一致性,不满足可用性

因为分布式系统中,我们的服务节点一定是通过网络连接的,那么就一定会出现分区问题,毕竟你网络是不能保证百分百良好的

在这里插入图片描述

思考:

因为es集群,当有一个节点宕机时,过了一定时间它会被剔除,那么我们就访问不到它了,牺牲了可用性,但是节点上的数据会被分到其他节点上,从而保证了一致性,所以是CP

这里回顾一下es集群:

elasticsearch搭建集群-CSDN博客

突然想到了EureKa和Nacos中的区别里面也涉及AP、CP

区别:

Nacos支持服务端主动检测服务提供者状态:临时实例采用心跳模式,非临时实例采用服务器主动访问模式;

临时实例心跳不正常会被踢出,非临时实例则不会被剔除;

Nacos支持服务列表消息推送模式,即时更新;

补充 nacos、EureKa涉及ap、cp模式

CP和AP是什么?有什么区别?-CSDN博客

BASE理论

牛逼之处:部分的损失可用(A),临时的不一致——>最终的一致性(C),权衡
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Seata

目的:解决分布式系统的事务问题

流程:

1.首先TC是维护协调整个全局的事务的,帮助事务进行提交和回滚,相当于分布式事务一个总的大杂烩
——>2.而作为分布式系统,是有个入口的,因为我们的微服务之间的调用,每调用一个服务就是一个事务出现,也就是说我们这个入口管理了整个服务调用的一个范围,所以说TM事务管理器就相当于全局事务的入口,定义了事务范围,然后开启全局事务
——>3.TC,它会判断我们的全局服务是否进行提交与回滚
——>4.但是在此之前,因为全局事务里面有分支事务,分支事务提交就与RM有关,管理分支事务处理,向TC进行注册事务,并且执行对应的sql,然后报告状态给TC(但是RM此时是没有回滚和提交效果的,说白了也就是执行了服务而已,但是并没有提交)
——>5.TC会进行验证服务状态来判断最后是提交还是回滚,由TM处理;

总结:TM和RM是和业务有关的,对服务进行管理,而TC是独立出来的,维护分支服务状态的
在这里插入图片描述

seata部署

在这里插入图片描述
在这里插入图片描述

新建配置中+配置内容:

# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
 
# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

以上我们数据存储的数据库为seata,我们还需要定义一个全局事务表和一个分支事务表

 
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
 
-- ----------------------------
-- 分支事务表
-- ----------------------------
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table`  (
  `branch_id` BIGINT(20) NOT NULL,
  `xid` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` BIGINT(20) NULL DEFAULT NULL,
  `resource_group_id` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `resource_id` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `branch_type` VARCHAR(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `status` TINYINT(4) NULL DEFAULT NULL,
  `client_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `application_data` VARCHAR(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` DATETIME NULL DEFAULT NULL,
  `gmt_modified` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`branch_id`) USING BTREE,
  INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
 
-- ----------------------------
-- 全局事务表
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (
  `xid` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `transaction_id` BIGINT(20) NULL DEFAULT NULL,
  `status` TINYINT(4) NOT NULL,
  `application_id` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_service_group` VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_name` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `timeout` INT(11) NULL DEFAULT NULL,
  `begin_time` BIGINT(20) NULL DEFAULT NULL,
  `application_data` VARCHAR(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` DATETIME NULL DEFAULT NULL,
  `gmt_modified` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`xid`) USING BTREE,
  INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
  INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
 
SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述
在这里插入图片描述

seata部署成功

目的:完成分布式事务管理,形成TM,RM,代理我们的分布式事务;

微服务集成seata

在这里插入图片描述

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <exclusions>
        <!--版本较低,1.3.0,因此排除-->
        <exclusion>
            <artifactId>seata-spring-boot-starter</artifactId>
            <groupId>io.seata</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!--seata starter 采用1.4.2版本-->
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>${seata.version}</version>
</dependency>

seata-tc-server服务的确定需要再nacos注册中心中进行寻找:服务地址+namespace默认值+分组group+application+事务组+集群

**事务组:**相当于管理分布式系统中里面的微服务(订单,库存…),这些服务把他们进行管理,这些管理的大组为事务组,我们可以根据这个获取TC节点
在这里插入图片描述
在这里插入图片描述

seata:
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: ""
      group: DEFAULT_GROUP
      application: seata-tc-server
      username: nacos
      password: nacos
      #事务组名称
  tx-service-group: seata-demo
  service:
    #配置映射关系
    vgroup-mapping:
      seata-demo: SH

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win redis 配置自启动服务

配置自启动 redis-server --service-install redis.windows-service.conf --loglevel verbose redis.windows-service.conf 配置 Logs 文件夹

nodejs+vue电子病历管理系统

过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将电子病历管理系统功能模块主要分为管理员模块。管理员添加科室信息管理、项目分类管理、药品分类管理、公告信息管理、用户管理等操作。 本系统结合计算机系统的结构、概念、模型、原理、方法&…

Go语言介绍与安装

介绍与安装 本教程介绍了 Go&#xff0c;并讨论了选择 Go 相对于其他编程语言的优势。我们还将学习如何在Windows 中安装 Go。 介绍 Go也称为Golang&#xff0c;是由 Google 开发的一种开源、编译型、静态类型的编程语言。 Go创造背后的关键人物是Rob Pike、 Ken Thompson和…

Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布

作者&#xff1a;蔡建怿 关于Apache Dubbo3 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架&#xff0c;同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。经过近几年发展&#xff0c;Dubbo3 已在阿里巴巴集团各条业务线实现全面…

【Arduino+ESP32+腾讯云+sg90】强制门户+腾讯云控制开关灯

作者有话说 博主对于Arduino开发并没有基础&#xff0c;但是为了实现更加方便的配网&#xff0c;这几天一直在尝试用ESP32-12F&#xff08;因为手头刚好有一个&#xff0c;其他的也可以&#xff09;来做远程开关灯&#xff01;不知道大家是否注意到&#xff0c;上一篇利用STM32…

【Vivado HLS Bug】Ubuntu环境下Vivado HLS导出IP报错:HLS ERROR: [IMPL 213-28]

Export IP Invalid Argument / Revision Number Overflow Issue (Y2K22) (xilinx.com)一.问题描述&#xff1a; 在Ubuntu20.04环境中使用Vivado HLS导出IP时报错&#xff1a;HLS ERROR: [IMPL 213-28] 二.解决方法&#xff1a; 1.从如下链接中下载官方补丁Export IP Invalid…

Go函数介绍与一等公民

Go函数介绍与一等公民 函数对应的英文单词是 Function&#xff0c;Function 这个单词原本是功能、职责的意思。编程语言使用 Function 这个单词&#xff0c;表示将一个大问题分解后而形成的、若干具有特定功能或职责的小任务&#xff0c;可以说十分贴切。函数代表的小任务可以…

Stable Diffusion 动画SD-Animatediff V2

AI不仅可以生成令人惊叹的图片,还能给这些图片注入生命,让它们动起来。 这就是AnimateDiff要做的事情,一个神奇的工具,能将静态的AI生成图像转换成动画。 本次介绍基于SD如何实现这个神奇的方法。 文章目录 插件安装使用方法参数调整文生动图/视频Controlnet方法SD API方…

ARMv5架构对齐访问异常问题

strh非对齐访问 在ARMv5架构中&#xff0c;对于strh指令&#xff08;Store Halfword&#xff09;&#xff0c;通常是要求对地址进行对齐访问的。ARMv5架构对于半字&#xff08;Halfword&#xff09;的存储操作有对齐要求&#xff0c;即地址必须是2的倍数。 如果尝试使用strh指…

【广州华锐互动】塔吊多人安拆VR互动培训系统

塔吊多人安拆VR互动培训系统由广州华锐互动制作&#xff0c;是一种基于VR技术的模拟实训系统&#xff0c;专门用于培训塔吊驾驶员和操作员。 在现实生活中&#xff0c;塔吊操作具有一定的危险性&#xff0c;尤其是在培训过程中容易发生意外。而使用VR互动实训系统&#xff0c;学…

OCP Java17 SE Developers 复习题05

答案 答案 A, E. Instance and static variables can be marked final, making option A correct. Effectively final means a local variable is not marked final but whose value does not change after it is set, making option B incorrect. Option C is incorrect, a…

JAVA基础(JAVA SE)学习笔记(一)JAVA学习路线、行业了解、开发环境JDK17安装配置

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 2. 一步一个脚印&#xff0c;踏踏实实再学一遍&#xff01; 这个世界上有的人输在不能开始&#xff0c;有的人…

IDEA spring-boot项目启动,无法加载或找到启动类问题解决

问题描述&#xff1a;找不到或无法加载主类 xxx.xxx.xxx.Classname 解决方案&#xff1a; 1.检查启动设置&#xff1a; 启动类所在包运行环境&#xff08;一般选择默认即可&#xff09;设置完成即可进行运行测试 2.如果第一步没有解决问题&#xff0c;试着第二步&#xff1a…

数据分析基础:数据可视化+数据分析报告

数据分析是指通过对大量数据进行收集、整理、处理和分析&#xff0c;以发现其中的模式、趋势和关联&#xff0c;并从中提取有价值的信息和知识。 数据可视化和数据分析报告是数据分析过程中非常重要的两个环节&#xff0c;它们帮助将数据转化为易于理解和传达的形式&#xff0…

VSCode怎么创建Java项目

首先安装好Java的开发环境&#xff1a;JDK在VSCode中安装适用于Java开发的插件。打开VSCode&#xff0c;点击左侧的扩展图标&#xff0c;搜索并安装Java Extension Pack插件。等待安装完成后&#xff0c;重启VSCode生效。创建一个新的Java项目&#xff0c;按下Ctrl Shift P&a…

[小林coding]4.2TCP重传,滑动窗口,流量控制,拥塞控制_1013

1.重传 1.1 超时重传 两个情况&#xff1a; a 数据包丢失 b ack应答丢失 RTT&#xff1a;网络包往返的时间&#xff08;不是一个定值&#xff09; RTO&#xff1a;超时重传的时间间隔&#xff08;也是一个动态的&#xff09; RTO设置的时间长&#xff1a;浪费时间资源&…

Open Winding-PMSM-开绕组永磁同步电机基本介绍

文章目录 前言简介Open Widing电机数学模型零序模型 双逆变器调制零序电流抑制基本思路 前言 最近看了些Open Winding永磁同步电机及其控制策略的文献资料&#xff0c;现做个总结。未来的研究方向也大概率围绕Open Winding开展&#xff0c;期待同行交流学习。 简介 开绕组(O…

【通义千问】大模型Qwen GitHub开源工程学习笔记(4)-- 模型的量化与离线部署

摘要: 量化方案基于AutoGPTQ,提供了Int4量化模型,其中包括Qwen-7B-Chat和Qwen-14B-Chat。更新承诺在模型评估效果几乎没有损失的情况下,降低存储要求并提高推理速度。量化是指将模型权重和激活的精度降低以节省存储空间并提高推理速度的过程。AutoGPTQ是一种专有量化工具。…

prosemirror error - Applying a mismatched transaction

bug描述 使用 prosemirror 时&#xff0c;dispatch transcation 报错&#xff1a; 代码如下&#xff08;简化版&#xff09;&#xff1a; import { inject } from "vue"; const editorView inject("editorView");function handleClick() {const view …

2核4G游戏服务器推荐(阿里云/腾讯云/华为云)

2核4G游戏服务器推荐&#xff0c;首选腾讯云2核4G5M带宽轻量应用服务器218元一年、阿里云2核4G4M带宽轻量应用服务器297元一年&#xff0c;华为云2核2G3M云耀L服务器95元一年&#xff0c;阿腾云来详细说下2核4G游戏服务器推荐配置大全&#xff1a; 目录 2核4G游戏服务器推荐 …