Java-72 深入浅出 RPC Dubbo 上手 生产者模块详解

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年07月10日更新到:
Java-68 深入浅出 分布式服务 Netty实现自定义RPC 附详细代码

MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

API 模块

已经在上节完成了,这节我们进行生产者模块的编写。

生产者模块

定位:Dubbo Producer 指"服务提供者",负责实现业务接口并通过 Dubbo 框架 导出(export) 到注册中心/配置中心,使消费方 (Consumer) 能透明调用。

角色与职责

  • 接口实现:把 业务接口 的 Java 实现类暴露成远程服务,@DubboService, ServiceConfig
  • 协议暴露:把接口转成可远程调用的 Protocol + Serialization,dubbo, tri, rest, Hessian2、Protobuf、JSON 等
  • 注册治理:向 Registry 报到、续租、下线,ZooKeeper / Nacos / etcd / Consul
  • 运行时资源:管理线程池、连接池、序列化缓冲,ExecutorRepository, ChannelPool
  • 服务治理:版本 (version)、分组 (group)、权重 (weight)、限流、熔断,ServiceConfig, dubbo:service 标签

关键组件

  • 线程池:处理业务方法调用;默认 FixedThreadPool + Queue,大流量接口自定义"隔离线程池",避免阻塞全局
  • 序列化 (Serialization SPI):对象 ↔ ByteBuf;默认 Hessian2,建议换 Protobuf/FST/Kryo 提升 20-50 % 吞吐;注意兼容性
  • 连接池 (ChannelPool):长连接复用,默认 lazyInit + heartbeat,打开 telnet ip port status 查看链接数;合理设置 connections
  • 过滤器 (Filter SPI):服务端链式拦截:日志、权限、限流、灰度,自定义时避免耗时操作;链路打点要加 try-catch
  • Wrapper / Javassist:免反射提升性能,大量 provider 时避免频繁 classloader 创建

POM

新建一个模块,这里叫:wzk-producer

我们依赖刚才的 wzk-service-api 的 API 模块:

xml 复制代码
<?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>
    <parent>
        <groupId>icu.wzk</groupId>
        <artifactId>dubbo-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>wzk-producer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>icu.wzk</groupId>
            <artifactId>wzk-service-api</artifactId>
        </dependency>
    </dependencies>

</project>

生产者定义

编写实现类,注意Dubbo也使用了 Service注解来表明是一个服务的提供者:

java 复制代码
package icu.wzk.service.impl;

import icu.wzk.service.WzkHelloService;
import org.apache.dubbo.config.annotation.Service;


@Service
public class WzkHelloServiceImpl implements WzkHelloService {

    @Override
    public String sayHello(String name) {
        return "hello ? " + name;
    }
}

对应的代码如下所示:

配置文件

编写配置文件,用于配置 Dubbo,写入到 resource 目录下,比如配置文件叫:

shell 复制代码
dubbo-provider.properties

对应的内容如下:

shell 复制代码
dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

doubbo.application.name 服务的名称

dubbo.protocol.name 对外提供服务的协议

● dubbo.protocol.port 对外提供服务的端口

对应的内容如下所示:

配置类

我们需要编写一个配置类,来让这个类处理注册和扫描配置文件:

java 复制代码
package icu.wzk.config;


import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


@Configuration
@EnableDubbo(scanBasePackages = "icu.wzk.service.impl")
@PropertySource("classpath:/dubbo-provider.properties")
public class ProviderConfiguration {

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://10.10.52.38:2181");
        return registryConfig;
    }

}

对应的内容如下:

最后概览

最后我们可以看一下整体项目的结构,如下所示:

Spring Boot 示例

PS:这里只做参考,用作如果你要集成进 Spring Boot 的话

java 复制代码
// 1. 业务接口
public interface OrderService {
    OrderDTO submit(OrderDTO in);
}

// 2. 实现并标注为 Dubbo Provider
@DubboService(version = "1.0.0", timeout = 3000, retries = 0, executes = 200)
@RequiredArgsConstructor
@Slf4j
public class OrderServiceImpl implements OrderService {
    private final StockClient stockClient;

    @Override
    public OrderDTO submit(OrderDTO in) {
        stockClient.lock(in.getSkuId(), in.getQty());
        // 业务逻辑...
        return in;
    }
}

对应的 application.yaml

yaml 复制代码
dubbo:
  application:
    name: order-provider
  registry:
    address: zookeeper://zk1:2181,zk2:2181,zk3:2181
  protocol:
    name: dubbo
    port: 20880
    serialization: kryo
  provider:
    threadpool: fixed
    threads: 400       # 结合 CPU 调优
    accepts: 1000
    qos-port: 22222    # 运维命令端口

启动流程

  • Spring Bootstrapping:DubboBootstrap 在 Spring 容器刷新完毕触发 afterPropertiesSet()
  • 装配 ServiceConfig:解析 @DubboService / <dubbo:service .../>,补全默认值(协议、端口、序列化、注册中心地址、元数据)
  • 生成 Invoker:Wrapper:Javassist ⟶ 把目标实现类包装成 Invoker,Proxy:Stub 用于本地调用兼容
  • Protocol.export():DubboProtocol/GrpcProtocol/RestProtocol... 创建 Exporter,开启 Server(Netty / Undertow / Tomcat)并绑定端口,注册到 ExporterMap,后续用于路由与连接复用
  • Registry.register():生成 URL:dubbo://ip:port/com.foo.BarService?version=1.0.0&...,写入 ZooKeeper 节点 /dubbo/com.foo.BarService/providers,发心跳 / 租约 (默认 60 s)
  • MetadataReport(Dubbo 3 可选):将完整的接口、方法、参数类型、返回类型、泛化信息记录到元数据中心,便于 UI 网关、Service Mesh 自动发现
  • QOS & Metrics:QOS: -Ddubbo.application.qos.enable=true 提供 telnet/HTTP 运维指令,Metrics: Micrometer、Prometheus Exporter、Dubbo-Monitor

生产环境

  • 端口规划:隔离内外网;优先使用 20880/20890 段并在防火墙放行
  • JVM 参数:-Xms -Xmx -Xmn -XX:+UseG1GC;关掉 RMI
  • 可观测性:埋点 TraceId;链路接入 SkyWalking / Zipkin
  • 配置中心:Dubbo 3 推荐统一到 Nacos / Apollo,避免 YAML 冗余
  • CI/CD:灰度 -> 全量;回滚脚本中要显式执行 provider 的优雅停机
  • 安全:开启 TLS (dubbo:protocol sslEnabled=true) + Token 校验
  • 性能压测:用 Dubbo-Bench / Gatling 对 Provider 射流;监控 p99 延迟 < SLA
  • 灾备:同城多活 Registry;Provider 开启多实例分布式部署
相关推荐
NE_STOP4 分钟前
SpringBoot--学会配置日志
java·spring
悟能不能悟17 分钟前
使用 PowerMockito 模拟 new A() 行为
java
天天摸鱼的java工程师17 分钟前
蚂蚁金服面试官:你能从JVM源码解释STW吗?
java·后端·面试
liangdabiao18 分钟前
包学会!WooCommerce开源电商的基础架构 - 简要介绍它的核心对象 - 有用有料
后端·架构
未来影子18 分钟前
MCP的SSE重连机制,源码解析
人工智能·后端
sniper_fandc28 分钟前
使用Spring Cloud LoadBalancer报错java.lang.IllegalStateException
java·spring·spring cloud
bobz96529 分钟前
kubevirt 替换为 hostnetwork 的优势
后端
大象席地抽烟29 分钟前
Nginx Ingress 证书
后端
心之语歌30 分钟前
Java 设计 MCP SSE 配置
java·后端
用户403159863966333 分钟前
计算初始化内存总长度
java·算法