SpringCloud Alibaba实战(12:引入Dubbo实现RPC调用)

这是Dubbo官网对Dubbo的简介,Dubbo在国内是应用非常广泛的服务治理框架,曾经一度停更,后来又重新维护,并从Apache毕业。

在这一节里,我们主要关注它的RPC通信的能力。

这里再额外提一个老生常谈的问题,Dubbo和我们前面用的Feign的区别:

Dubbo和Feign主要区别

Dubbo在性能上有优势,Feign使用起来更便捷,接下来,我们来一步步学习Dubbo的使用。

2.Dubbo基本使用

=======================================================================

在前面我们使用Feign远程调用实现了一个业务添加商品,接下来,我们把它改造成基于Dubbo远程调用实现。

Dubbo远程调用实现增加库存

2.1.服务提供者


我们将原来的eshop-stock拆成两个子module,eshop-stock-apieshop-stock-service,其中eshop-stock-api是主要是RPC接口的定义,eshop-stock-service则是完成库存服务的主要业务。

stock拆分

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

2.2.服务消费者


我们的商品服务作为服务的消费者,为了后续开发的考虑,我也类似地把eshop-goods拆成了两个子moudule,服务消费放在了eshop-goods-service里。

eshop-goods拆分

  • 引入依赖:引入两个依赖dubboeshop-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

2.3.调试


  • 依次启动Nacos-Server库存服务商品服务,可以看到Nacos服务列表里有两个服务

Nacos注册中心

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
外链图片转存中…(img-jNxdztuR-1713416623820)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后的话

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。
同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!

部分截图:
[外链图片转存中…(img-TKwMv4iz-1713416623820)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值