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

慈云数据 2024-04-27 技术支持 41 0

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拆分

              • 引入依赖:引入两个依赖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 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注册中心

                          • 打开我们商品服务的knife4j接口http://localhost:8020/doc.html,调试添加商品接口

                            接口调试

                            • 上图可以看到,接口响应成功,查看控制台日志,发现发生了远程调用,查看数据库,发现商品库和库存库都新增了数据

                              控制台日志

                              到此,我们一个简单的Dubbo远程调用就完成了。

                              3.Dubbo进阶使用

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

                              在Feign的使用中,它自身集成了Ribbon实现客户端负载均衡,还需要额外继承Hystrix来实现熔断,我们接下来看看类似的一些能力Dubbo是怎么做的。

                              3.1.集群容错


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

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

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

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

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

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

                              img

                              最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

                              《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!

                              习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

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

                              img

                              [外链图片转存中…(img-Iq2oyhBR-1711827076177)]

                              最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

                              [外链图片转存中…(img-YbzqzT4N-1711827076177)]

                              《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon