springboot dubbo seata nacos集成 分布式事务seata实现

文章目录

  • Seata介绍
  • dubbo介绍
  • 目标
  • 版本说明和代码地址
  • pom.xml
  • 验证模块
    • microservice-boot-common
    • microservice-boot- plat
  • 验证结果
  • 注意事项

Seata介绍

官网:http://seata.io/zh-cn/docs/overview/what-is-seata.html
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

在这里插入图片描述

dubbo介绍

官网;https://cn.dubbo.apache.org/zh-cn/overview/what/
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。

目标

我们先说目标,为各位看官节省不匹配的时间
1、使用nacos做配置中心
2、使用nacos做注册中心
3、微服务模块化
4、使用dubbo作为服务管理
5、使用springboot做脚手架
6、使用seata做分布式事务

版本说明和代码地址

Dubbo :3.1.0
Springboot:2.3.1.RELEASE
Seata:1.6.1
Nacos-config:0.2.10

实现源代码地址
分支:microservice-boot-1.0.4-seata
代码演示和测试:
microservice-boot-common模块
microservice-boot-plat模块

pom.xml

直接上pom文件吧

  <dubbo.version>3.1.0</dubbo.version><spring-boot.version>2.3.1.RELEASE</spring-boot.version><spring-context-support.version>1.0.11</spring-context-support.version><!-- 微服务相关 --><nacos-config.version>0.2.10</nacos-config.version><io.seata.version>1.6.1</io.seata.version><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- Dubbo Spring Boot Starter --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId></dependency><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId></dependency><!--nacos config --><dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>${nacos-config.version}</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></exclusion><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></dependency>

验证模块

两个模块
microservice-boot-common
microservice-boot- plat
模拟:
plat中controller请求,本地服务(此服务使用分布式事务),本地服务调用dubbo服务(包括palt的保存数据和common的保存日志)

microservice-boot-common

1、yaml配置

  # seata 配置
seata:application-id: ${spring.application.name}config:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: fb91b495-9490-436f-b9cd-023f2ca42b08group: SEATA_GROUPusername: nacospassword: nacoscontext-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.properties# 默认就是这个额,可以不配置tx-service-group: default_tx_groupregistry:custom:name: ${spring.application.name}type: nacosnacos:server-addr: 127.0.0.1:8848application: seata-servergroup: SEATA_GROUPnamespace: 920bb73f-17da-4128-9de0-41893097ce38username: nacospassword: nacos

2、dubbo服务代码

package org.lwd.microservice.boot.common.service.dubbo;import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.lwd.microservice.boot.common.api.dto.VisitDubboDTO;
import org.lwd.microservice.boot.common.api.dubbo.VisitDubboService;
import org.lwd.microservice.boot.common.entity.dto.VisitDTO;
import org.lwd.microservice.boot.common.service.VisitService;
import org.lwd.microservice.boot.core.constant.HttpStatusEnum;
import org.lwd.microservice.boot.core.entity.BaseResult;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;/*** @author weidong* @version V1.0.0* @since 2023/6/28*/
@Slf4j
@DubboService
public class VisitDubboServiceImpl implements VisitDubboService {@AutowiredVisitService visitService;/*** 保存** @return*/@Overridepublic BaseResult<Integer> saveVisitDubboService(VisitDubboDTO visitDubboDTO) {log.info("----i am do saveVisitDubboService-----:{}", JSON.toJSONString(visitDubboDTO));BaseResult<Integer> baseResult = BaseResult.success();VisitDTO visitDTO = new VisitDTO();BeanUtils.copyProperties(visitDubboDTO, visitDTO);BaseResult<Integer> result = visitService.saveVisit(visitDTO);if (result.isSuccess()) {baseResult.setData(baseResult.getData());} else {baseResult.setCode(HttpStatusEnum.REQUEST_FAIL.getCode());baseResult.setMessage("保存日志失败");}return baseResult;}
}

microservice-boot- plat

1、yaml配置

# seata 配置
seata:application-id: ${spring.application.name}config:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: fb91b495-9490-436f-b9cd-023f2ca42b08group: SEATA_GROUPusername: nacospassword: nacoscontext-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.properties# 默认就是这个额,可以不配置tx-service-group: default_tx_groupregistry:custom:name: ${spring.application.name}type: nacosnacos:server-addr: 127.0.0.1:8848application: seata-servergroup: SEATA_GROUPnamespace: 920bb73f-17da-4128-9de0-41893097ce38username: nacospassword: nacos

2、dubbo服务实现

package org.lwd.microservice.boot.plat.service.dubbo;import org.apache.dubbo.config.annotation.DubboService;
import org.lwd.microservice.boot.core.entity.BaseResult;
import org.lwd.microservice.boot.plat.api.dto.UserLoginDubboDTO;
import org.lwd.microservice.boot.plat.api.dubbo.UserLoginDubboService;
import org.lwd.microservice.boot.plat.entity.dto.UserLoginDTO;
import org.lwd.microservice.boot.plat.service.UserLoginService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;/*** 登录基本服务* @author weidong* @version V1.0.0* @since 2023/7/3*/
@DubboService
public class UserLoginDubboServiceImpl implements UserLoginDubboService {@AutowiredUserLoginService userLoginService;@Overridepublic BaseResult<Integer> saveUserLoginDubbo(UserLoginDubboDTO userLoginDubboDTO) {BaseResult<Integer> result = BaseResult.success();UserLoginDTO userLoginDTO = new UserLoginDTO();BeanUtils.copyProperties(userLoginDubboDTO,userLoginDTO);BaseResult<Integer> baseResult = userLoginService.saveUserLogin(userLoginDTO);if(baseResult.isSuccess()){result.setData(baseResult.getData());}return result;}
}

3、分布式事务服务实现

package org.lwd.microservice.boot.plat.service.impl;import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.lwd.microservice.boot.common.api.dto.VisitDubboDTO;
import org.lwd.microservice.boot.common.api.dubbo.VisitDubboService;
import org.lwd.microservice.boot.core.constant.HttpStatusEnum;
import org.lwd.microservice.boot.core.entity.BaseResult;
import org.lwd.microservice.boot.plat.api.dto.UserLoginDubboDTO;
import org.lwd.microservice.boot.plat.api.dubbo.UserLoginDubboService;
import org.lwd.microservice.boot.plat.entity.dto.UserLoginDTO;
import org.lwd.microservice.boot.plat.service.UserLoginSeataService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;/*** @author weidong* @version V1.0.0* @since 2023/7/3*/
@Slf4j
@Service
public class UserLoginSeataServiceImpl implements UserLoginSeataService {@DubboReferenceUserLoginDubboService userLoginDubboService;@DubboReferenceVisitDubboService visitDubboService;@Override@GlobalTransactional(timeoutMills = 30000, name = "default_tx_group")public BaseResult<Integer> saveUserLoginSeata(UserLoginDTO dto) throws Exception {BaseResult<Integer> result = BaseResult.success();log.info("开始全局事务:xid=" + RootContext.getXID());log.info("begin userLogin: " + dto);//保存登录信息UserLoginDubboDTO userLoginDubboDTO = new UserLoginDubboDTO();BeanUtils.copyProperties(dto, userLoginDubboDTO);BaseResult<Integer> userResult = userLoginDubboService.saveUserLoginDubbo(userLoginDubboDTO);if (userResult.isSuccess()) {result.setData(userResult.getData());} else {result.setCode(HttpStatusEnum.REQUEST_FAIL.getCode());throw new Exception("登录信息保存系统异常");}if (!result.isSuccess()) {return result;}//保存日志VisitDubboDTO visitDubboDTO = new VisitDubboDTO();visitDubboDTO.setServerIpAddress("3.3.3.3");if (dto.getEnabled().equals(1)) {visitDubboDTO.setCreateTime(dto.getCreateTime());}BaseResult<Integer> visitResult = visitDubboService.saveVisitDubboService(visitDubboDTO);if (visitResult.isSuccess()) {log.info("visit info pk:{}", visitResult.getData());result.setData(visitResult.getData());} else {result.setCode(HttpStatusEnum.REQUEST_FAIL.getCode());throw new Exception("日志保存系统异常");}return result;}
}

验证结果

在这里插入图片描述

注意事项

1、seata在注册到nacos时,订阅端的应用名称为unknown
临时解决方案:

package org.lwd.microservice.boot.common;import org.lwd.microservice.boot.middle.runtime.util.YmlUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/**** @author weidong* @version V1.0.0* @since 2023/4/7*/
@SpringBootApplication
public class CommonApplication {public static void main(String[] args) {//TODO 这块有一个问题,seata在注册到nacos时,订阅端的应用名称为unknown,经验证是获取不到ProjectNameConfig中设置的${spring.application.name}//估计是加载顺序获取其他问题,现在这获取数据,优先处理System.setProperty("project.name", YmlUtils.getApplicationName());SpringApplication.run(CommonApplication.class, args);}
}

2、分布式事务默认AT模式

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

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

相关文章

python实现语音识别(讯飞开放平台)

文章目录 讯飞平台使用python实现讯飞接口的语音识别第一步&#xff1a;导入需要的依赖库第二步&#xff1a;声明全局变量第三步&#xff1a;初始化讯飞接口对象第四步&#xff1a;收到websocket建立连接后的处理函数第五步&#xff1a;收到websocket消息的处理函数第六步&…

scratch 角色追踪

scratch 角色追踪 本程序中一个角色移动到随机位置和方向后向前移动&#xff0c;碰到边缘反弹&#xff1b;另一个角色跟随前一个角色&#xff0c;两个角色接触后前者重新取随机位置。 程序内容如下

Spring Boot 缓存应用实践

缓存是最直接有效提升系统性能的手段之一。个人认为用好用对缓存是优秀程序员的必备基本素质。本文结合实际开发经验&#xff0c;从简单概念原理和代码入手&#xff0c;一步一步搭建一个简单的二级缓存系统。 一、通用缓存接口 1、缓存基础算法 FIFO&#xff08;First In Fir…

生产级Redis Cluster部署(4.0.10版本)

生产级Redis Cluster部署 环境准备 主机名 IP地址 端口 描述 redis-master 192.168.1.51 7000 redis-master01 7001 redis-master02 7002 redis-master03 redis-slave 192.168.1.52 8000 redis-slave01 8001 redis-slave02 8002 redis-slave03 初始化…

Django实现简单的音乐播放器 3

在原有音乐播放器上请求方式优化和增加加载本地音乐功能。 效果&#xff1a; 目录 播放列表优化 设置csrf_token 前端改为post请求 视图端增加post验证 加载歌曲 视图 设置路由 模板 加载layui css 加载layui js 增加功能列表 功能列表脚本实现 最终效果 总结 播…

【计算机视觉】YOLOv8的测试以及训练过程(含源代码)

文章目录 一、导读二、部署环境三、预测结果3.1 使用检测模型3.2 使用分割模型3.3 使用分类模型3.4 使用pose检测模型 四、COCO val 数据集4.1 在 COCO128 val 上验证 YOLOv8n4.2 在COCO128上训练YOLOv8n 五、自己训练5.1 训练检测模型5.2 训练分割模型5.3 训练分类模型5.4 训练…

English Learning - L3 纠音 W9 Lesson7-8 Ted Living Beyond Limits 2023.7.4 周二

朗读内容&#xff1a; Lesson 7-8 Day 52 - 60 句子 Ted Living Beyond Limits 23-50

ANSYS ACT插件开发基本流程

开发实施路线 以ACT仿真向导的开发为例&#xff0c;整体可以分为IronPython脚本开发和XML界面开发两个阶段&#xff1b;实际上所有的ANSYS产品的仿真向导开发都是遵循相同的路线流程。此外&#xff0c;另外两种类型的ACT插件开发路线亦是如此。 如何去学习 脚本开发是ACT插件…

Spring Boot 中的分布式追踪及使用

Spring Boot 中的分布式追踪及使用 随着互联网应用程序的复杂性不断增加&#xff0c;分布式系统已经成为了许多企业级应用程序的标配。在分布式系统中&#xff0c;由于服务之间的调用关系错综复杂&#xff0c;很难追踪到一个请求在整个系统中的执行路径和时间&#xff0c;这就…

智安网络|新型恶意软件攻击:持续威胁网络安全

当今数字化时代&#xff0c;恶意软件已经成为网络安全领域中的一项巨大威胁。随着技术的不断进步&#xff0c;恶意软件的攻击方式也在不断演变和发展。 以下是一些目前比较常见的新型恶意软件攻击&#xff1a; **1.勒索软件&#xff1a;**勒索软件是一种恶意软件&#xff0c;它…

【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二

知识目录 前言一、聚合函数二、矩阵操作2.1 算术运算2.2 线性代数2.3 其他数学操作 三、广播机制3.1 广播的原则3.2 案例 四、排序五、文件操作结语相关导读 前言 大家好&#xff01;本期给大家带来的是【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二&#xff0c;收录于…

【Ubuntu】系统U盘变为普通U盘

如果您在 Ubuntu 系统上没有磁盘工具可用&#xff0c;您可以尝试使用命令行工具来格式化系统 U 盘。请按照以下步骤进行操作&#xff1a; 打开终端&#xff1a;在 Ubuntu 桌面上&#xff0c;按下 Ctrl Alt T 快捷键&#xff0c;或者在应用程序菜单中搜索并打开 "终端&qu…