携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
在开始之前,我们需要了解Zookeeper框架和Dubbo框架,关于启动 ZooKeeper 服务部分省略。然后我们在终端下载Nacos,并且通过 cd nacos/bin bash startup.sh -m standalone启动 Nacos 服务
完成后目录是这样的
关于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 服务地址,具体配置如下所示👇:
✨说明:同时配置了 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 服务地址,具体配置如下所示👇:
-
在消费者者工程
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.confb. 打开文件以后进行相关配置
c. 使用 sudo nginx 启动 Nginx
-
打包运行项目
a. 进入
dubbo_parent_emp目录下,进行 install 操作,如下所示:cd /dubbo_parent_emp mvn clean mvn installb. 在进入
dubbo_provider_dept目录下,启动项目,如下所示:cd /dubbo_parent_emp/dubbo_provider_dept mvn spring-boot:runc. 在进入
dubbo_consumer_dept目录下,启动项目,如下所示:cd /dubbo_parent_emp/dubbo_consumer_dept mvn spring-boot:run✨说明:项目启动的过程中出现以下错误,但并不影响程序运行:
原因可能是导入的 nacos 中包中没有加入 naming 这个包,目前官方未给出解决方案。
-
访问
http://xxx/nacos,结果如下图所示:
访问接口 http://xxx/consumer/findAllDept,返回结果如下所示: