SpringBoot整合Nacos和Dubbo

本文介绍如何使用SpringBoot结合Nacos和Dubbo搭建微服务架构,包括安装Nacos、配置服务注册与发现、编写服务提供者及消费者代码等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot整合Nacos和Dubbo


前言

      在分布式微服务框架中,比较重要的就是远程方法调用了,阿里巴巴推出的Nacos+Dubbo框架是一种很不错的解决方案,其中Nacos不但可以作为注册中心,还可以作为配置中心,并且Dubbo也内置了几种很不错的负载均衡算法,这二者的组合可以取得不错的效果,目前也是一种主流的分布式微服务中间件。
      我之前就写过一篇类似的文章,方法和过程都差不多,感兴趣的话可以瞅一眼,Nacos实现服务注册与消费(传送门)。现在重新整理一下,以供参考。
       本文完整代码可见:https://github.com/BraisedPanda/xiqing-study-project.git


一、 Nacos安装

Nacos安装与启动直接去看官方文档就行,那里有最新的Nacos安装包,Nacos官方文档
安装完运行后,输入http://ip地址:8848/nacos/#/login,就可以进入登录界面了,用户名和密码默认都是nacos
在这里插入图片描述
这是登录后的页面,常用的界面就是配置中心以及注册中心了。
在这里插入图片描述

二、 SpringBoot整合Nacos和Dubbo

1. 添加依赖

首先第一步当然是添加相关的依赖了,网上添加Nacos和Dubbo的依赖多种多样,这里提供一下我依赖的maven配置,这里需要注意下nacos和dubbo的对于版本,版本不对可能会造成项目的启动失败。

        <!-- nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.0.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>3.0.2.1</version>
        </dependency>

2. 编写配置文件内容

       接下来就是编写配置文件,注明Nacos和Dubbo的地址、命名空间和应用名称等信息,这里有个坑,建议把这些配置写入bootstrap.yaml文件中,否则可能会造成服务无法注册在正确的地址上。这个坑可以看我之前记录的文章,Nacos配置了远程地址,项目启动时却一直连接本地问题解决方法


2.1 服务结构说明

       微服务中一般分为服务消费者与服务提供者,通常来讲,服务消费者一般是请求的入口,集成了大量的controller,请求通过controller调用服务提供者提供的service接口,请求数据。因此,服务提供者与服务消费者的配置文件也稍微不同(不同之处主要在于消费者需要配置提供者的服务名称)。

在这里插入图片描述

2.2 服务提供者

bootstrao.yaml文件内容

spring:
  application:
    # 服务提供者的名称
    name: xiqing-study-project-user-provider
  cloud:
    nacos:
      discovery:
      	# 启动Nacos的地址
        server-addr: 47.100.160.xx:8848
        # 在Nacos页面建的命名空间
        namespace: 56d98d62-6bbf-46d8-8e2a-f52c49c4798d
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        group: provider
        namespace: ${spring.cloud.nacos.discovery.namespace}
        file-extension: yaml


server:
  port: 8000

mybatis:
  mapper-locations:
    classpath: /mapper/*.xml

application.properties文件内容

dubbo.scan.base-packages=com.xiqing.study.project.user.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=nacos://47.100.160.xx:8848
dubbo.provider.loadbalance=leastactive
#dubbo.provider.actives=8
#dubbo.provider.executes=8
dubbo.provider.dispatcher=message
dubbo.provider.threadpool=cached
dubbo.provider.timeout=60000
dubbo.provider.delay=-1
dubbo.application.dump-directory=/tmp



mapper.before=true
mybatis.mapper-locations=classpath*:/mapper/**Mapper.xml
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

2.3 服务消费者

bootstrao.yaml文件内容

spring:
  application:
     # 服务消费者的名称
    name: xiqing-study-project-web
  cloud:
    nacos:
      discovery:
        server-addr: 47.100.160.xx:8848
        namespace: 56d98d62-6bbf-46d8-8e2a-f52c49c4798d
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        group: consumer
        namespace: ${spring.cloud.nacos.discovery.namespace}
        file-extension: yaml

server:
  port: 8080

mybatis:
  mapper-locations:
    classpath: /mapper/*.xml

application.properties文件内容

# 服务消费者订阅服务提供者的名称,多个用逗号隔开
dubbo.cloud.subscribed-services=xiqing-study-project-user-provider
dubbo.registry.address=nacos://47.100.160.xx:8848
dubbo.consumer.check=false
dubbo.registry.check=false
dubbo.consumer.actives=20


mapper.before=true
mybatis.mapper-locations=classpath*:/mapper/**Mapper.xml
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3. 创建服务提供者与消费者代码

其实这个代码就是平常写的代码,唯一有区别的就是在service类的注解使用

@DubboService(version = “1.0”) (替换之前的service注解@service)

,版本号是自定义的,可不加,controller类的注解使用

@DubboReference(version = “1.0”) (替换之前其他类的注解@Autowired)

这样就可以和调用本地方法一样,调用远程的服务。

3.1 服务提供者部分代码

package com.xiqing.study.project.user.service;

import com.xiqing.project.redis.RedisUtil;
import com.xiqing.study.project.base.model.DataResponseBean;
import com.xiqing.study.project.domain.po.People;
import com.xiqing.study.project.domain.po.PeopleExample;
import com.xiqing.study.project.user.mapper.PeopleMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
@DubboService(version = "1.0")
public class PeopleServiceImpl implements PeopleService{

    @Autowired
    private PeopleMapper peopleMapper;
    @Autowired
    private RedisUtil redisUtil;

    @Override
    public DataResponseBean<List<People>> selectAll() {
        PeopleExample peopleExample = new PeopleExample();
        List<People> list = peopleMapper.selectByExample(peopleExample);
        return DataResponseBean.SUCCESS(list);
    }


    @Override
    public DataResponseBean<People> selectById(Integer id) {
        People people = (People) redisUtil.get(id.toString());
        if(people == null){
            people = peopleMapper.selectByPrimaryKey(id);
            redisUtil.set(id.toString(), people);
        }
        return DataResponseBean.SUCCESS(people);
    }
}

3.2 服务消费者部分代码

package com.xiqing.study.project.web.controller;

import com.xiqing.study.project.base.model.DataResponseBean;
import com.xiqing.study.project.domain.po.People;
import com.xiqing.study.project.user.service.PeopleService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @DubboReference(version = "1.0")
    private PeopleService peopleService;

    @RequestMapping("/test")
    public DataResponseBean<List<People>> test(){
        return peopleService.selectAll();
    }

    @GetMapping("/{id}")
    public DataResponseBean<People> selectById(@PathVariable Integer id){
        return peopleService.selectById(id);
    }

}

三、 项目启动

依次启动服务提供者与消费者,可以在Nacos页面中看到,这两个服务已经注册上去了。
在这里插入图片描述
使用postman测试,可以发现服务可以正常调用。
在这里插入图片描述


在这里插入图片描述

总结

以上就是文本的内容,Nacos和Dubbo主要功能是实现服务注册与发现的,类似的框架有zookeeper和Feign,后续的文章会介绍自定义redis的starter类。
### Spring Boot 中集成 Nacos Dubbo 实现服务注册与发现以及远程调用 在 Spring Boot 项目中,通过整合 Dubbo Nacos 可以实现高效的服务注册与发现机制,并支持基于 RPC 的远程方法调用。以下是具体的技术细节配置说明。 #### 1. 添加依赖项 为了使 Spring Boot 支持 Dubbo Nacos 功能,在 `pom.xml` 文件中需引入必要的 Maven 依赖: ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.x.x</version> </dependency> <!-- Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.x.x</version> </dependency> </dependencies> ``` 以上依赖分别用于初始化 Spring Boot 应用程序、启用 Dubbo 功能支持 Nacos 注册中心[^1]。 --- #### 2. 配置文件设置 在项目的 `application.properties` 或 `application.yml` 文件中完成基础配置: ##### application.yml 示例: ```yaml server: port: 8080 spring: cloud: nacos: discovery: namespace: ${your_namespace_id} # 替换为实际的命名空间 ID server-addr: localhost:8848 # Nacos Server 地址 dubbo: scan: base-packages: com.example.service.impl # 扫描提供者接口所在的包路径 protocol: name: dubbo # 使用的协议名称 port: -1 # 自动分配端口号 registry: address: nacos://localhost:8848 # 将 Dubbo 服务挂载至 Nacos 注册中心 ``` 这些参数定义了服务运行环境中的核心属性,包括 Nacos 连接地址服务扫描范围等[^4]。 --- #### 3. 创建 Provider (服务提供方) 创建一个简单的 Dubbo 接口及其对应的实现类: ##### 定义接口 (`IDemoService.java`): ```java package com.example.api; import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.rpc.RpcContext; public interface IDemoService { String sayHello(String name); } ``` ##### 提供者实现类 (`DemoServiceImpl.java`): ```java package com.example.service.impl; import com.example.api.IDemoService; import org.apache.dubbo.config.annotation.Service; @Service(version = "1.0.0") // 标记此方法为 Dubbo 服务 public class DemoServiceImpl implements IDemoService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 上述代码片段展示了如何利用注解方式快速暴露 Dubbo 方法给消费者访问[^2]。 --- #### 4. 构建 Consumer (服务消费方) 同样地,在另一个模块或者同一工程下编写客户端逻辑来调用已发布的服务实例。 ##### 引入目标接口并发起请求: ```java package com.example.consumer; import com.example.api.IDemoService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @Reference(version = "1.0.0", check = false) private IDemoService demoService; @GetMapping("/hello") public String callRemote(@RequestParam String name) { return this.demoService.sayHello(name); // 跨进程调用远端业务功能 } } ``` 此处的关键在于使用 `@Reference` 来标注需要注入的目标对象类型及版本号信息[^5]。 --- #### 5. 启动流程概述 确保本地已经安装好 Nacos 并正常工作之后,按照如下顺序操作即可验证整个链路是否通畅: 1. **启动 Nacos**: 如果尚未部署,则执行命令 `docker-compose -f zookeeper.yml up` 初始化容器化环境; 2. **依次开启 Producer Consumer 工程**:观察控制台日志确认双方均成功连接上指定的注册中心节点; 3. 测试 API 请求效果:打开浏览器输入 URL 如 http://localhost:8080/hello?name=Dubbo 得到预期响应数据即表明搭建完毕。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值