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

教育机构网站建设/站长工具seo综合查询怎么关闭

教育机构网站建设,站长工具seo综合查询怎么关闭,wordpress更换域名更改数据库,北京智能网站建设系统加盟文章目录1.搭建服务2.建表2.1 order服务下的表2.2 stock服务下的表3.实现服务3.1 新建下单服务(OrderServer模块)3.2 添加商品信息获取以及库存消减服务(stockServer模块)4.启动Seata4.1 安装 Seata5.使用Seata实现事务控制5.1 初…

文章目录

  • 1.搭建服务
  • 2.建表
    • 2.1 order服务下的表
    • 2.2 stock服务下的表
  • 3.实现服务
    • 3.1 新建下单服务(OrderServer模块)
    • 3.2 添加商品信息获取以及库存消减服务(stockServer模块)
  • 4.启动Seata
    • 4.1 安装 Seata
  • 5.使用Seata实现事务控制
    • 5.1 初始化数据表
    • 5.2 添加配置
      • 5.2.1 添加依赖
      • 5.2.2 DataSourceProxyConfig
      • 5.2.3 registry.conf
      • 5.2.4 修改application.properties文件
    • 5.3 在服务上开启全局事务
  • 6.测试

理论知识,在 《分布式事务解决方案》已经讲解的十分通透了,本文主要讲解如何通过Seata实现分布式事务控制
我们以订单微服务模块进行演示,然后由订单微服务调用商品微服务扣除库存
实现流程如下:
在这里插入图片描述

1.搭建服务

我们创建两个微服务模块,服务模块:

  • orderServer
  • stockServer

同时将两个服务集成fegin,mybatis,rabbitMq并且保证可以注册到nacos,具体如何创建和集成大家可以参考:

  • 《SpringCloud alibaba实战》

2.建表

2.1 order服务下的表

  • tb_order(订单表)
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (`order_id` int NOT NULL AUTO_INCREMENT,`user_id` int DEFAULT NULL,`product_id` int DEFAULT NULL COMMENT '产品ID',`order_time` datetime DEFAULT NULL COMMENT '下单时间 ',`transfer_money` double DEFAULT NULL COMMENT '交易金额',`product_num` int DEFAULT NULL COMMENT '购买商品数量',PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 stock服务下的表

  • tb_product(产品信息表)
DROP TABLE IF EXISTS `tb_product`;
CREATE TABLE `tb_product` (`product_id` int NOT NULL AUTO_INCREMENT,`product_name` varchar(255) DEFAULT NULL COMMENT '产品名称',`price` double(10,2) DEFAULT NULL COMMENT '价格',`rest_num` int DEFAULT NULL COMMENT '产品剩余数量',PRIMARY KEY (`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_product
-- ----------------------------
INSERT INTO `tb_product` VALUES ('1', 'Nike Air', '500.00', '15');

3.实现服务

3.1 新建下单服务(OrderServer模块)

@RestController
@Slf4j
public class TbOrderController {@AutowiredITbOrderService tbOrderService;@PostMapping("/order/prod/createOrder")public TbOrder createOrder(@RequestBody TbOrder tbOrder) {log.info("接收到{}号商品的下单请求", tbOrder.getProductId());return tbOrderService.createOrder(tbOrder.getProductId(), tbOrder.getProductNum());}
}
@Service
@Slf4j
public class TbOrderServiceImpl extends ServiceImpl<TbOrderMapper, TbOrder> implements ITbOrderService {@AutowiredProductService productService;@AutowiredSender_Direct sender_direct;@Overridepublic TbOrder createOrder(Integer productId, Integer productNum) {//1.调用商品微服务获取商品信息Map<String, Object> productInfo = productService.getProductById(productId);log.info("查询到{}号商品,商品名称为:{},剩余数量:{}", productId, productInfo.get("productName"), productInfo.get("restNum"));//2.下单TbOrder tbOrder = new TbOrder();tbOrder.setUserId(1);tbOrder.setProductId(productId);tbOrder.setOrderTime(new Date());tbOrder.setTransferMoney(Double.valueOf(productInfo.get("transferMoney").toString()));baseMapper.insert(tbOrder);log.info("创建订单成功 ,订单信息为:{}", JSON.toJSONString(tbOrder));//3.调用商品微服务--扣减库存productService.reduceInventory(productId, productNum);//4.消息队列中投递一个下单成功的消息//此处调用消息队列服务return null;}

对应的fegin如下:

@FeignClient(value = "seata-stock")
public interface ProductService {/*** 通过商品id获取商品信息** @param productId* @return*/@RequestMapping(value = "getProductById", method = RequestMethod.POST)public Map<String, Object> getProductById(@RequestParam(value = "productId") Integer productId);/*** 通过商品id扣减库存** @param productId* @return*/@RequestMapping(value = "reduceInventory", method = RequestMethod.POST)public Integer reduceInventory(@RequestParam(value = "productId") Integer productId,@RequestParam(value = "num") Integer num);
}

3.2 添加商品信息获取以及库存消减服务(stockServer模块)

@RestController
public class TbProductController {@AutowiredITbProductService productService;/*** 通过商品id获取商品信息** @param productId* @return*/@RequestMapping(value = "getProductById", method = RequestMethod.POST)public TbProduct getProductById(@RequestParam(value = "productId") Integer productId) {return productService.getById(productId);}/*** 通过商品id扣减库存** @param productId* @return*/@RequestMapping(value = "reduceInventory", method = RequestMethod.POST)public Integer reduceInventory(@RequestParam(value = "productId") Integer productId,@RequestParam(value = "num") Integer num) {return productService.reduceInventory(productId, num);}
}
/*** <p>* 服务实现类* </p>** @author astupidcoder* @since 2022-04-21*/
@Service
public class TbProductServiceImpl extends ServiceImpl<TbProductMapper, TbProduct> implements ITbProductService {@Overridepublic Integer reduceInventory(Integer productId, Integer num) {TbProduct tbProduct = baseMapper.selectById(productId);if (tbProduct.getRestNum() < num) {throw new RuntimeException("库存不足");}int i = 1 / 0;//此处用于模拟异常tbProduct.setRestNum(tbProduct.getRestNum() - num);return baseMapper.update(tbProduct, null);}
}

4.启动Seata

4.1 安装 Seata

  • 《docker部署Seata》
  • 《windows安装seata》

5.使用Seata实现事务控制

5.1 初始化数据表

在我们的数据库中加入一张undo_log表,这是Seata记录事务日志要用到的表

DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) COLLATE utf8_bin NOT NULL,`context` varchar(255) COLLATE utf8_bin NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,`log_modified` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,`ext` varchar(100) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`branch_id`,`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

5.2 添加配置

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

5.2.1 添加依赖

 <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-seata --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.1</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2021.1</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

5.2.2 DataSourceProxyConfig

Seata 是通过代理数据源实现事务分支的,所以需要配置 io.seata.rm.datasource.DataSourceProxy 的Bean,且是 @Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

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);}
}

5.2.3 registry.conf

在resources下添加Seata的配置文件 registry.conf

registry {type = "nacos"nacos {serverAddr = "localhost"namespace = "public"cluster = "default"}
}
config {type = "nacos"nacos {serverAddr = "localhost"namespace = "public"cluster = "default"}
}

注意:serverAddr按照你自己的naocs地址进行修改

5.2.4 修改application.properties文件

nacos.ip=192.168.28.133
#------------------------------------------------------------------------------------------------------------------------
server.port=8082
spring.application.name=seata-order
spring.cloud.nacos.discovery.server-addr=${nacos.ip}:8848
spring.cloud.nacos.discovery.namespace=public
spring.cloud.nacos.discovery.group=SEATA_GROUP
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.main.allow-circular-references=true
#-----------------------------------------------------------------------------------------------------------------------
# 开启自动装配
seata.enabled=true
# 是否开启数据源自动代理,一定要为 false,否则会和mp冲突
seata.enable-auto-data-source-proxy=false
# 事务分组,程序会通过用户的配置中心去寻找service.vgroupMapping
seata.tx-service-group=my_test_tx_group
seata.config.type=nacos
seata.config.nacos.server-addr=${nacos.ip}:8848
seata.config.nacos.namespace=public
seata.config.nacos.group=SEATA_GROUP
seata.config.nacos.username=nacos
seata.config.nacos.password=nacos
seata.registry.type=nacos
seata.registry.nacos.server-addr=${nacos.ip}:8848
seata.registry.nacos.namespace=public
seata.registry.nacos.username=nacos
seata.registry.nacos.password=nacos
seata.registry.nacos.application=seata-server
seata.registry.nacos.group=SEATA_GROUP
# 事务群组,my_test_tx_group为分组,配置项值为TC集群名
seata.service.vgroup-mapping.my_test_tx_group=default
seata.service.disable-global-transaction=false
seata.client.rm.report-success-enable=false

在这里插入图片描述

如下所示:
在这里插入图片描述

5.3 在服务上开启全局事务

@GlobalTransactional

在这里插入图片描述

注意:我们需要在所有需要控制的服务上都需要开启此注解,即:
在这里插入图片描述

在这里插入图片描述

6.测试

首先我们先不加入注解@GlobalTransactional,进行测试:
在这里插入图片描述

在这里插入图片描述

打开我们的订单表,可以看到已经生成了一个订单信息:
在这里插入图片描述

同时我们再看看库存数据,会发现未发生任何变化
在这里插入图片描述

我来解释一下原因:
每一个服务下都会遵循自己独立的ACID原则,一旦发生异常数据库就会回滚,即保证数据的一致性,而我们的分布式事务就是要解决微服务之间数据一致性的问题


现在我们在两个服务上面加入注解@GlobalTransactional再次进行测试:
会发现order表中未添加任何的数据,同时库存也没有变化,完全符合我们所需要的功能。

http://www.lbrq.cn/news/1278361.html

相关文章:

  • seo算法是什么/北京搜索优化排名公司
  • 云一网站公司/色盲测试图 考驾照
  • 做网站哪家靠谱/全网优化推广
  • 黑龙江省建设局网站首页/市场调研分析
  • 乐清人才网官方网站/深圳搜索引擎优化推广
  • 网站建站实训总结/刚刚中国出啥大事了
  • 合肥的电商网站设计/平台推广广告宣传词
  • 贵金属网站源码/线上推广员是做什么的
  • 请人做网站得多少钱/网站链接分析工具
  • 建一个网站迈年/重庆网站建设公司
  • 怎么把园林设计网站做的酷炫/建筑设计网站
  • 网站看不到排版怎么办/免费建立个人网站官网
  • 柯城网站建设/福州seo公司排名
  • 计算机网站建设/青岛网站建设制作
  • 文昌市规划建设管理局网站/chrome官网下载
  • 微信导购网站怎么做视频教学/seo优化培训学校
  • 大型营销型网站制作/郑州seo推广外包
  • 网站建设和微站建设的区别/网站推广关键词排名优化
  • 当铺网站建设方案/中国seo第一人
  • 外国人做的甲骨文网站/精准营销的案例
  • 视频素材网免费/苏州企业网站关键词优化
  • c# 网站开发教程/seo 推广怎么做
  • 龙岗外贸网站建设公司/电子商务网站推广策略
  • 徐州企业做网站/谷歌seo外包
  • 企业需求做网站在哪儿交易/自建站怎么推广
  • 公司做网站需要几个人/企业网站seo诊断工具
  • 做软件下载网站有哪些/51外链代发网
  • 免费网站代码/企业网站seo诊断报告
  • wordpress网站管理系统/网址大全
  • 广西做网站/搜索引擎官网
  • 结合项目阐述 设计模式:单例、工厂、观察者、代理
  • 【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用
  • 把振动数据转成音频并播放
  • 最小二乘法拟合椭圆
  • 深入探索Linux:忙碌的车间“进程”间通信
  • GIF图像格式