当前位置: 首页 > news >正文

网站建设新闻如何更新国外免费网站域名服务器入口

网站建设新闻如何更新,国外免费网站域名服务器入口,广州海珠网站开发价格,中国建筑信息查询平台从安装 Seata 开始的分布式事务之旅 介绍什么是 Seata#xff1f; 安装 Seata Server下载 Seata Server 发行版配置Seata解压文件配置Seata的yml文件把配置文件config.txt加载到nacos上修改config.txt文件加载到nacos上 启动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 doesnt existno available service null found, please make sure registry config correct分布式事务未生效dynamic-datasource can not find primary datasourceCommunications link failure 总结参考资料 介绍 什么是 Seata 在现代应用程序开发中分布式系统的应用越来越广泛。然而随着系统的复杂性增加处理分布式事务变得愈发困难。这就是 Seata 出现的背景。SeataSimple Extensible Autonomous Transaction Architecture是一种开源的分布式事务解决方案旨在解决分布式系统中的事务一致性和协调性问题。 在传统的单体应用中通常使用关系型数据库来管理事务保证数据的一致性。但在分布式系统中由于涉及多个独立的服务事务管理变得复杂。分布式事务的要求是所有涉及的服务要么都成功提交要么都回滚以保持数据的一致性。 Seata 提供了两种主要的事务模式 AT 模式自动补偿模式在 AT 模式中Seata会自动补偿事务无需手动编写补偿逻辑。Seata会将事务的所有操作编排成一个全局的事务然后执行各个分支的 try 操作在出现异常时执行相应的补偿操作。 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作为注册中心所以需要修改的地方有 seata:config:typeseata:registry:typestore:modestore:session:modestore: lock:modestore: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} 1000max-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?rewriteBatchedStatementstrueuser: 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目录下我们需要修改的地方有 store.modedbstore.lock.modedbstore.session.modedbstore.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后追加useSSLfalse需要检查yml配置文件和Nacos上配置列表中store.db.url。 在 Spring Boot 项目中集成 Seata 上面我们介绍了如何在本地安装seata服务端接下来介绍一下我们Spring Boot项目中集成seata这里我只单纯的用一个demo来介绍可根据自己的业务逻辑来进行实现。 工作环境 MySQL 5.7.28Maven 3.5.4JDK 1.8Mybatis 3.4.1dynamic 3.4.1 cloud、boot、alibaba环境 spring-boot.version2.3.7.RELEASE/spring-boot.versionspring-cloud.versionHoxton.SR9/spring-cloud.versionspring-cloud-alibaba.version2.2.6.RELEASE/spring-cloud-alibaba.version添加依赖 !-- MySQL --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- Mybatis --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.1/version/dependency!-- 多数据源 --dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion3.4.1/version/dependency!-- Seata分布式事务 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-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?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8rewriteBatchedStatementstrueusername: ddzpassword: ddz2023local:url: jdbc:mysql://127.0.0.1:3306/ddz?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8rewriteBatchedStatementstrueusername: 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会自动补偿事务无需手动编写补偿逻辑。首先我们来演示一个简单的转账场景将资金从一个账户转移到另一个账户并保证事务的一致性。 添加 GlobalTransactional 注解 在转账服务的方法上添加 GlobalTransactional 注解来标记全局事务 Service public class TransferService {GlobalTransactionalpublic void transfer(String fromAccount, String toAccount, double amount) {// 扣除转出账户金额deductAmount(fromAccount, amount);// 增加转入账户金额addAmount(toAccount, amount);}// 实现扣除金额逻辑// ...// 实现增加金额逻辑// ... }测试 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 三个阶段的逻辑以确保事务的正确执行。下面我们来演示一个简单的订单创建场景包括下单、扣减库存和创建订单三个阶段。 实现 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); }实现 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;} }测试 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) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;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后追加useSSLfalse即可。 总结 随着分布式系统的不断发展分布式事务领域也会不断进化。在未来我们可以进一步探索更多的分布式事务模式和解决方案以满足不同业务场景的需求。同时Seata 作为一个活跃的开源项目将会不断推出新的功能和改进我们可以关注 Seata 社区的更新和贡献自己的力量。 此外除了 Seata还有其他一些分布式事务解决方案例如 TCC-Transaction、SAGA、HSTC 等这些方案也值得我们深入学习和探索。根据业务场景的不同我们可以选择最合适的方案来解决分布式事务问题。 参考资料 Nacos 官方文档 Seata 官方文档 Spring Boot 官方文档
http://www.huolong8.cn/news/1147/

相关文章: