【Seata】05 - Seata Saga 模式简单整理、Docker 部署 Nacos 单机(基于 Jpom)相关配置

news2024/11/23 12:24:11

文章目录

    • 前言
    • 参考目录
    • Saga 模式知识点简单整理
      • 1、适用场景、优缺点
      • 2、Saga 模式的使用
      • 3、可能出现的问题以及解决方法
    • Docker 部署 Nacos 单机(基于 Jpom)
      • 步骤 1:拉取镜像
      • 步骤 2:构建容器
      • 步骤 3:Nacos 设置 Seata 配置文件
      • 步骤 4:修改 Seata Server 相关配置
      • 步骤5:修改 Seata Client 相关配置

前言

这篇文章的内容比较简单,没有像前几篇做 Demo 的流程分析,因为 Saga 实际应用比较少,下文只是简单整理一下,顺便补充一下基于 Jpom 安装的 Nacos 单机的相关配置。

参考目录

  • Seata 官方文档
  • Seata Saga 模式
  • 《阿里云云原生架构实践》
    书本章节 3.5 介绍了分布式事务模式的相关内容。

在官方文档中,对于 Saga 模式的使用作了比较详细的说明,从原理到使用方法,还有操作视频,文末还有常见问题以及回答,如果对 Saga 模式感兴趣的朋友可以自行查看。下文也会截取一些内容进行整理。

Saga 模式知识点简单整理

1、适用场景、优缺点

(截图自官方文档)
在这里插入图片描述

来简单比较一下 AT 模式、TCC 模式和 Saga 模式三种 弱一致性模型 的调用方式:

模式调用方式
AT 模式底层生成前后镜像,不需要编写任何回滚代码,由 Seata 完成
TCC 模式需要自定义提交以及回滚代码,由注解指定相关方法,Seata 进行调用
Saga 模式需要自定义提交以及回滚代码,并且在状态图(流程图)中指定相关方法

2、Saga 模式的使用

(截图自官方文档)
在这里插入图片描述
在这里插入图片描述

简单点来说,需要完成以下操作:

  1. 编写好相关业务逻辑,包括提交以及回滚的相关操作。
  2. 使用 Seata 提供的状态机设计器画好状态图(流程图),变成 json。
  3. 使用 Seata 引擎读取解析相关 json,执行相关业务。

状态机设计器传送门:

  • 代码传送门
  • 状态机设计器演示地址
  • 状态机设计器视频教程

3、可能出现的问题以及解决方法

Saga 模式和 TCC 模式比较相似,因此也存在着和 TCC 模式类似的问题:

  • 幂等性问题
  • 空回滚问题
  • 悬挂问题

而官方文档也对此进行了说明:

(截图自官方文档)在这里插入图片描述

隔离性问题以及性能优化问题:

(截图自官方文档)
在这里插入图片描述

Docker 部署 Nacos 单机(基于 Jpom)

在之前说明 Seata-Server 部署的博客里面就有用到 Jpom,但是没有讲到关于 Nacos 相关配置,这篇文章来补充说明一下。

步骤 1:拉取镜像

在这里插入图片描述

步骤 2:构建容器

在这里插入图片描述
上图一开始环境变量没有设置 ip 以及 mysql 相关配置。

如果没有指定 ip,则启动之后会变成内网 ip 导致无法注册。

参考:seata注册到nacos服务无法访问问题

在这里插入图片描述

Nacos 单机模式支持 MySQL,因此加入了 MySQL 相关配置:

在这里插入图片描述

相关配置sql(传送门):

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `src_user` text,
  `src_ip` varchar(20) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `encrypted_data_key` text NOT NULL COMMENT '秘钥',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE users (
	username varchar(50) NOT NULL PRIMARY KEY,
	password varchar(500) NOT NULL,
	enabled boolean NOT NULL
);

CREATE TABLE roles (
	username varchar(50) NOT NULL,
	role varchar(50) NOT NULL,
	constraint uk_username_role UNIQUE (username,role)
);

CREATE TABLE permissions (
    role varchar(50) NOT NULL,
    resource varchar(512) NOT NULL,
    action varchar(8) NOT NULL,
    constraint uk_role_permission UNIQUE (role,resource,action)
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

在这里插入图片描述

再补充一下完整的配置:

  • 容器名称:nacos-server
  • 端口:8848:8848,9848:9848
  • 挂载卷1:
    • 宿主:/usr/local/jpom/nacos/logs
    • 容器:/root/nacos/logs
  • 挂载卷2:
    • 宿主:/usr/local/jpom/nacos/conf
    • 容器:/root/nacos/conf

环境变量:

变量名变量值备注
MODEstandalone单机模式
JVM_XMS256m
JVM_XMX512m
TIME_ZONEAsia/Shanghai时区
NACOS_SERVER_IP192.168.2.158指定 ip,如果不指定启动时 ip 为内网 ip,无法注册
SPRING_DATASOURCE_PLATFORMmysql
MYSQL_SERVICE_HOST192.168.2.158
MYSQL_SERVICE_PORT3326
MYSQL_SERVICE_DB_NAMEnacos_config
MYSQL_SERVICE_USERroot
MYSQL_SERVICE_PASSWORDroot

在这里插入图片描述

在这里插入图片描述

访问 Nacos:(用户名:nacos,密码:nacos)

http://192.168.2.158:8848/

步骤 3:Nacos 设置 Seata 配置文件

在这里插入图片描述

service.vgroupMapping.my_test_tx_group=default

service.enableDegrade=false
service.disableGlobalTransaction=false

#Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=

#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=hikari
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://192.168.2.158:3326/seata?useUnicode=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

# redis 模式 store.mode=redis 开启 (控制台查询功能有限,不影响实际执行功能)
# store.redis.host=127.0.0.1
# store.redis.port=6379
# 最大连接数
# store.redis.maxConn=10
# 最小连接数
# store.redis.minConn=1
# store.redis.database=0
# store.redis.password=
# store.redis.queryLimit=100

#Transaction rule configuration, only for the server
server.recovery.committingRetryPeriod=60000
server.recovery.asynCommittingRetryPeriod=60000
server.recovery.rollbackingRetryPeriod=60000
server.recovery.timeoutRetryPeriod=60000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=100000
server.xaerNotaRetryTimeout=600000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false

#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=60000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=600000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k

#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h

#Log rule configuration, for client and server
log.exceptionRate=100

#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=300000
transport.rpcTmRequestTimeout=300000
transport.rpcTcRequestTimeout=300000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none

步骤 4:修改 Seata Server 相关配置

在这里插入图片描述

步骤5:修改 Seata Client 相关配置

如果使用的是 XA 模式 Demo,修改以下内容:

配置文件:

seata.registry.type=nacos
seata.registry.nacos.application=seata-server
seata.registry.nacos.server-addr=192.168.2.158:8848
seata.registry.nacos.group=SEATA_GROUP

seata.data-source-proxy-mode=XA

pom 文件:

在这里插入图片描述

把数据源配置注释掉(前面在配置文件里面指定了):

在这里插入图片描述

(完)

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

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

相关文章

安装Python第三方库

视频版教程 Python3零基础7天入门实战视频教程 在Python的标准安装中,包含了一组自带的模块,这些模块被成为“标准库”。比如常用的math,random,datetime,os,json等等。 此外,还有很多的第三方模块,或者叫做库也行,叫…

TienChin 渠道管理-配置校验失败信息

新建 ValidationMessages.properties: channel.name.notnull渠道名称不能为空 channel.type.notnull渠道类型不能为空 channel.status.notnull渠道状态不能为空 channel.type.invalid渠道类型无效 channel.status.invalid渠道状态无效

linux上安装redis

这篇文章简单地介绍一下怎么在linux虚拟机上完成redis的安装。 首先,访问Redis官网,点击首页的【Get Started】,然后点击Install Redis on Linux 然后按照页面内容提示,在Ubuntu上安装redis 只需要在终端依次输入以下命令&#xf…

面试官:Vue实例挂载的过程中发生了什么?

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、思考 一、分析 三、结论 一、思考 我们都听过知其然知其所以然这句话 那么不知道大家是否思考过new Vue()这…

权限提升WIN篇(腾讯云,CS,MSF)

溢出漏洞 信息收集 操作系统版本ver,systeminfo漏洞补丁信息systeminfo操作系统位数systeminfo杀软防护tasklist /svc网络netstat -ano,ipconfig当前权限whoami 筛选EXP 根据前面的信息收集中的系统版本,位数和补丁情况筛选出合适的EXP 提权 根据EX…

JVM——4.垃圾回收

这篇文章我没来讲一下JVM中的垃圾回收。这是比较重要,内容也比较多的一篇文章。 目录 1.垃圾回收概述 2.如何判断对象可以回收 2.1引用计数法 2.2可达性分析算法 2.2.1GCRoot的选取 2.3再谈引用 2.3.1强引用 2.3.2软引用 2.3.3弱引用 2.3.4虚引用 2.3.5…

2023关于赴日IT培训你需要了解的

有人还是好奇日本IT行业真的那么缺人吗?我告诉你:缺!和中美完全不同的是,日本的IT行业面临着非常严重的程序员缺口。根据日本经济产业省进行的“关于IT人才供需的调查”,预计到2030年,日本IT行业将会有45万…

进程的就绪、执行、阻塞和挂起

假设我们有一个进程, 它需要的资源有CPU, 资源A(在进程创建时为其分配), 资源B(进程运行时才发现需要资源B), 现在用这个进程来分析一下进程的几种状态. 先看图: 图1: 进程的几种状态 1. 创建 --> 就绪(资源A): 操作系统为进程分配资源A, 进程进入就绪态, 等待CPU. 进程当…

ICS TRIPLEX T8310 自动化控制模块

ICS TRIPLEX T8310 是一种自动化控制模块,通常用于工业控制和自动化系统中,以实现对各种过程和设备的自动控制。以下是可能包括在 ICS TRIPLEX T8310 自动化控制模块中的一些常见产品功能: PLC(可编程逻辑控制器)功能&…

树结构构建,字典树快速生成。

表结构 查出list后&#xff0c;用工具类转换。工具类代码如下&#xff1a; 下面展示一些 内联代码片。 public static List<JSONObject> toTreeList(List tList, String oidkey, Stripspidkey) List<JSONObject> jsonObjectList JSONArray. parseArray (JSON.…

公司电脑监控软件哪个好?(常用公司电脑监控软件有哪些?)

随着科技的发展&#xff0c;公司对员工电脑的监控已经成为了企业管理的重要手段。然而&#xff0c;如何选择合适的公司电脑监控软件&#xff0c;以及如何避免员工发现&#xff0c;成为了企业管理者需要面对的问题。 一、公司电脑监控软件哪个好&#xff1f; 针对公司电脑监控软…

Hive工作原理

Hive 工作原理详解-阿里云开发者社区 Hive的服务端组件 1. Driver组件&#xff1a;该组件包括&#xff1a;Compiler、Optimizer、Executor,它可以将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应…

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存

《数字图像处理-OpenCV/Python》连载&#xff08;7&#xff09;视频文件的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…

记录一下 ThinkPHP 使用JWT进行身份验证

ThinkPHP使用JWT身份验证 1.composer安装jwt&#xff0c;安装命令&#xff1a;composer require firebase/php-jwt 安装成功后会在vendor目录下生成firebase目录文件 第二步&#xff1a;生成token 先引入jwt use Firebase\JWT\JWT; public function getToken($user){//使…

安达发|APS软件多工厂架构引领生产管理新革命

APS多工厂架构是一种生产管理系统&#xff0c;它通过将多个工厂的生产过程进行整合和优化&#xff0c;实现了生产效率的提高和成本的降低。在APS多工厂架构中&#xff0c;每个工厂都有自己的生产线和生产计划&#xff0c;但是它们之间可以进行协调和协作&#xff0c;以确保整个…

深度学习归一化原理及代码实现(BatchNorm2d,LayerNorm,InstanceNorm,GroupNorm)

文章目录 概述形式原理理解源代码实现1.BatchNorm2d2.LayerNorm3.InstanceNorm4.GroupNorm 概述 本文记录总结pytorch中四种归一化方式的原理以及实现方式。方便后续理解和使用。 本文原理理解参考自 https://zhuanlan.zhihu.com/p/395855181 形式 四种归一化的公式都是相同的…

油猴Safari浏览器辅助插件:Tampermonkey for Mac中文版

油猴脚本Tampermonkey是一款油猴Safari浏览器辅助插件&#xff0c;是一款适用于Safari用户的脚本管理&#xff0c;能够方便管理不同的脚本。虽然有些受支持的浏览器拥有原生的用户脚本支持&#xff0c;但tampermonkey油猴插件将在您的用户脚本管理方面提供更多的便利&#xff0…

使用Python进行时间序列分析的8种图

时间序列数据 时间序列数据是按时间顺序以固定的时间间隔排列的观测值的集合。每个观察对应于特定的时间点&#xff0c;并且数据可以以各种频率&#xff08;例如&#xff0c;每日、每月、每年&#xff09;。这种类型的数据在许多领域都非常重要&#xff0c;包括金融&#xff0…

linux+c语言杂记(二)

一、在 Ubuntu 20.04 上安装 GCC 默认的 Ubuntu 软件源包含了一个软件包组&#xff0c;名称为 “build-essential”,它包含了 GNU 编辑器集合&#xff0c;GNU 调试器&#xff0c;和其他编译软件所必需的开发库和工具。 想要安装开发工具软件包&#xff0c;以 拥有 sudo 权限用…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

&#x1f3ad;Playwright让网页对话框&#x1f310;&#x1f4ac;处理变得更加快捷&#xff01;网页对话框是在网页上出现的常见弹窗&#xff0c;包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择&#xff0c;但是在自动化测试中处理它们可能会很棘…