万网个人网站建设教程做好档案整理及网站建设
万网个人网站建设教程,做好档案整理及网站建设,酒店 网站构建,海东高端网站建设文章目录 分布式服务理论基础前言微服务和分布式的区别CAP定理BASE理论 Seata流程#xff1a;seata部署微服务集成seata 分布式服务理论基础
前言
单体架构#xff1a;
1.项目过于臃肿#xff0c;所有服务在一起#xff0c;一个业务挂了#xff0c;整个项目就不能用了seata部署微服务集成seata 分布式服务理论基础
前言
单体架构
1.项目过于臃肿所有服务在一起一个业务挂了整个项目就不能用了
2.资源不能隔离所有业务用一个资源共享一个数据库如果说一个业务突然增大——导致数据库宕机了那么其他业务就会受到影响
3.扩展不灵活如果我们要对一个服务进行扩展会将整个系统水平扩展
4.所有功能得一起上线一起部署
分布式
1.数据一致性我们先说有个最明显的案例之前我们的单体架构中数据库是多个服务共享的所以事务是ACID的但是分布式中每个微服务都有自己独立的数据库你一个业务串了多个服务那么分布式下的微服务链路原子性就不能保证了——比如下面
例子创建订单扣减用户余额扣减库存涉及三个服务在订单业务中远程调用两个服务我们创建一个订单假设库存为10我们下单11个按道理来说我们是想库存服务和订单服务还有账户服务是会回滚的因为下单超过库存数但是实际上只有库存服务会回滚自己的数据库其余的账户服务和订单服务都会成功
原因每个服务都是独立的有自己的数据库所以事务也是独立的
**2.需要考虑网络问题**因为服务的调用十分依赖网络尤其是节点非常多链路非常长的情况下
**3.异步**引入了各种中间件GateWaymqnacosseata等等异步通信增加了功能实现的复杂度
**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.modedb
store.db.datasourcedruid
store.db.dbTypemysql
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetruerewriteBatchedStatementstrue
store.db.userroot
store.db.password123456
store.db.minConn5
store.db.maxConn30
store.db.globalTableglobal_table
store.db.branchTablebranch_table
store.db.queryLimit100
store.db.lockTablelock_table
store.db.maxWait5000
# 事务、日志等配置
server.recovery.committingRetryPeriod1000
server.recovery.asynCommittingRetryPeriod1000
server.recovery.rollbackingRetryPeriod1000
server.recovery.timeoutRetryPeriod1000
server.maxCommitRetryTimeout-1
server.maxRollbackRetryTimeout-1
server.rollbackRetryTimeoutUnlockEnablefalse
server.undo.logSaveDays7
server.undo.logDeletePeriod86400000# 客户端与服务端传输方式
transport.serializationseata
transport.compressornone
# 关闭metrics功能提高性能
metrics.enabledfalse
metrics.registryTypecompact
metrics.exporterListprometheus
metrics.exporterPrometheusPort9898以上我们数据存储的数据库为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部署成功
目的完成分布式事务管理形成TMRM代理我们的分布式事务
微服务集成seata dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdexclusions!--版本较低1.3.0因此排除--exclusionartifactIdseata-spring-boot-starter/artifactIdgroupIdio.seata/groupId/exclusion/exclusions
/dependency
!--seata starter 采用1.4.2版本--
dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion${seata.version}/version
/dependencyseata-tc-server服务的确定需要再nacos注册中心中进行寻找服务地址namespace默认值分组groupapplication事务组集群
**事务组**相当于管理分布式系统中里面的微服务订单库存…这些服务把他们进行管理这些管理的大组为事务组我们可以根据这个获取TC节点
seata:registry:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: group: DEFAULT_GROUPapplication: seata-tc-serverusername: nacospassword: nacos#事务组名称tx-service-group: seata-demoservice:#配置映射关系vgroup-mapping:seata-demo: SH
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88267.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!