定位
“Dubbo Producer 指’服务提供者’,负责实现业务接口并通过 Dubbo 框架导出(export)到注册中心/配置中心,使消费方(Consumer)能透明调用。“
角色与职责
- 接口实现:把业务接口的 Java 实现类暴露成远程服务
- 协议暴露:把接口转成可远程调用的 Protocol + Serialization
- 注册治理:向 Registry 报到、续租、下线
- 运行时资源:管理线程池、连接池、序列化缓冲
- 服务治理:版本、分组、权重、限流、熔断
关键组件
线程池
“处理业务方法调用;默认 FixedThreadPool + Queue,大流量接口自定义’隔离线程池’,避免阻塞全局”
序列化 (Serialization SPI)
“对象 ↔ ByteBuf;默认 Hessian2,建议换 Protobuf/FST/Kryo 提升 20-50% 吞吐”
连接池 (ChannelPool)
“长连接复用,默认 lazyInit + heartbeat”
过滤器 (Filter SPI)
“服务端链式拦截:日志、权限、限流、灰度”
POM
<dependency>
<groupId>icu.wzk</groupId>
<artifactId>wzk-service-api</artifactId>
</dependency>
生产者定义
@Service
public class WzkHelloServiceImpl implements WzkHelloService {
@Override
public String sayHello(String name) {
return "hello ? " + name;
}
}
配置文件
dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
配置类
@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 示例
@DubboService(version = "1.0.0", timeout = 3000, retries = 0, executes = 200)
public class OrderServiceImpl implements OrderService {
@Override
public OrderSubmitResult submit(OrderDTO in) {
// 业务逻辑...
return in;
}
}
启动流程
- Spring Bootstrapping:DubboBootstrap 在 Spring 容器刷新完毕触发 afterPropertiesSet()
- 装配 ServiceConfig:解析 @DubboService,补全默认值
- 生成 Invoker:Wrapper:Javassist 把目标实现类包装成 Invoker
- Protocol.export():创建 Exporter,开启 Server 并绑定端口
- Registry.register():生成 URL 并写入 ZooKeeper 节点
- MetadataReport:记录接口、方法、参数类型等信息
- QOS & Metrics:提供运维指令和监控
生产环境
- 端口规划:隔离内外网;优先使用 20880/20890 段
- JVM 参数:-Xms -Xmx -Xmn -XX:+UseG1GC
- 可观测性:埋点 TraceId;链路接入 SkyWalking / Zipkin
- 配置中心:Dubbo 3 推荐统一到 Nacos / Apollo
- CI/CD:灰度 -> 全量;回滚脚本中要显式执行优雅停机
- 安全:开启 TLS + Token 校验