Spring Boot 集成 Dubbo 实现多注册

86 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

在开始之前,我们需要了解Zookeeper框架和Dubbo框架,关于启动 ZooKeeper 服务部分省略。然后我们在终端下载Nacos,并且通过 cd nacos/bin bash startup.sh -m standalone启动 Nacos 服务

完成后目录是这样的

image.png image.png image.png image.png

关于Dubbo 实现多注册服务

Dubbo 支持同一服务向多个注册中心同时注册,也可以将不同的服务注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。目前 Dubbo 基本能支持市面上所有的注册中心:ZooKeeper、Nacos、Consul、Eureka、Redis 等等。但是在实际开发中,Dubbo 使用的注册中心大部分都是 ZooKeeper 和 Nacos。

步骤

  • 在父级项目 dubbo_parent_emp 的 pom.xml 文件中添加 Nacos 客户端依赖,如下所示👇:

    <!-- nacos-client -->
    <dependency>
      <groupId>com.alibaba.nacos</groupId>
      <artifactId>nacos-client</artifactId>
      <version>2.0.2</version>
    </dependency>
    
  • 在生产者工程 dubbo_provider_dept 的 application.yml 配置文件中配置 ZooKeeper 和 Nacos 服务地址,具体配置如下所示👇:

image.png

✨说明:同时配置了 ZooKeeper 和 Nacos 的地址。

  • 在生产者工程 dubbo_provider_dept 的 DeptServiceImpl 类的注解 @DubboService 中指定需要注册的名称,具体代码如下所示👇:
   import org.apache.dubbo.config.annotation.DubboService;
   import org.yamiya.mapper.DeptMapper;
   import org.yamiya.pojo.Dept;
   import org.springframework.beans.factory.annotation.Autowired;

   import java.util.List;

   @DubboService(registry = {"zookeeper","nacos"})
   public class DeptServiceImpl implements DeptService {

       @Autowired
       private DeptMapper deptMapper;

       @Override
       public List<Dept> selectAllDept() {
           return deptMapper.selectList(null);
       }

       @Override
       public Dept selectDeptByDNo(Integer dNo) {
           return deptMapper.selectById(dNo);
       }
   }

@DubboService 注解可以将服务注册到注册中心中。如果想将同一个服务注册到各个不同的注册中心中,@DubboService 中不加参数即可;如果想将服务注册一个或某几个注册中心,可以使用 @DubboService(registry = {"zookeeper","nacos"}) 这种方式,这里的 "zookeeper","nacos" 对应配置文件中自定义的名称。

  • 在消费者工程 dubbo_consumer_dept 的 application.yml 配置文件中配置 ZooKeeper 和 Nacos 服务地址,具体配置如下所示👇:

image.png

  • 在消费者者工程 dubbo_consumer_dept 的 DeptController 类的注解 @DubboReference 中指定注册中心的名字,具体代码如下所示👇:

    import org.apache.dubbo.config.annotation.DubboReference;
    import org.yamiya.pojo.Dept;
    import org.yamiya.service.DeptService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/consumer")
    public class DeptController {
    
        @DubboReference(registry={"zookeeper","nacos"})
        private DeptService deptService;
    
        /**
         * 查询所有部门信息
         * @return
         */
        @GetMapping("/findAllDept")
        public List<Dept> findAllDept(){
            return deptService.selectAllDept();
        }
    
        /**
         * 根据编号查询一个部门信息
         * @return
         */
        @GetMapping("/findDeptByDno")
        public Dept findDeptByDno(Integer dNo){
            return deptService.selectDeptByDNo(dNo);
        }
    }
    

启动服务测试

在前面我们已经实现了所有的业务代码,接下来我们就启动服务来进行测试。

  • 配置 Nginx 并启动,具体操如下所示:

    a. 在终端执行以下命令打开 default.conf 文件:

    sudo vi /etc/nginx/conf.d/default.conf
    

    b. 打开文件以后进行相关配置

    c. 使用 sudo nginx 启动 Nginx

  • 打包运行项目

    a. 进入 dubbo_parent_emp 目录下,进行 install 操作,如下所示:

    cd /dubbo_parent_emp
    mvn clean
    mvn install
    

    b. 在进入 dubbo_provider_dept 目录下,启动项目,如下所示:

    cd /dubbo_parent_emp/dubbo_provider_dept
    mvn spring-boot:run
    

    c. 在进入 dubbo_consumer_dept 目录下,启动项目,如下所示:

    cd /dubbo_parent_emp/dubbo_consumer_dept
    mvn spring-boot:run
    

    ✨说明:项目启动的过程中出现以下错误,但并不影响程序运行:

    图片描述

    原因可能是导入的 nacos 中包中没有加入 naming 这个包,目前官方未给出解决方案。

  • 访问 http://xxx/nacos,结果如下图所示:

image.pngimage.png

访问接口 http://xxx/consumer/findAllDept,返回结果如下所示:

图片描述