点一下关注吧!!!非常感谢!!持续更新!!!
🚀 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 开启多实例分布式部署