这是Dubbo官网对Dubbo的简介,Dubbo在国内是应用非常广泛的服务治理框架,曾经一度停更,后来又重新维护,并从Apache毕业。
在这一节里,我们主要关注它的RPC通信的能力。
这里再额外提一个老生常谈的问题,Dubbo和我们前面用的Feign的区别:
Dubbo在性能上有优势,Feign使用起来更便捷,接下来,我们来一步步学习Dubbo的使用。
=======================================================================
在前面我们使用Feign远程调用实现了一个业务添加商品
,接下来,我们把它改造成基于Dubbo远程调用实现。
我们将原来的eshop-stock
拆成两个子module,eshop-stock-api
和eshop-stock-service
,其中eshop-stock-api
是主要是RPC接口的定义,eshop-stock-service
则是完成库存服务的主要业务。
2.1.1.eshop-stock-api
- 依赖引入,eshop-stock-api主要是接口和实体类的定义,所以只需要引入对common包的依赖和lombok的依赖
cn.fighter3
eshop-common
1.0-SNAPSHOT
org.projectlombok
lombok
true
- 接口和实体定义
StockApiService.java
:这个接口定义了两个方法,在哪实现呢?往后看。
/**
-
@Author 三分恶
-
@Date 2021/11/14
-
@Description 对外RPC接口定义
*/
public interface StockApiService {
/**
-
添加库存
-
@param stockAddDTO
-
@return
*/
Integer addStock(StockAddDTO stockAddDTO);
/**
-
根据商品ID获取库存量
-
@param goodsId
-
@return
*/
Integer getAccountById(Integer goodsId);
}
StockAddDTO.java
:添加库存实体类
/**
-
@Author: 三分恶
-
@Date: 2021/5/26
-
@Description:
**/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
public class StockAddDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
- 商品主键
*/
private Integer goodsId;
/**
- 数量
*/
private Integer account;
}
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服务列表里有两个服务
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
60bfd66b1b56fcd9820186d.png)
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-ncEhoSIB-1715079300853)]
[外链图片转存中…(img-dWDPLGDc-1715079300854)]
[外链图片转存中…(img-K9C6sroQ-1715079300855)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!