Spring Cloud Alibaba +Nacos+Seata 分布式事务案例

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

5.1.6

com.baomidou

mybatis-plus-boot-starter

3.4.2

com.baomidou

mybatis-plus-extension

3.3.0

compile

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

com.alibaba.cloud

spring-cloud-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-seata

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

src/main/java

**/*.xml

product-service pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

springcloudalibaba-seata

com.xuweichao

1.0-SNAPSHOT

4.0.0

product-service

pom

product-service-client

product-service-server

product-service-server pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

product-service

com.xuweichao

1.0-SNAPSHOT

4.0.0

product-service-server

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

5.1.6

com.baomidou

mybatis-plus-boot-starter

3.4.2

com.baomidou

mybatis-plus-extension

3.3.0

compile

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

com.alibaba.cloud

spring-cloud-alibaba-nacos-discovery

com.alibaba.cloud

spring-cloud-starter-alibaba-seata

com.xuweichao

product-service-client

1.0-SNAPSHOT

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

src/main/java

**/*.xml

product-service-client pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

product-service

com.xuweichao

1.0-SNAPSHOT

4.0.0

com.xuweichao

product-service-client

jar

com.baomidou

mybatis-plus-annotation

3.3.0

compile

com.baomidou

mybatis-plus-extension

3.3.0

compile

org.springframework.cloud

spring-cloud-starter-openfeign

数据库建表:订单表 产品表

CREATE TABLE order_base (

id bigint(20) NOT NULL AUTO_INCREMENT,

user_name varchar(10) DEFAULT NULL,

p_id bigint(20) DEFAULT NULL,

p_name varchar(50) DEFAULT NULL,

p_price double(10,2) DEFAULT NULL,

number int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

CREATE TABLE product_base (

id bigint(20) NOT NULL AUTO_INCREMENT,

name varchar(100) DEFAULT NULL,

price double(10,2) DEFAULT NULL,

stock int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

使用 代码生成工具生成数据库试题对象和 service

order-service 微服务 添加配置 application.yml

spring:

application:

name: order-service

datasource:

driver-class-name: com.mysql.jdbc.Driver

password: xxx

url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/database-name?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

username: root

server:

port: 18080

swagger:

enable: true

mybatis-plus:

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

product-service 微服务 添加配置 application.yml

spring:

application:

name: product-service

datasource:

driver-class-name: com.mysql.jdbc.Driver

password: xxx

url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/database-name?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

username: root

server:

port: 18080

swagger:

enable: true

mybatis-plus:

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

product-service-server 添加接口:

@Slf4j

@Api(value = “ProductBase 相关接口”, tags = “ProductBase 相关接口”)

@RestController

@RequestMapping(“product”)

public class ProductBaseController implements ProductServiceClient {

@Autowired

public IProductBaseService productBaseService;

@Override

@ApiOperation(value = “详情”)

@GetMapping(“detail/{id}”)

public ProductBase getProductBase(@PathVariable Long id) {

log.info(“获取的参数:===>>” + id);

return productBaseService.getById(id);

}

@Override

@ApiOperation(value = “修改库存”)

@GetMapping(“{id}”)

public Boolean productUpdateStock(@PathVariable Long id) {

log.info(“获取的参数:===>>” + id);

ProductBase productBase = productBaseService.getById(id);

productBase.setStock(productBase.getStock()-1);

return productBaseService.updateById(productBase);

}

}

在product-service-client 添加 Feign 服务接口

@Component

@FeignClient(name = “product-service”,path = “/product/”)

public interface ProductServiceClient {

@GetMapping(“detail/{id}”)

ProductBase getProductBase(@PathVariable(“id”) Long id);

@GetMapping(“/{id}”)

Boolean productUpdateStock(@PathVariable(“id”) Long id);

}

order-service 中创建接口

@Slf4j

@Api(value = “OrderBase 相关接口”, tags = “OrderBase 相关接口”)

@RestController

@RequestMapping(“order”)

public class OrderBaseController {

@Resource

public IOrderBaseService orderBaseService;

@ApiOperation(value = “添加”, notes = “添加”)

@GetMapping(“{pid}”)

public Boolean orderBaseSave(@PathVariable Long pid) {

log.info(“获取的参数:===>>” + pid);

return orderBaseService.createOrder(pid);

}

}

OrderServiceImpl:

@Service

public class OrderBaseServiceImpl extends ServiceImpl<OrderBaseMapper, OrderBase> implements IOrderBaseService {

@Autowired

private ProductServiceClient productServiceClient;

@Override

public Boolean createOrder(Long pid) {

ProductBase productBase = productServiceClient.getProductBase(pid);

OrderBase orderBase=new OrderBase();

orderBase.setNumber(2);

orderBase.setPId(productBase.getId());

orderBase.setPName(productBase.getName());

orderBase.setPPrice(productBase.getPrice());

orderBase.setUserName(“超超”);

this.save(orderBase);

productServiceClient.productUpdateStock(orderBase.getPId());

return Boolean.TRUE;

}

}

这里是模拟的创建订单和减库存的操作

安装Seata

=======

下载

下载地址: https://github.com/seata/seata/releases/v0.9.0/

进入conf 目录修改配置文件register.conf,我们这里是用nacos 作为注册和配置中心的,所以精简一下配置

registry {

type = “nacos”

nacos {

serverAddr = “localhost”

namespace = “public”

cluster = “default”

}

}

config {

type = “nacos”

nacos {

serverAddr = “localhost”

namespace = “public”

cluster = “default”

}

}

初始Seata配置

进入 seata-0.9.0\server\src\main\resources 目录 找到 nacos-config.txt 文件

第一个箭头哪里代表事务组

这里的语法为: service.vgroup_mapping.${your - service - gruop}=default ,中间的

${your - service - gruop} 为自己定义的服务组名称, 这里需要我们在程序的配置文件中配置。

store 那里改成自己的数据源配置,并建表

– 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)

);

创建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=3 DEFAULT CHARSET=utf8

# 初始化 seata 的 nacos 配置

# 注意 : 这里要保证 nacos 是已经正常运行的

cd conf

nacos-config.sh 127.0.0.1

执行之后 在nacos 中就能看上最上边图中展示的效果了。

启动seata,进入 seata-server-0.9.0\seata\bin 目录执行

seata-server.bat -p 9000 -m file

将register.conf 文件分别拷贝到 order-service 和product-service-server 微服务 的resources 目录下

添加服务注册发现和 Seata事务组

分别在两个微服务resources目录下创建 bootstrap.yml

spring:

cloud:

nacos:

config:

server-addr: 127.0.0.1:8848

namespace: public

group: SEATA_GROUP

discovery:

server-addr: 127.0.0.1:8848

alibaba:

seata:

tx-service-group: product_service_group

2021年Java中高级面试必备知识点总结

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

部分内容:

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
录下

添加服务注册发现和 Seata事务组

分别在两个微服务resources目录下创建 bootstrap.yml

spring:

cloud:

nacos:

config:

server-addr: 127.0.0.1:8848

namespace: public

group: SEATA_GROUP

discovery:

server-addr: 127.0.0.1:8848

alibaba:

seata:

tx-service-group: product_service_group

2021年Java中高级面试必备知识点总结

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。

本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。

目录:

[外链图片转存中…(img-jJU4PHSj-1714748780561)]

(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

[外链图片转存中…(img-wrW27soV-1714748780562)]

部分内容:

[外链图片转存中…(img-eLcfLigi-1714748780562)]

[外链图片转存中…(img-1dgp9rtg-1714748780562)]

[外链图片转存中…(img-Dy7g1v18-1714748780562)]

对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。

不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值