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.81.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.81.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
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习
还有更多学习笔记面试资料也分享如下:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
UP
discovery:
server-addr: 127.0.0.1:8848
alibaba:
seata:
tx-service-group: product_service_group
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-cDpxCTQe-1713298014304)]
[外链图片转存中…(img-U25OOHWd-1713298014304)]
[外链图片转存中…(img-RGMVaiqb-1713298014304)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习
还有更多学习笔记面试资料也分享如下:
[外链图片转存中…(img-0bREgQ1x-1713298014305)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!