介绍

Nacos 是阿里巴巴开源的动态服务发现、配置管理和服务共享平台,天生适配微服务架构,兼具注册中心与配置中心两大核心能力,支持配置热更新、多环境隔离、配置共享,是 Spring Cloud 生态的标准组件之一。

Dubbo 是一款高性能、轻量级的Java RPC 远程服务调用框架,专注于微服务间的透明化通信,提供服务注册发现、负载均衡、流量管控、服务治理等企业级能力,是国内分布式系统中应用最广泛的 RPC 框架。

Dubbo
RPC 框架,专注服务间高性能、透明化远程方法调用。
统一注册中心(服务注册 / 发现)+配置中心(配置集中管理、共享、热更新)。
像调用本地方法一样调用远程服务,底层屏蔽网络细节。

OpenFeign
声明式 HTTP 客户端,基于 Spring Cloud 生态,简化 RESTful 服务调用。
依赖 Nacos/Eureka 等做服务发现,自身无注册能力。
通过注解定义接口,自动生成 HTTP 请求,面向资源(REST)调用。

两者区别
在这里插入图片描述
Dubbo 上手复杂,约束多、配置繁琐,排错成本高,但好在性能强;
OpenFeign 简单易用,基于 HTTP,学习成本极低,但性能较差,高并发不友好。


Nacos配置文件共享

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2c74b860a4734a98b70fdd1806b31ab0.png

redis.yaml

spring:
  # Redis 配置
  redis:
    # Redis服务器地址
    host: 172.23.4.131
    # Redis端口
    port: 6379
    # Redis密码(无密码则注释/空字符串)
    password: 123456
    # Redis数据库索引(默认0)
    database: 0
    # 连接超时时间
    timeout: 10s
    # lettuce 连接池配置
    lettuce:
      pool:
        # 最大连接数
        max-active: 8
        # 最大空闲连接
        max-idle: 8
        # 最小空闲连接
        min-idle: 2
        # 连接等待时间(-1无限制)
        max-wait: -1ms

dubbo.yaml

dubbo:
  application:
    name: ${spring.application.name}
  protocol:
    name: dubbo # 通信协议
    port: -1 # 端口自动分配(避免冲突)
  registry:
    address: nacos://172.23.4.131:8848 # Nacos 注册中心地址
    parameters:
      username: nacos
      password: 123456
  scan:
    base-packages: com.dubbo.**.service.impl # 扫描 Dubbo 服务实现类的包

项目结构

dubbo-demo/
├── pom.xml # 父工程:统一版本、依赖管理
├── dubbo-common/ # 通用工具模块:全局异常、工具类、配置、常量
├── dubbo-api/ # 公共接口模块:RPC接口、DTO、枚举
├── dubbo-provider/ # 服务提供者:接口实现、数据库、Redis
└── dubbo-consumer/ # 服务消费者:Controller、调用RPC服务
└── dubbo-entity/ # 实体类


父模块依赖管理

pom.xml (父模块)

    <!-- ===================== Spring Boot 父依赖 ===================== -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.15</version>
        <relativePath/>
    </parent>

 <!-- ===================== 全局版本号统一管理 ===================== -->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>

        <!-- 第三方工具版本 -->
        <fastjson2.version>2.0.53</fastjson2.version>

        <!-- Spring Cloud Alibaba & Cloud 版本(Spring Boot 2.6.x 兼容版) -->
        <cloud-alibaba.version>2021.1</cloud-alibaba.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
    </properties>

    <!-- ===================== 版本锁定:只声明不依赖 ===================== -->
    
    <!-- 作用:子模块引入时无需写版本号,统一管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud Alibaba 版本(Nacos + Dubbo 依赖) -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud 版本 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- fastjson2 工具包 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson2.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

定义公共实体类模块API

dubbo-api

public interface IHelloDubboService {
    /**
     * 简单问候服务接口
     * @param name 用户名
     * @return 远程调用返回的问候结果
     */
    String sayHello(String name);
}

所有的实体类和接口都存放到这个模块当中


Nacos服务注册

在这里插入图片描述


生产者提供服务

dubbo-provider

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 继承父工程:统一版本管理、SpringBoot、SpringCloud -->
    <parent>
        <groupId>org.dubbo.test</groupId>
        <artifactId>dubbo-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- 当前支付服务模块信息 -->
    <groupId>com.dubbo.payment</groupId>
    <artifactId>payment-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>payment-service</name>
    <description>支付服务:提供支付相关的接口与实现</description>

    <!-- 版本定义 -->
    <properties>
        <dubbo.version>3.0.9</dubbo.version>
        <nacos-client.version>2.0.4</nacos-client.version>
    </properties>

    <dependencies>
        <!-- 公共工具模块:全局工具类、配置、通用常量 -->
        <dependency>
            <groupId>com.common</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!-- 公共实体模块:DTO、实体类、枚举 -->
        <dependency>
            <groupId>org.dubbo.entiry</groupId>
            <artifactId>entiry</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

        <!-- Dubbo SpringBoot Starter:Dubbo 核心启动器 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <!-- Dubbo 注册中心适配:对接 Nacos 注册中心 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <!-- Nacos 客户端:服务注册与发现底层依赖 -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>${nacos-client.version}</version>
        </dependency>

        <!-- Nacos 配置中心:统一管理配置文件 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- 用于加载 bootstrap.yaml 配置文件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

    </dependencies>

</project>

本地配置文件 application.yaml

server:
  port: 8081

配置文件共享bootstrap.yaml

spring:
  application:
    name: dubbo-provider-demo

  cloud:
    nacos:
      server-addr: 172.23.4.131:8848 #注册中心
      username: nacos      # 你的Nacos账号
      password: 123456      # 你的Nacos密码
      config:
        file-extension: yaml #nacos上选择的格式
        shared-configs:  #共享配置
          - data-id: redis.yaml  #redis配置
          - data-id: dubbo.yaml  #dubbo配置

生产者接口具体实现

@DubboService()
public class HelloDubboServiceImpl implements IHelloDubboService {
    
    @Override
    public String sayHello(String name) {
        return "调用成功!!";
    }
    
}

服务消费者

依赖

<dependencies>

    <!-- SpringBoot Web 核心:提供Web服务、MVC功能 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Dubbo Spring Boot 整合 Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>${dubbo.version}</version>
    </dependency>

    <!-- Dubbo Nacos 注册中心适配 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-registry-nacos</artifactId>
        <version>${dubbo.version}</version>
    </dependency>

    <!-- Nacos Client -->
    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>${nacos-client.version}</version>
    </dependency>

    <dependency>
        <groupId>org.dubbo.entiry</groupId>
        <artifactId>entiry</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

    <!-- Nacos 配置中心 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <!--用于加载 bootstrap 配置 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>

    <!--nacos 服务的注册发现-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

</dependencies>

本地配置文件application.yaml

server:
  port: 8080

配置文件共享bootstrap.yaml

spring:
  application:
    name: dubbo-consumer-demo

  cloud:
    nacos:
      server-addr: 172.23.4.131:8848 #注册中心
      username: nacos      # 你的Nacos账号
      password: 123456      # 你的Nacos密码
      config:
        file-extension: yaml #nacos上选择的格式
        shared-configs:  #共享配置
          - data-id: redis.yaml
          - data-id: dubbo.yaml

服务调用

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

    @DubboReference()
    private  IHelloDubboService dubboService;

    @GetMapping
    public String test(){
        return   dubboService.sayHello("您好");
    }
}

返回结果

调用成功!!

服务的版本控制

提供者接口

public interface UserService {
    String getUserInfo();
}

服务实现

@DubboService(version = "1.0.0")
public class UserServiceImplV1 implements UserService {
    @Override
    public String getUserInfo() {
        return "我是 V1.0.0 版本的用户信息";
    }
}

服务调用

    @DubboReference(version = "1.0.0")
    private UserService userServiceV1;

    @GetMapping("/v1")
    public String testV1() {
        return userServiceV1.getUserInfo(); 
    }

超时与重试

超时配置

@DubboService(timeout = 3000)
public class HelloDubboServiceImpl implements IHelloDubboService {

    @Override
    public String sayHello(String name) {
        return "调用成功!!";
    }

}

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

    @DubboReference(timeout = 3000)
    private  IHelloDubboService dubboService;

    @GetMapping
    public String test(){
        return   dubboService.sayHello("您好");
    }
}

以上两种超时方式二选一

重试

@DubboService(timeout = 3000,retries = 3)
public class HelloDubboServiceImpl implements IHelloDubboService {

    @Override
    public String sayHello(String name) {
        return "调用成功!!";
    }

}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐