当前位置: 首页 > backend >正文

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 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 {@Overridepublic 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 {@Beanpublic 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;@Overridepublic OrderDTO submit(OrderDTO in) {stockClient.lock(in.getSkuId(), in.getQty());// 业务逻辑...return in;}
}

对应的 application.yaml

dubbo:application:name: order-providerregistry:address: zookeeper://zk1:2181,zk2:2181,zk3:2181protocol:name: dubboport: 20880serialization: kryoprovider:threadpool: fixedthreads: 400       # 结合 CPU 调优accepts: 1000qos-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 开启多实例分布式部署
http://www.xdnf.cn/news/15413.html

相关文章:

  • 清除 Android 手机 SIM 卡数据的4 种简单方法
  • 网络准入控制系统的作用解析,2025年保障企业入网安全第一道防线
  • OpenVela之开发自测试框架cmocka
  • 【算法训练营Day12】二叉树part2
  • 量产技巧之RK3588 Android12默认移除导航栏状态栏​
  • google浏览器::-webkit-scrollbar-thumb设置容器滚动条滑块不生效
  • Android 性能优化:启动优化全解析
  • C++-linux 7.文件IO(一)系统调用
  • Linux上基于C/C++头文件查找对应的依赖开发库
  • uni-app 选择国家区号
  • CentOS 7服务器上使用Docker部署Notesnook的详细指导说明
  • Spring Cloud分布式配置中心:架构设计与技术实践
  • 链表算法之【获取链表开始入环的节点】
  • 图生生AI模仿裂变:1分钟批量裂变素材图片!
  • MySQL数据库的基础操作
  • C++后端面试八股文
  • 深入解析Hadoop YARN架构设计:从原理到实践
  • 5、qt系统相关
  • LLM表征工程还有哪些值得做的地方
  • linux打包固件shell脚本
  • FOC算法中SIMULINK一些常用模块(1)(个人留存)
  • 多客户端-服务器(select,poll)
  • 第二章 基于新版Onenet搭建云服务(stm32物联网)
  • elementPlus中的el-table实现合并单元格
  • MMKV 存储json list数据(kotlin)
  • 《Linux篇》自动化构建-make/Makefile
  • 自动润滑系统:从 “盲目养护“ 到智能精注的工业运维革命
  • MMaDA:多模态大型扩散语言模型
  • 动态规划题解_将一个数字表示成幂的和的方案数【LeetCode】
  • 互斥锁详解(操作系统os)