从安装 Seata 开始的分布式事务之旅 springboot集成seata

从安装 Seata 开始的分布式事务之旅

  • 介绍
    • 什么是 Seata?
  • 安装 Seata Server
    • 下载 Seata Server 发行版
    • 配置Seata
      • 解压文件
      • 配置Seata的yml文件
      • 把配置文件config.txt加载到nacos上
        • 修改config.txt文件
        • 加载到nacos上
    • 启动Seata服务
      • 正常启动
        • 查看启动日志
        • 打开控制台页面
      • 启动时遇到的坑
        • 无法解析${console.user.username}的值
        • 无法解析${seata.security.secretKey}的值
        • 数据库连接问题
  • 在 Spring Boot 项目中集成 Seata
    • 工作环境
    • cloud、boot、alibaba环境
    • 添加依赖
    • 配置yml
    • 业务代码中集成 Seata
      • 使用 `@GlobalTransactional` 注解管理全局事务
      • 演示 AT(自动补偿)模式和 TCC(两阶段提交)模式
        • 使用 AT(自动补偿)模式
        • 使用 TCC(两阶段提交)模式
    • 集成Seata踩的坑
      • Table 'ddz.undo_log' doesn't exist
      • no available service 'null' found, please make sure registry config correct
      • 分布式事务未生效
      • dynamic-datasource can not find primary datasource
      • Communications link failure
  • 总结
  • 参考资料

在这里插入图片描述

介绍

什么是 Seata?

在现代应用程序开发中,分布式系统的应用越来越广泛。然而,随着系统的复杂性增加,处理分布式事务变得愈发困难。这就是 Seata 出现的背景。Seata(Simple Extensible Autonomous Transaction Architecture)是一种开源的分布式事务解决方案,旨在解决分布式系统中的事务一致性和协调性问题。
在传统的单体应用中,通常使用关系型数据库来管理事务,保证数据的一致性。但在分布式系统中,由于涉及多个独立的服务,事务管理变得复杂。分布式事务的要求是:所有涉及的服务要么都成功提交,要么都回滚,以保持数据的一致性。

Seata 提供了两种主要的事务模式:

  1. AT 模式(自动补偿模式):在 AT 模式中,Seata会自动补偿事务,无需手动编写补偿逻辑。Seata会将事务的所有操作编排成一个全局的事务,然后执行各个分支的 try 操作,在出现异常时执行相应的补偿操作。

  2. TCC 模式(两阶段提交模式):TCC 模式要求开发者手动编写 Try、Confirm 和 Cancel 三个阶段的逻辑。在 TCC 模式中,Seata负责协调全局事务的提交和回滚,而各个分支的 try、confirm 和 cancel 操作则由开发者来实现。

Seata 还提供了可扩展的注册中心和存储支持,使其适用于各种不同的场景。

总的来说,Seata 是一个强大的分布式事务解决方案,可以帮助开发者解决分布式事务的难题,确保分布式系统中数据的一致性和可靠性。通过集成 Seata,开发者可以更加轻松地构建复杂的分布式应用,提升系统的稳定性和性能。

安装 Seata Server

下载 Seata Server 发行版

您可以从 Seata 官方网站下载最新的 Seata Server 发行版,并解压到指定目录;有源码和二进制版本,我们这里选择安装二进制文件下载。我的版本是1.7.0 (2023-07-11,推荐版本)
在这里插入图片描述

配置Seata

解压文件

在这里插入图片描述
下载下来的是zip文件,解压后是上面文件夹,默认文件夹名字是seata。

配置Seata的yml文件

进入seata/conf目录下,这里有两个配置文件; 我们需要把application.yml 随意修改一个名字;然后再 application.example.yml修改成application.yml 作为主要配置文件。
在这里插入图片描述
修改 application.yml文件,我这里使用的nacos作为注册中心,所以需要修改的地方有:

  1. seata:config:type
  2. seata:registry:type
  3. store:mode
  4. store:session:mode
  5. store: lock:mode
  6. store:db 数据库的配置修改成自己的

配置文件:

server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstash
# 这里是主要的配置文件
seata:config:# support: nacos 、 consul 、 apollo 、 zk  、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848# 如果在nacos上添加了命名空间,则配置命令空间IDnamespace:# 配置分组group: SEATA_GROUPusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofatype: nacospreferred-networks: 30.240.*nacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:server:service-port: 8091 #If not configured, the default is '${server.port} + 1000'max-commit-retry-timeout: -1max-rollback-retry-timeout: -1rollback-retry-timeout-unlock-enable: falseenable-check-auth: trueenable-parallel-request-handle: trueretry-dead-threshold: 130000xaer-nota-retry-timeout: 60000enableParallelRequestHandle: truerecovery:committing-retry-period: 1000async-committing-retry-period: 1000rollbacking-retry-period: 1000timeout-retry-period: 1000undo:log-save-days: 7log-delete-period: 86400000session:branch-async-queue-size: 5000 #branch async remove queue sizeenable-branch-async-remove: false #enable to asynchronous remove branchSessionstore:# support: file 、 db 、 redismode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=trueuser: mysqlpassword: mysqlmin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000metrics:enabled: falseregistry-type: compactexporter-list: prometheusexporter-prometheus-port: 9898transport:rpc-tc-request-timeout: 15000enable-tc-server-batch-send-response: falseshutdown:wait: 3thread-factory:boss-thread-prefix: NettyBossworker-thread-prefix: NettyServerNIOWorkerboss-thread-size: 1

把配置文件config.txt加载到nacos上

修改config.txt文件

config.txt文件在seata/script/config-center目录下;我们需要修改的地方有:

  1. store.mode=db
  2. store.lock.mode=db
  3. store.session.mode=db
  4. store.db 数据库的配置修改成自己的,和上面yml文件里面的一样

加载到nacos上

进入seata/script/config-center/nacos 目录下执行nacos-config.sh文件。

sh nacos-config.sh -h 121.37.228.169 -p 8848 -g SEATA_GROUP -t 0af6e97b-a684-4647-b696-7c6d42aecce7 -u nacos -w nacos
  • -h: Nacos IP地址
  • -p: Nacos端口号
  • -g: Group分组名
  • -t: 命名空间ID,没有则默认public
  • -u: 用户名
  • -w:密码
    执行完成时候登录我们的Nacos配置管理就能查看到加载好的数据:
    在这里插入图片描述

启动Seata服务

正常启动

进入seata/bin 目录下,执行命令:

sh seata-server.sh 

在这里插入图片描述

这里我启动的时候可以会遇到报异常的情况,下面我出了几种我在启动时遇到的一些坑。可以移步到 启动时遇到的坑

查看启动日志

我的是Mac系统所有是open打开日志文件,其他的系统需要根据系统来执行命令,或者直接进入seata/logs目录下查看start.out文件。

open /Users/ddz/Downloads/seata/logs/start.out

在这里插入图片描述
能看到日志输出地址说明启动成功了。

打开控制台页面

控制台页面,默认账号密码是 seata/seata。
在这里插入图片描述

启动时遇到的坑

这里是我在部署Seata中遇到的一些坑,可能和有不同的地方只做为参考。

无法解析${console.user.username}的值

异常信息: Could not resolve placeholder ‘console.user.username’ in value “${console.user.username}”
在这里插入图片描述
解决方法:需要把之前修改成其他名称的yml文件中console下的所有配置信息复制到现在的application.yml下。这里就是设置我们登录控制台页面的账号密码。

无法解析${seata.security.secretKey}的值

异常信息:Could not resolve placeholder ‘seata.security.secretKey’ in value “${seata.security.secretKey}”
在这里插入图片描述
解决方法:需要把之前修改成其他名称的yml文件中seata.security下的所有配置信息复制到现在的application.yml下。

数据库连接问题

异常信息:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
在MySQL5.7之前的版本,安全性较低,存在任何用户都可以连接上数据库,所以官方在5.7版本加大了对隐私的保护。并且采用了默认 useSSL = true值防止对数据库的随意修改,到了8.0版本,仍然保留了SSL,并且默认值为 true。
在这里插入图片描述

解决方法:在数据库配置url后追加&useSSL=false;需要检查yml配置文件和Nacos上配置列表中store.db.url
在这里插入图片描述

在 Spring Boot 项目中集成 Seata

上面我们介绍了如何在本地安装seata服务端,接下来介绍一下我们Spring Boot项目中集成seata;这里我只单纯的用一个demo来介绍,可根据自己的业务逻辑来进行实现。

工作环境

  • MySQL 5.7.28
  • Maven 3.5.4
  • JDK 1.8
  • Mybatis 3.4.1
  • dynamic 3.4.1

cloud、boot、alibaba环境

   <spring-boot.version>2.3.7.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR9</spring-cloud.version><spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>

添加依赖

	<!--    MySQL    --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--    Mybatis    --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><!--    多数据源    --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.1</version></dependency><!--    Seata分布式事务    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

配置yml

server:port: 7001
spring:application:name: ddz-usercloud:nacos:discovery:# 服务分组group: ddzserver-addr: 121.37.228.111:8848# 必须填命名空间的ID
#        namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82datasource:dynamic:# 开启seata分布式事务seata: truestrict: falseprimary: masterdatasource:master:url: jdbc:mysql://121.37.228.111:3306/ddz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=trueusername: ddzpassword: ddz2023local:url: jdbc:mysql://127.0.0.1:3306/ddz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=trueusername: rootpassword: ddz2023# MyBatis Plus配置
mybatis-plus:# 搜索指定包别名typeAliasesPackage: com.ddz.**.entity# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*.xmlglobal-config:db-config:id-type: autoconfiguration:# 开启驼峰,开启后,只要数据库字段和对象属性名字母相同,无论中间加多少下划线都可以识别map-underscore-to-camel-case: true# Seata 配置
seata:application-id: seata-server# 是否启用数据源bean的自动代理enable-auto-data-source-proxy: falsetx-service-group: default_tx_group  # 必须和服务器配置一样registry:type: nacosnacos:# Nacos 服务地址server-addr: 121.37.228.111:8848group: SEATA_GROUP
#      namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82application: seata-server # 必须和服务器配置一样#      username:#      password:cluster: defaultconfig:type: nacosnacos:server-addr: 121.37.228.111:8848group: SEATA_GROUP
#      namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82service:vgroup-mapping:default_tx_group: default # 必须和服务器配置一样disable-global-transaction: falseclient:rm:# 是否上报成功状态report-success-enable: true# 重试次数report-retry-count: 5

业务代码中集成 Seata

我们根据两个数据源创建两个mapper类然后再controller中测试;我这里方便测试就省略了业务层。

使用 @GlobalTransactional 注解管理全局事务

在这里插入图片描述

演示 AT(自动补偿)模式和 TCC(两阶段提交)模式

使用 AT(自动补偿)模式

在 AT 模式中,Seata会自动补偿事务,无需手动编写补偿逻辑。首先,我们来演示一个简单的转账场景,将资金从一个账户转移到另一个账户,并保证事务的一致性。

  1. 添加 @GlobalTransactional 注解
    在转账服务的方法上添加 @GlobalTransactional 注解来标记全局事务:
@Service
public class TransferService {@GlobalTransactionalpublic void transfer(String fromAccount, String toAccount, double amount) {// 扣除转出账户金额deductAmount(fromAccount, amount);// 增加转入账户金额addAmount(toAccount, amount);}// 实现扣除金额逻辑// ...// 实现增加金额逻辑// ...
}
  1. 测试 AT 模式
    编写测试用例来验证 AT 模式的事务管理:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TransferServiceTest {@Autowiredprivate TransferService transferService;@Testpublic void testTransfer() {// 假设从账户 A 转账 100 到账户 BtransferService.transfer("accountA", "accountB", 100.0);}
}

运行测试用例,观察转账是否成功,并查看日志确认 Seata 是否自动补偿了事务。

使用 TCC(两阶段提交)模式

在 TCC 模式中,我们需要手动编写 Try、Confirm 和 Cancel 三个阶段的逻辑,以确保事务的正确执行。下面我们来演示一个简单的订单创建场景,包括下单、扣减库存和创建订单三个阶段。

  1. 实现 TCC 接口
    创建一个 TCC 接口并实现 Try、Confirm 和 Cancel 三个阶段的逻辑:
public interface OrderTccService {@GlobalTransactionalboolean createOrder(OrderDTO orderDTO);@TwoPhaseBusinessAction(name = "orderTccService", commitMethod = "confirmOrder", rollbackMethod = "cancelOrder")boolean tryCreateOrder(OrderDTO orderDTO);boolean confirmOrder(OrderDTO orderDTO);boolean cancelOrder(OrderDTO orderDTO);
}
  1. 实现 TCC 逻辑
    在实现类中编写 TCC 逻辑:
@Service
public class OrderTccServiceImpl implements OrderTccService {@Overridepublic boolean tryCreateOrder(OrderDTO orderDTO) {// 预留库存逻辑// ...return true;}@Overridepublic boolean confirmOrder(OrderDTO orderDTO) {// 确认创建订单逻辑// ...return true;}@Overridepublic boolean cancelOrder(OrderDTO orderDTO) {// 取消创建订单逻辑// ...return true;}
}
  1. 测试 TCC 模式
    编写测试用例来验证 TCC 模式的事务管理:
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderTccServiceTest {@Autowiredprivate OrderTccService orderTccService;@Testpublic void testCreateOrder() {// 创建一个订单OrderDTO orderDTO = new OrderDTO();// 设置订单信息// ...orderTccService.createOrder(orderDTO);}
}

运行测试用例,观察订单的创建是否成功,并查看日志确认 TCC 模式的 Try、Confirm 和 Cancel 阶段是否正确执行。

集成Seata踩的坑

这里是我在集成过程中遇到的一些坑,可能和有不同的地方只做为参考。

Table ‘ddz.undo_log’ doesn’t exist

异常信息:process connectionProxy commit error: Table ‘ddz.undo_log’ doesn’t exist。
解决方法:在数据源中切少Seata需要的日志表;在每个数据源中新增undo_log表。

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;

no available service ‘null’ found, please make sure registry config correct

异常信息:出现这个的原因是我们没有把Seata的config.txt加载到nacos上。
解决方法:执行命令把配置加载到Nacos配置中心上。参考上面:把配置文件config.txt加载到nacos上

分布式事务未生效

原因:我们使用的dynamic多数据源,默认是没有开启Seata分布式事务的。
解决方法:在yml配置文件中的dynamic下添加seata: true配置以开启分布式事务。

dynamic-datasource can not find primary datasource

原因:出现这个是数据源配置信息错误,我这里出现这个异常的原因是我自己太不细心导致数据库连接(url)连接编写错了。
解决方法:仔细检查一下datasource 下面数据源的配置。

Communications link failure

原因:这里大部分原因是MySQL需要指明是否进行SSL连接,默认是开启SSL连接的。
解决方法:在数据库连接配置URL后追加&useSSL=false即可。

总结

随着分布式系统的不断发展,分布式事务领域也会不断进化。在未来,我们可以进一步探索更多的分布式事务模式和解决方案,以满足不同业务场景的需求。同时,Seata 作为一个活跃的开源项目,将会不断推出新的功能和改进,我们可以关注 Seata 社区的更新和贡献自己的力量。

此外,除了 Seata,还有其他一些分布式事务解决方案,例如 TCC-TransactionSAGAHSTC 等,这些方案也值得我们深入学习和探索。根据业务场景的不同,我们可以选择最合适的方案来解决分布式事务问题。

参考资料

Nacos 官方文档
Seata 官方文档
Spring Boot 官方文档

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

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

相关文章

限流在不同场景的最佳实践

目录导读 限流在不同场景的最佳实践1. 前言2. 为什么要限流3. 有哪些限流场景3.1 限流场景分类3.2 限流与熔断降级之间的关系3.3 非业务限流3.4 业务限流 4. 有哪些限流算法4.1 计数器限流算法4.2 漏桶限流算法4.3 令牌桶限流算法4.4 滑动时间窗限流算法4.5 限流算法选型 5. 限…

NPM包的安装、更新、卸载

目录 1、下载安装全局包 2、解决全局安装包时的EACCES权限错误 2.1 重新安装NPM 2.2 手动更改npm的默认目录 3、更新从注册表下载的包 3.1 更新本地包 3.2 更新全局安装的软件包 3.3 确定哪些全局包需要更新 3.4 更新单个全局包 3.5 更新所有全局安装的软件包 4、在项…

VLAN监控及常见问题排查

局域网&#xff0c;我们通常称为LAN&#xff0c;是一种由基于同一地理位置的设备组成的网络&#xff0c;可实现它们之间的通信&#xff0c;局域网的虚拟对应物是虚拟局域网或 VLAN。VLAN 增强了 LAN&#xff0c;提供了进行更改的灵活性、更高的可扩展性和更好的安全性。 使用 …

使用 Gradio 构建生成式 AI 应用程序(一): 图片内容读取app

今天我们来学习DeepLearning.AI的在线课程&#xff1a;Building Generative AI Applications with Gradio&#xff0c;该课程主要讲述利用gradio来部署机器学习算法应用程序, 今天我们来学习第一课&#xff1a;Image captioning app&#xff0c;该课程主要讲述如何从图片中读取…

JavaScript 操作历史记录api怎样使用 JavaScript

JavaScript 操作历史记录api怎样使用 JavaScript History 是 window 对象中的一个 JavaScript 对象&#xff0c;它包含了关于浏览器会话历史的详细信息。你所访问过的 URL 列表将被像堆栈一样存储起来。浏览器上的返回和前进按钮使用的就是 history 的信息。 History 对象包含…

报错注入(主键重复)攻击原理

基本原理 利用数据表中主键不能重复的特点&#xff0c;通过构造重复的主键&#xff0c;使得数据库报错&#xff0c;并将报错结果返回到前端。 SQL说明函数 以pet数据表为例进行说明 rond(): 返回[0,1)区间内的任意浮点数。 count(): 返回每个组的列行数。 如&#xff0…

IDEA新建类时自动设置类注释信息,署名和日期

IDEA设置路径 File --> Settings --> Editor --> File and Code Templates --> Include --> File Header 官方模板 这里 ${USER} 会读取计算机的用户名 ${DATE}是日期 ${TIME}是时间 /*** Author ${USER}* Date ${DATE} ${TIME}* Version 1.0*/

简单易懂的Transformer学习笔记

1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…

智安网络|网络安全:危机下的创新与合作

随着信息技术的迅猛发展和互联网的普及&#xff0c;我们进入了一个高度网络化的社会。网络在提供便利和连接的同时&#xff0c;也带来了许多安全隐患和挑战。 一、网络安全的危险 **1.数据泄露和隐私侵犯&#xff1a;**网络上的个人和机构数据存在遭受泄露和盗取的风险&#…

clickhouse 删除操作

OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景&#xff0c;市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好&#xff0c;当然 clickhouse 也不例外。但是不友好不代表不支持&#xff0c;本文主要介绍在 clickhouse 中如何实现数据的删除&#xff0c…

go语言的database/sql结合squirrel工具sql生成器完成数据库操作

database/sql database/sql是go语言内置数据库引擎&#xff0c;使用sql查询数据库&#xff0c;配置datasource后使用其数据库操作方法对数据库操作&#xff0c;如下&#xff1a; package mainimport ("database/sql""fmt"_ "github.com/Masterminds…

Cesium 1.107+ 自定义类支持 readyPromise

由于cesium 1.107 的图元(Primitive) 已经不支持 readyPromise。 但是个人感觉比较好用,于是用了一个插件来实现。 用法: // 定义图元并添加,和之前一样 const boxGreen new BoxPrimitive({color: "#ff0000" }) viewer.scene.primitives.add(boxGreen.primitive)/…

【Spring专题】Bean的声明周期流程图

前言 我向来不主张【通过源码】理解业务&#xff0c;因为每个人的能力有限&#xff0c;甚至可能会因为阅读错误导致出现理解上的偏差&#xff0c;所以我决定&#xff0c;还是先帮大家【开天眼】&#xff0c;先整体看看流程图&#xff0c;好知道&#xff0c;Spring在写源码的过…

一文讲述什么是数字孪生?

当前世界正处于百年未有之大变局&#xff0c;数字经济在各国已成为经济发展的重点。数字经济也是我国社会经济发展的必经之路。 近些年&#xff0c;大数据、人工智能、数字孪生等技术的发展促使技术与国内各产业进一步融合&#xff0c;从而推动了各产业在智能化、数字化等方面…

程序猿成长之路之密码学篇-分组密码加密模式及IV(偏移量)的详解

Cipher.getInstance("AES/ECB/PKCS5Padding"); Cipher cipher Cipher.getInstance("AES/CBC/PKCS5Padding"); 在进行加解密编程的时候应该有很多小伙伴接触过以上的语句&#xff0c;但是大伙儿在编码过程中是否了解过ECB/CBC的含义、区别以及PKCS5Padding…

10个AI绘图生成器让绘画更简单

AI不仅影响商业和医疗保健等行业&#xff0c;还在创意产业中发挥着越来越大的作用&#xff0c;开创了AI绘画生成器新时代。在绘画领域当然也是如此&#xff0c;与传统的绘画工具不同&#xff0c;AI人工智能时代的绘画工具是全自动的、智能的&#xff0c;甚至可以说是“傻瓜式”…

Three.js阴影

目录 Three.js入门 Three.js光源 Three.js阴影 Three.js纹理贴图 使用灯光后&#xff0c;场景中就会产生阴影。物体的背面确实在黑暗中&#xff0c;这称为核心阴影&#xff08;core shadow&#xff09;。我们缺少的是落下的阴影&#xff08;drop shadow&#xff09;&#…

【ultralytics仓库使用自己的数据集训练RT-DETR】

ultralytics仓库使用自己的数据集训练RT-DETR RT-DETR由百度开发&#xff0c;是一款尖端的端到端物体检测器&#xff08;基于transformer架构&#xff09;&#xff0c;在提供实时性能的同时保持高精度。它利用视觉变换器&#xff08;ViT&#xff09;的力量&#xff0c;通过解耦…

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑&#xff0c;其安全性质与房屋等建筑物完全不同&#xff0c;并且建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;目前对于大坝监测多采用人工巡查的方法&#xff0c;存在一定的系统误差&#xff0c;其工作性态和安全状况随时都在变…

SSH连接阿里服务器搭建JAVA环境

SSH连接 1.IP录入 2.账户登录 3.右下角点击连接即可 安装JDK 1.查看是否存在jdk yum search jdk 2.安装JDK&#xff08;不存在时&#xff09; yum -y install java-1.8.0-openjdk* 3.安装完成 4.测试成功否 java -version 安装文件上传 yum -y install lrzsz 上传文件…