2.1.2.eshop-stock-service
我们把原来eshop-stock的相关业务代码都改到了这个module里。
同时,为了实现RPC服务的提供,我们需要:
- 导入依赖:主要需要导入两个依赖
dubbo
的依赖,和eshop-stock-api
接口声明的依赖,这里的 设置为compile,这样我们在编译eshop-stock-service的时候,也会编译相应的api依赖。
com.alibaba.cloud
spring-cloud-starter-dubbo
cn.fighter3
eshop-stock-api
1.0-SNAPSHOT
compile
StockApiServiceImpl.java
:创建一个类,实现api中声明的接口,其中@Service
是Dubbo提供的注解,表示当前服务会发布成一个远程服务,不要和Spring提供的搞混。
/**
-
@Author 三分恶
-
@Date 2021/11/14
-
@Description 库存服务提供RPC接口实现类
*/
@org.apache.dubbo.config.annotation.Service
@Slf4j
public class StockApiServiceImpl implements StockApiService {
@Autowired
private ShopStockMapper stockMapper;
/**
-
添加库存
-
@param stockAddDTO
-
@return
*/
@Override
public Integer addStock(StockAddDTO stockAddDTO) {
ShopStock stock = new ShopStock();
stock.setGoodsId(stockAddDTO.getGoodsId());
stock.setInventory(stockAddDTO.getAccount());
log.info(“准备添加库存,参数:{}”, stock.toString());
this.stockMapper.insert(stock);
Integer stockId = stock.getStockId();
log.info(“添加库存成功,stockId:{}”, stockId);
return stockId;
}
/**
-
获取库存数量
-
@param goodsId
-
@return
*/
@Override
public Integer getAccountById(Integer goodsId) {
ShopStock stock = this.stockMapper.selectOne(Wrappers.lambdaQuery().eq(ShopStock::getGoodsId, goodsId));
Integer account = stock.getInventory();
return account;
}
}
- 远程调用配置:我们需要在
applicantion.yml
中进行dubbo相关配置,由于在之前,我们已经集成了nacos作为注册中心,所以一些服务名、注册中心之类的就不用配置。完整配置如下:
数据源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop_stock?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: root
password: root
application:
name: stock-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8050
dubbo相关配置
dubbo:
scan:
dubbo服务实现类的扫描基准包路径
base-packages: cn.fighter3.serv.service.impl
#Dubbo服务暴露的协议配置
protocol:
name: dubbo
port: 1
我们的商品服务作为服务的消费者,为了后续开发的考虑,我也类似地把eshop-goods
拆成了两个子moudule,服务消费放在了eshop-goods-service
里。
- 引入依赖:引入两个依赖
dubbo
和eshop-stock-api
,因为在一个工程里,所以对api的依赖同样用了为compile的方式,在实际的业务开发中,通常会把服务提供者的api打包上传到私服仓库,然后服务消费者依赖api包,这样就可以直接调用api包里定义的方法。
com.alibaba.cloud
spring-cloud-starter-dubbo
cn.fighter3
eshop-stock-api
1.0-SNAPSHOT
compile
- 远程调用:使用
@Reference
注入相应的service,就可以像调用本地jar包一样,调用远程服务。
ShopGoodsServiceImpl.java:
@Service
@Slf4j
public class ShopGoodsServiceImpl extends ServiceImpl<ShopGoodsMapper, ShopGoods> implements IShopGoodsService {
@org.apache.dubbo.config.annotation.Reference
StockApiService stockApiService;
/**
-
添加商品
-
@param goodsAddDTO
-
@return
*/
public CommonResult addGoods(GoodsAddDTO goodsAddDTO) {
ShopGoods shopGoods = new ShopGoods();
BeanUtils.copyProperties(goodsAddDTO, shopGoods);
this.baseMapper.insert(shopGoods);
log.info(“添加商品,商品主键:{}”, shopGoods.getGoodsId());
log.info(shopGoods.toString());
StockAddDTO stockAddDTO = StockAddDTO.builder().goodsId(shopGoods.getGoodsId()).account(goodsAddDTO.getAccount()).build();
log.info(“准备添加库存,参数:{}”, stockAddDTO.toString());
Integer stockId = this.stockApiService.addStock(stockAddDTO);
log.info(“添加库存结束,库存主键:{}”, stockId);
return CommonResult.ok();
}
/**
-
获取商品
-
@param goodsId
-
@return
*/
public CommonResult getGoodsById(Integer goodsId) {
GoodsVO goodsVO = new GoodsVO();
//获取商品基本信息
ShopGoods shopGoods = this.baseMapper.selectById(goodsId);
BeanUtils.copyProperties(shopGoods, goodsVO);
//获取商品库存数量
Integer account = this.stockApiService.getAccountById(goodsId);
log.info(“商品数量:{}”, account);
goodsVO.setAccount(account);
return CommonResult.ok(goodsVO);
}
}
- 相关配置:需要在
applicantion.yml
里进行配置,主要配置了要订阅的服务名。完整配置:
数据源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop_goods?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: root
password: root
application:
name: goods-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 8020
#dubbo配置
#要订阅的服务名,多个用,隔开
dubbo:
cloud:
subscribed-services: stock-service
- 依次启动
Nacos-Server
,库存服务
,商品服务
,可以看到Nacos服务列表里有两个服务
- 打开我们商品服务的knife4j接口http://localhost:8020/doc.html,调试添加商品接口
- 上图可以看到,接口响应成功,查看控制台日志,发现发生了远程调用,查看数据库,发现商品库和库存库都新增了数据
到此,我们一个简单的Dubbo远程调用就完成了。
=======================================================================
在Feign的使用中,它自身集成了Ribbon实现客户端负载均衡,还需要额外继承Hystrix来实现熔断,我们接下来看看类似的一些能力Dubbo是怎么做的。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/f61c8d36860587fc9699522de397d38d.jpeg)
最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
[外链图片转存中…(img-HB6tnapf-1712685743350)]
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!