SpringCloud+Seata+nacos案例(包含源码 Seata及nacos安装教程)(1)

分享

1、算法大厂——字节跳动面试题

2、2000页互联网Java面试题大全

3、高阶必备,算法学习

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

registry-type = “compact”

multi exporters use comma divided

exporter-list = “prometheus”

exporter-prometheus-port = 9898

}

support {

spring

spring {

auto proxy the DataSource bean

datasource.autoproxy = false

}

}

b.registry.conf修改

registry {

file 、nacos 、eureka、redis、zk、consul、etcd3、sofa

type = “file”

nacos {

serverAddr = “localhost”

namespace = “”

cluster = “default”

}

eureka {

serviceUrl = “http://localhost:8761/eureka”

application = “default”

weight = “1”

}

redis {

serverAddr = “localhost:6379”

db = “0”

}

zk {

cluster = “default”

serverAddr = “127.0.0.1:2181”

session.timeout = 6000

connect.timeout = 2000

}

consul {

cluster = “default”

serverAddr = “127.0.0.1:8500”

}

etcd3 {

cluster = “default”

serverAddr = “http://localhost:2379”

}

sofa {

serverAddr = “127.0.0.1:9603”

application = “default”

region = “DEFAULT_ZONE”

datacenter = “DefaultDataCenter”

cluster = “default”

group = “SEATA_GROUP”

addressWaitTime = “3000”

}

file {

name = “file.conf”

}

}

config {

file、nacos 、apollo、zk、consul、etcd3

type = “file”

nacos {

serverAddr = “localhost”

namespace = “”

}

consul {

serverAddr = “127.0.0.1:8500”

}

apollo {

app.id = “seata-server”

apollo.meta = “http://192.168.1.204:8801”

}

zk {

serverAddr = “127.0.0.1:2181”

session.timeout = 6000

connect.timeout = 2000

}

etcd3 {

serverAddr = “http://localhost:2379”

}

file {

name = “file.conf”

}

}

3.创建seata数据库(mysql) 将seata->conf->db_store.sql放到数据库中运行即可

4.到bin目录下找到seata-server.bat运行即可 如下即为成功运行:

在这里插入图片描述

三.nacos安装


a.下载地址:https://github.com/alibaba/nacos/releases

b.修改application.properties文件(将数据库对应配置注释打开即可)

在这里插入图片描述

c.找到startup.cmd编辑里面的将set MODE="cluster"一行改成set MODE=“standalone”

d.点击startup.cmd运行即可,如下即为成功:

在这里插入图片描述

e.访问localhost:8848即可 默认账号密码都是:nacos

四.项目案例


1.项目结构

在这里插入图片描述

account-service:负责对用户余扣减

business-service:负责完成下单的逻辑,包含 2 个主要的步骤,就是对库存服务和订单服务的远程调用

order-service:负责完成保存用户订单的操作

storage-service:负责完成对库存的扣减

2.各模块主要代码展示:

account-service

@Service

public class AccountServiceImpl implements AccountService {

@Autowired

private AccountTblMapper accountTblMapper ;

private static Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class) ;

@Transactional

@Override

public void debit(String userId, int money) {

logger.info(“开始扣减用户:{}的余额,数量为:{}”,userId ,money);

//1 查询数据库里面的账户

AccountTbl accountTbl = accountTblMapper.selectOne(new LambdaQueryWrapper().

eq(AccountTbl::getUserId, userId));

if(accountTbl==null){

throw new IllegalArgumentException(“此账号不存在”) ;

}

//2 扣减的操作

int idleMoney = accountTbl.getMoney() - money ;

// 3 库存的校验

if(idleMoney<0){

throw new RuntimeException(“库存不足”) ;

}

//4 设置到账户里面

accountTbl.setMoney(idleMoney);

//5 保存到数据库里里面

accountTblMapper.updateById(accountTbl) ;

if(“SXT_USER_2”.equals(userId)){

throw new RuntimeException(“不想成功”) ;

}

}

}

####Pom文件

com.baomidou

mybatis-plus-boot-starter

3.3.0

mysql

mysql-connector-java

business-service

@Service

public class BusinessServiceImpl implements BusinessService {

private static Logger logger = LoggerFactory.getLogger(BusinessServiceImpl.class) ;

@Autowired

private StorageServiceApi storageServiceApi ;

@Autowired

private OrderServiceApi orderServiceApi ;

@Override

public void purchase(String userId, String productNo, int count) {

logger.info(“准备下单,用户{},商品{},数量{}”,userId ,productNo ,count);

// 1 远程调用库存服务–> 库存的扣减f

storageServiceApi.deduct(productNo, count);

// 2 远程调用订单服务–>订单的新增

orderServiceApi.create(userId, productNo, count);

logger.info(“下单成功”);

}

}

####通过feign调用 代码:

OrderServiceApi

@Service

public class OrderServiceApi {

private static Logger logger = LoggerFactory.getLogger(OrderServiceApi.class) ;

// @Autowired

// private RestTemplate restTemplate ;

@Autowired

private OrderServiceFeign orderServiceFeign ;

public void create(String userId ,String productNo ,int count){

// ResponseEntity responseEntity = restTemplate.getForEntity(

// “http://order-service/create/{userId}/{productNo}/{count}”,

// Void.class,

// userId,

// productNo,

// count

// );

ResponseEntity responseEntity = orderServiceFeign.create(userId, productNo, count);

if(responseEntity.getStatusCode()== HttpStatus.OK){

logger.info(“远程调用订单服务成功”);

return;

}

throw new RuntimeException(“远程调用订单服务失败”) ;

}

}

StorageServiceApi

@Service

public class StorageServiceApi {

private static Logger logger = LoggerFactory.getLogger(StorageServiceApi.class) ;

// @Autowired

// private RestTemplate restTemplate ; //ribbon

@Autowired

private StorageServiceFeign storageServiceFeign ;

public void deduct(String productNo ,int count){

// ResponseEntity responseEntity = restTemplate.getForEntity(

// “http://storage-service/deduct/{productNo}/{count}”,

// Void.class,

// productNo,

// count

// );

ResponseEntity responseEntity = storageServiceFeign.deduct(productNo, count);

if(responseEntity.getStatusCode()== HttpStatus.OK){

logger.info(“远程调用库存服务成功”);

return;

}

throw new RuntimeException(“远程调用库存服务失败”);

}

}

###order-service

@Service

public class OrderServiceImpl implements OrderService {

@Autowired

private OrderTblMapper orderTblMapper ;

@Autowired

private AccountServiceApi accountServiceApi ;

private static Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class) ;

@Transactional

@Override

public OrderTbl createOrder(String userId, String productNo, int count) {

logger.info(“开始创建一个订单,用户为{},商品为{},数量为{}”,userId,productNo,count);

// 1 扣减用户的余额 account-service - >rpc

int money = cal(productNo,count) ;

ResponseEntity responseEntity = accountServiceApi.debit(userId, money);

if(responseEntity.getStatusCode()!= HttpStatus.OK){

throw new RuntimeException(“远程扣减用户的余额失败”) ;

}

//2 写本地的订单表

OrderTbl orderTbl = new OrderTbl();

orderTbl.setUserId(userId);

orderTbl.setCommodityCode(productNo);

orderTbl.setCount(count);

orderTblMapper.insert(orderTbl) ;

logger.info(“创建订单成功,用户为{},商品为{},数量{}”,userId,productNo,count);

return orderTbl;

}

/**

  • 计算商品的总价格

  • @param productNo

  • @param count

  • @return

*/

private int cal(String productNo, int count) {

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

image

image

image

image

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

@return

*/

private int cal(String productNo, int count) {

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

[外链图片转存中…(img-EcamS3Iq-1715469439514)]

[外链图片转存中…(img-jzGLVWG5-1715469439514)]

[外链图片转存中…(img-7g3iCZls-1715469439515)]

[外链图片转存中…(img-L1zdDS4K-1715469439515)]

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

[外链图片转存中…(img-c2vNq2a9-1715469439515)]

[外链图片转存中…(img-ZnZRHt3o-1715469439516)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[原网页] [置顶] 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦 [原网页] 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配 [原网页] 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离 [原网页] 数据挖掘中所需的概率论与数理统计知识、上 [原网页] 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法 [原网页] 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题) [原网页] 支持向量机通俗导论(理解SVM的三层境界) [原网页] 从决策树学习谈到贝叶斯分类算法、EM、HMM [原网页] 从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA [原网页] 程序员编程艺术第一~二十七章集锦与总结(教你如何编程),及PDF免分下载 [原网页] 教你如何迅速秒杀掉:99%的海量数据处理面试题 [原网页] 程序员编程艺术第二十七章:不改变正负数相对顺序重新排列数组(无解?) [原网页] 三五杆枪,可干革命,三五个人,可以创业 [原网页] Machine Learning读书会集锦(2013年4月14日第5期PPT教程已公布) [原网页] 结构之法算法之道blog博文集锦第6、第7期CHM文件0积分下载「07.30」 [原网页] 推荐引擎算法学习导论 [原网页] 程序员编程艺术第二十六章:基于给定的文档生成倒排索引(含源码下载) [原网页] 程序员编程艺术第二十五章:Jon Bentley:90%无法正确实现二分查找 [原网页] 编程艺术第二十三~四章十一续:杨氏矩阵查找,倒排索引关键词Hash编码 [原网页] 六之再续:KMP算法之总结篇(12.09修订,必懂KMP) [原网页] Nginx源码剖析之内存池,与内存管理 [原网页] 程序员编程艺术第一~二十二章集锦与总结(教你如何编程) [原网页] 从Trie树(字典树)谈到后缀树(10.28修订)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值