探索 Seata 分布式事务

Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的一款分布式事务解决方案,旨在帮助开发者解决微服务架构下的分布式事务问题。它提供了高效且易于使用的分布式事务管理能力,支持多种事务模式,确保数据的一致性和完整性。

以下是 Seata 的一些关键特性和功能:

  1. 全局事务管理:Seata 提供了一个全局事务协调器(Transaction Coordinator, TC),负责管理全局事务的生命周期,包括开始、提交、回滚等操作。

  2. AT 模式(Automatic Transaction):这是 Seata 最常用的事务模式,通过代理数据库操作,实现自动的分支事务管理。AT 模式下,Seata 会在业务操作前后自动生成快照,并在事务提交或回滚时进行相应的处理。

  3. TCC 模式(Try-Confirm-Cancel):这种模式需要开发者手动实现 Try、Confirm 和 Cancel 三个阶段的逻辑。Try 阶段预留资源,Confirm 阶段确认操作,Cancel 阶段则回滚操作。这种模式适用于需要精细控制事务逻辑的场景。

  4. SAGA 模式:基于补偿机制的长事务解决方案,适用于跨多个服务的复杂业务流程。每个步骤都有对应的补偿操作,当某一步失败时,可以通过执行补偿操作来回滚整个事务。

  5. XA 模式:基于两阶段提交协议的分布式事务解决方案,适用于支持 XA 协议的数据库。第一阶段准备事务,第二阶段提交或回滚事务。

  6. 高性能:Seata 通过优化网络通信和存储机制,提供了高性能的事务处理能力,能够满足大规模分布式系统的需求。

  7. 易于集成:Seata 支持与 Spring Cloud、Dubbo、gRPC 等主流微服务框架的无缝集成,开发者只需进行简单配置即可使用分布式事务功能。

  8. 可扩展性:Seata 提供了丰富的 SPI 接口,允许开发者根据具体需求进行扩展和定制,例如自定义事务日志存储、事务协调策略等。

  9. 社区活跃:作为一个开源项目,Seata 拥有活跃的社区和丰富的文档资源,开发者可以方便地获取支持和帮助。

通过 Seata,开发者可以轻松地在分布式系统中实现一致性事务管理,确保数据的一致性和完整性,从而提高系统的可靠性和稳定性。

参考 官方文档

下载 Seata

官方下载地址

 我使用的是 1.4.1 版本:

进入conf目录,调整下面的配置文件

registry.conf

设置使用 Nacos 注册中心:

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa# type = "file"type = "nacos"loadBalance = "RandomLoadBalance"loadBalanceVirtualNodes = 10nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = "public"cluster = "default"username = "nacos"password = "nacos"}
}config {# file、nacos 、apollo、zk、consul、etcd3# type = "file"type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = "public"group = "SEATA_GROUP"username = "nacos"password = "nacos"}}

file.conf

使用 MySQL 8.X JDBC 驱动、数据库账号、密码:

## transaction log store, only used in seata-server
store {## store mode: file、db、redismode = "db"## file store propertyfile {## store location dirdir = "sessionStore"# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptionsmaxBranchSessionSize = 16384# globe session size , if exceeded throws exceptionsmaxGlobalSessionSize = 512# file buffer size , if exceeded allocate new bufferfileWriteBufferCacheSize = 16384# when recover batch read sizesessionReloadReadSize = 100# async, syncflushDiskMode = async}## database store propertydb {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.cj.jdbc.Driver"url = "jdbc:mysql://127.0.0.1:3306/seata?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true"user = "root"password = "root"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}## redis store propertyredis {host = "127.0.0.1"port = "6379"password = ""database = "0"minConn = 1maxConn = 10maxTotal = 100queryLimit = 100}}

seata-1.4.1 配置

克隆 1.4.1 分支

git clone -b 1.4.1 https://gitee.com/ma-jiansheng/seata

微服务 yml 配置

seata:enabled: trueapplication-id: admin-servertx-service-group: admin-server-groupenable-auto-data-source-proxy: trueconfig:type: nacosnacos:namespace: publicserver-addr: 127.0.0.1:8848group: SEATA_GROUPuserName: "nacos"password: "nacos"registry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848namespace: publicuserName: "nacos"password: "nacos"

修改 script/config-center 下 config.txt 文件

修改 service.vgroupMapping 和数据库地址:

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
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
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
service.vgroupMapping.admin-server-group=default
service.vgroupMapping.discussion-server-group=default
service.vgroupMapping.enterprise-server-group=default
service.vgroupMapping.job-server-group=default
service.vgroupMapping.student-server-group=default
store.mode=db
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql:///dgut?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=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.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
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=null
store.redis.queryLimit=100
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
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
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

 注意:

service.vgroupMapping.admin-server-group=default
service.vgroupMapping.discussion-server-group=default
service.vgroupMapping.enterprise-server-group=default
service.vgroupMapping.job-server-group=default
service.vgroupMapping.student-server-group=default

ABC-server-group 与项目模块中 yml 配置的 seata.tx-service-group 内容相同。

启动 nacos-config.sh ,将配置注入到 nacos 中

sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -u nacos -w nacos

 在 nocos 中心可以看到新增的配置:

 启动 Seata 服务

seata-server.bat -p 9000 -m file-p 指定启动seata server的端口号。
-h 指定seata server所绑定的主机。
-m 事务日志、事务执行信息存储的方式,目前支持file(文件方式)、db(数据库方式,建表语句请查看config/db_store.sql、config/db_undo_log.sql)

报错:

原因:路径问题,需手动指定 logs 路径 

修改启动脚本:

@REM ----------------------------------------------------------------------------
@REM  Copyright 2001-2006 The Apache Software Foundation.
@REM
@REM  Licensed under the Apache License, Version 2.0 (the "License");
@REM  you may not use this file except in compliance with the License.
@REM  You may obtain a copy of the License at
@REM
@REM       http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM  Unless required by applicable law or agreed to in writing, software
@REM  distributed under the License is distributed on an "AS IS" BASIS,
@REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@REM  See the License for the specific language governing permissions and
@REM  limitations under the License.
@REM ----------------------------------------------------------------------------
@REM
@REM   Copyright (c) 2001-2006 The Apache Software Foundation.  All rights
@REM   reserved.@echo offset ERROR_CODE=0:init
@REM Decide how to startup depending on the version of windows@REM -- Win98ME
if NOT "%OS%"=="Windows_NT" goto Win9xArg@REM set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" @setlocal@REM -- 4NT shell
if "%eval[2+2]" == "4" goto 4NTArgs@REM -- Regular WinNT shell
set CMD_LINE_ARGS=%*
goto WinNTGetScriptDir@REM The 4NT Shell from jp software
:4NTArgs
set CMD_LINE_ARGS=%$
goto WinNTGetScriptDir:Win9xArg
@REM Slurp the command line arguments.  This loop allows for an unlimited number
@REM of arguments (up to the command line limit, anyway).
set CMD_LINE_ARGS=
:Win9xApp
if %1a==a goto Win9xGetScriptDir
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto Win9xApp:Win9xGetScriptDir
set SAVEDIR=%CD%
%0\
cd %0\..\.. 
set BASEDIR=%CD%
cd %SAVEDIR%
set SAVE_DIR=
goto repoSetup:WinNTGetScriptDir
set BASEDIR=%~dp0\..:repoSetup
set REPO=if "%JAVACMD%"=="" set JAVACMD=javaif "%REPO%"=="" set REPO=%BASEDIR%\libset CLASSPATH="%BASEDIR%"\conf;"%REPO%"\*set ENDORSED_DIR=
if NOT "%ENDORSED_DIR%" == "" set CLASSPATH="%BASEDIR%"\%ENDORSED_DIR%\*;%CLASSPATH%if NOT "%CLASSPATH_PREFIX%" == "" set CLASSPATH=%CLASSPATH_PREFIX%;%CLASSPATH%@REM Reaching here means variables are defined and arguments have been captured
:endInit%JAVACMD% %JAVA_OPTS% -server -Xmx512m -Xms512m -Xmn512m -Xss512k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\ideaFiles\seata-server-1.4.1\seata\bin\logs\java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:D:\ideaFiles\seata-server-1.4.1\seata\bin\logs\seata_gc.log -verbose:gc -Dio.netty.leakDetectionLevel=advanced -Dlogback.color.disable-for-bat=true -classpath %CLASSPATH% -Dapp.name="seata-server" -Dapp.repo="%REPO%" -Dapp.home="%BASEDIR%" -Dbasedir="%BASEDIR%" io.seata.server.Server %CMD_LINE_ARGS%
if %ERRORLEVEL% NEQ 0 goto error
goto end:error
if "%OS%"=="Windows_NT" @endlocal
set ERROR_CODE=%ERRORLEVEL%:end
@REM set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" goto endNT@REM For old DOS remove the set variables from ENV - we assume they were not set
@REM before we started - at least we don't leave any baggage around
set CMD_LINE_ARGS=
goto postExec:endNT
@REM If error code is set to 1 then the endlocal was done already in :error.
if %ERROR_CODE% EQU 0 @endlocal:postExecif "%FORCE_EXIT_ON_ERROR%" == "on" (if %ERROR_CODE% NEQ 0 exit %ERROR_CODE%
)exit /B %ERROR_CODE%

再次启动:成功

nacos 注册中心可以查看到 Seata 服务已启动:

使用 Seata 实现事务控制

创建数据库seata

建立下面三张表(branch_table, global_table, lock_table):

-- the table to store GlobalSession data
drop table if exists `global_table`;
create table `global_table` (`xid` varchar(128)  not null,`transaction_id` bigint,`status` tinyint not null,`application_id` varchar(32),`transaction_service_group` varchar(32),`transaction_name` varchar(128),`timeout` int,`begin_time` bigint,`application_data` varchar(2000),`gmt_create` datetime,`gmt_modified` datetime,primary key (`xid`),key `idx_gmt_modified_status` (`gmt_modified`, `status`),key `idx_transaction_id` (`transaction_id`)
);-- the table to store BranchSession data
drop table if exists `branch_table`;
create table `branch_table` (`branch_id` bigint not null,`xid` varchar(128) not null,`transaction_id` bigint ,`resource_group_id` varchar(32),`resource_id` varchar(256) ,`lock_key` varchar(128) ,`branch_type` varchar(8) ,`status` tinyint,`client_id` varchar(64),`application_data` varchar(2000),`gmt_create` datetime,`gmt_modified` datetime,primary key (`branch_id`),key `idx_xid` (`xid`)
);-- the table to store lock data
drop table if exists `lock_table`;
create table `lock_table` (`row_key` varchar(128) not null,`xid` varchar(96),`transaction_id` long ,`branch_id` long,`resource_id` varchar(256) ,`table_name` varchar(32) ,`pk` varchar(36) ,`gmt_create` datetime ,`gmt_modified` datetime,primary key(`row_key`)
);

在 dgut 数据库中加入一张 undo_log 表

这是 Seata 记录事务日志要用到的表:

CREATE TABLE `undo_log`
(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`branch_id` BIGINT(20) NOT NULL,
`xid` VARCHAR(100) NOT NULL,
`context` VARCHAR(128) NOT NULL,
`rollback_info` LONGBLOB NOT NULL,
`log_status` INT(11) NOT NULL,
`log_created` DATETIME NOT NULL,
`log_modified` DATETIME NOT NULL,
`ext` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = INNODB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8;

添加配置

在需要进行分布式控制的微服务中进行下面几项配置:

pom依赖

<dependency><groupId>com.alibaba.cloud</groupId><!-- 里面已经集成服务间调用X-id的传递,包括FeignClient的重写,如果在之前自定义封装过Feign,注意启动冲突--><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><!--去除低版本--><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions>
</dependency>
<!-- 添加 seata starter ,与服务端保持一致-->
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.1</version>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

添加配置类 DataSourceProxyConfig

package com.yushanma.config;import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class DataSourceProxyConfig {
@Bean@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();}
@Primary@Beanpublic DataSourceProxy dataSource(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);}
}

yml 配置加入 Seata

seata:
enabled: trueapplication-id: order-server
tx-service-group: order-server-group
enable-auto-data-source-proxy: trueconfig:
type: nacosnacos:
namespace: public
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
userName: "nacos"password: "nacos"registry:
type: nacosnacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: public
userName: "nacos"password: "nacos"

微服务开启全局事务 @GlobalTransactional

 测试

在插入语句和异常语句设置断点:

此时,未执行插入语句,undo_log 为空:

断点往下走,此时数据库执行插入语句,但未抛出异常,undo_log 有记录:

断点往下走,0 为分母抛出异常,控制台报错:

可以看到 Seata 控制台也有相关信息:

此时执行了事务回滚,undo_log 为空:

数据插入失败,则 dgut_school_admin 表无新增记录:

可见,Seata 事务有效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESLint 使用教程(四):ESLint 有哪些执行时机?

前言 ESLint 作为一个静态代码分析工具&#xff0c;可以帮助我们发现和修复代码中的问题&#xff0c;保持代码风格的一致性。然而&#xff0c;ESLint的最佳实践不仅仅在于了解其功能&#xff0c;更在于掌握其执行时机。本文将详细介绍ESLint在不同开发阶段的执行时机&#xff…

关于分治法左右区间单调遍历应该如何设计

阅读以下文章&#xff0c;首先至少要求通过一道分治法的题目或听过一道该类型的讲解。 对于分治的题目&#xff0c;想必你应该知道&#xff0c;通常我们是对于一个区间拆分两个部分&#xff0c;而最小子问题通常是只包含一个元素的区间数组。为了后续方便处理更大范围的区间&am…

【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)

绪论​ “It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–&#xff0c;本章我将带你了解网络层&#xff0c;以及网络层中非常重要的IP协议格式和网络层的分片组装问题&#xff0c;后面将持续更新网…

利用AI制作《职业生涯规划PPT》,10分钟完成

职业生涯规划是大学生活中非常重要的一环。通过制定职业规划&#xff0c;你能够明确未来的职业目标、认清自身的优劣势&#xff0c;进而制定切实可行的计划&#xff0c;以便顺利踏上职业发展的道路。而制作一份精美的职业生涯规划PPT&#xff0c;能有效帮助你在面试、职业规划报…

FPGA高速设计之Aurora64B/66B的应用与不足的修正

FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料&#xff0c;来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出&#xff0c;是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…

vue2项目启用tailwindcss - 开启class=“w-[190px] mr-[20px]“ - 修复tailwindcss无效的问题

效果图 步骤 停止编译"npm run dev"安装依赖 npm install -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9 创建文件/src/assets/tailwindcss.css&#xff0c;写入内容&#xff1a; tailwind base; tailwind components; tailwind utiliti…

Docker部署Nginx

1. 拉取Nginx镜像 1.1 选择指定版本或latest 在部署Nginx时&#xff0c;选择合适的镜像版本是至关重要的。Docker Hub上提供了Nginx的官方镜像&#xff0c;用户可以根据自己的需求选择使用特定版本的Nginx或者始终使用最新的latest标签。 版本选择的重要性&#xff1a;选择一…

WPF+MVVM案例实战与特效(二十八)- 自定义WPF ComboBox样式:打造个性化下拉菜单

文章目录 1. 引言案例效果3. ComboBox 基础4. 自定义 ComboBox 样式4.1 定义 ComboBox 样式4.2 定义 ComboBoxItem 样式4.3 定义 ToggleButton 样式4.4 定义 Popup 样式5. 示例代码6. 结论1. 引言 在WPF应用程序中,ComboBox控件是一个常用的输入控件,用于从多个选项中选择一…

ctfshow-web入门-反序列化(web271-web278)

目录 1、web271 2、web272 3、web273 4、web274 5、web275 6、web276 7、web277 8、web278 laravel 反序列化漏洞 1、web271 laravel 5.7&#xff08;CVE-2019-9081&#xff09; poc <?php namespace Illuminate\Foundation\Testing{use Illuminate\Auth\Generic…

hive数据查询语法

思维导图 基本查询 基本语法 SELECT [ALL | DISTINCT] 字段名, 字段名, ... FROM 表名 [inner | left outer | right outer | full outer | left semi JOIN 表名 ON 关联条件 ] [WHERE 非聚合条件] [GROUP BY 分组字段名] [HAVING 聚合条件] [ORDER BY 排序字段名 asc | desc…

分段式爬虫和数据采集有什么关系

今天有人问我&#xff1a;分段式爬虫和数据采集有什么关系。 我想了想&#xff0c;我说我认为分段式爬虫其实是数据采集的一种手段或者说一种具体的方法。 咱就说数据采集吧&#xff0c;那就是想办法把各种有用的数据从不同的地方收集过来。这里面就有很多种方式&#xff0c;而…

最新网盘资源搜索系统,电视直播,Alist聚合播放

项目乃是基于 Vue 与 Nuxt.js 技术打造的网盘搜索项目&#xff0c;持续开源并保持维护更新。其旨在让人人皆可拥有属于自己的网盘搜索网站。强烈建议自行部署 更新日志&#xff1a; tv播放 新增Alist源聚合播放 新增批量删除功能 新增博客功能 &#xff08;分支&#xff1…

从零开始使用Intel的AIPC使用xpu加速comfyui

Intel的AIPC使用xpu加速跑comfyui 环境安装python环境搭建驱动及oneAPI安装创建python环境验证环境是否生效 ComfyUI的安装下载、汉化comfyui下载checkpoint 测试使用xpu加速测试使用cpu执行测试 环境安装 python环境搭建 直接下载Anaconda 下载地址 安装好后&#xff0c;通…

关于git使用的图文教程(包括基本使用,处理冲突问题等等)超详细

目录 用户签名,初始化git git提交流程图 提交到本地库 版本穿梭 分支操作 分支合并冲突 团队协作 github的使用 推送代码 克隆 拉取代码 团队协作冲突 团队协作之分支管理 推送分支到分支&#xff1a; 拉去远程库分支到本地库&#xff1a; 本地删除远程分支&am…

Android Studio打包时不显示“Generate Signed APK”提示信息

Android Studio打包时&#xff0c;默认显示“Generate Signed APK”提示信息&#xff0c;如下图所示&#xff1a; 如果在打包时不显示“Generate Signed APK”提示信息&#xff0c;解决办法是&#xff1a; Android Studio菜单栏&#xff0c;“File->Settings->Appearan…

【Go】-gRPC入门

目录 什么是gRPC 从Hello开始的简单使用 proto server端 client端 Proto的语法介绍 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 保留标识符&#xff08;Reserved&#xff09; 从.proto文件生成了什么&#xff1f; 标量数值类型 默…

后端SpringBoot学习项目-用户管理-增删改查

最终代码结构 仓库地址 Entity文件 数据库表设计 entity层实现 文件创建 ● 创建entity文件夹 ● 在entity层创建Java类&#xff0c;名字为User (关键字不可使用) 代码实现 package com.example.drhtspringboot.entity;import com.baomidou.mybatisplus.annotation.IdT…

网络管理之---3种网络模式配置

目标&#xff1a; 了解几个概念&#xff1a; 1.什么是IP&#xff1f;什么是IP地址&#xff1f; 2.什么是桥接、NAT、仅主机模式 3.端口&#xff1f; 4.什么是网络接口命名规则 5.网络管理器 IP&#xff1a;指网络之间互联的协议&#xff0c;是TCP/IP 体系中的网络协议 I…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…