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

发布于:2025-07-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

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

🚀 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 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注解来表明是一个服务的提供者:

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 目录下,比如配置文件叫:

dubbo-provider.properties

对应的内容如下:

dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

● doubbo.application.name 服务的名称
● dubbo.protocol.name 对外提供服务的协议
● dubbo.protocol.port 对外提供服务的端口

对应的内容如下所示:
在这里插入图片描述

配置类

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

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 的话

// 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

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 开启多实例分布式部署

网站公告

今日签到

点亮在社区的每一天
去签到