点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用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案例 详解
Dubbo 服务调用机制详解
基本架构与交互原理
在 Dubbo 分布式服务框架中,所有的服务调用都是基于 Java 接口进行交互的。这种接口契约式设计确保了服务提供者和消费者之间的解耦。具体工作流程如下:
- 接口协定:服务提供方和消费方首先需要共同定义一套标准的服务接口(通常打包为独立的API模块)
- 服务注册:提供者实现这些接口后,将服务实例注册到注册中心(如Zookeeper、Nacos等)
- 服务发现:消费者从注册中心获取可用服务列表
- 远程调用:消费者通过动态代理发起对提供者的RPC调用
Maven 工程结构说明
Dubbo 项目通常采用多模块的Maven工程结构,典型布局如下:
dubbo-demo/
├── dubbo-api/ # 接口定义模块
│ ├── src/main/java
│ │ └── com/example/DemoService.java
│ └── pom.xml
├── dubbo-provider/ # 服务提供方
│ ├── src/main/java
│ │ └── com/example/DemoServiceImpl.java
│ └── pom.xml
└── dubbo-consumer/ # 服务消费方
├── src/main/java
│ └── com/example/ConsumerApp.java
└── pom.xml
详细实现步骤
1. 创建API模块
<!-- dubbo-api/pom.xml -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
接口定义示例:
package com.example;
public interface DemoService {
String sayHello(String name);
}
2. 实现Provider模块
<!-- dubbo-provider/pom.xml -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
服务实现示例:
package com.example;
import org.apache.dubbo.config.annotation.Service;
@Service(version = "1.0.0")
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
注册中心配置(以Zookeeper为例):
# application.properties
dubbo.application.name=demo-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
3. 实现Consumer模块
<!-- dubbo-consumer/pom.xml -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
消费方调用示例:
package com.example;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@Reference(version = "1.0.0")
private DemoService demoService;
@GetMapping("/hello")
public String sayHello(String name) {
return demoService.sayHello(name);
}
}
消费者配置示例:
# application.properties
dubbo.application.name=demo-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
典型应用场景
- 微服务架构:将单体应用拆分为多个Dubbo服务
- 服务治理:通过注册中心实现服务的自动发现和负载均衡
- 分布式事务:配合Seata等框架实现分布式事务管理
- 多版本支持:通过版本号控制实现灰度发布
- 服务降级:在服务不可用时自动切换到降级逻辑
父工程
创建一个父级工程,用于管理所有的模块,移除src目录。
我们定义基础 POM,这里对所有的版本进行管理,方便后续的子模块,这样子模块就不用再控制和管理各自的版本了:
<?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>
<groupId>icu.wzk</groupId>
<artifactId>dubbo-test</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>wzk-service-api</module>
<module>wzk-producer</module>
<module>wzk-consumer</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dubbo.version>2.7.5</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>icu.wzk</groupId>
<artifactId>wzk-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
<version>${dubbo.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
API模块
这个模块用于定义接口抽象类,不提供实际的实现。
后续的 Producer 和 Consumer 都将依赖这个模块,根据该模块定义出来的接口进行使用。
POM
该模块直接依赖 Dubbo,版本控制都交给了父级Maven项目控制。
后续的 Producer 和 Consumer 依赖这个模块,就不需要再单独控制 Dubbo 模块了:
<?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-service-api</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>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
</dependency>
</dependencies>
</project>
项目的基本结构如该图所示:
接口定义
定义接口,只写了一个基本的方法:
package icu.wzk.service;
public interface WzkHelloService {
String sayHello(String name);
}
创建接口的提供者
<dependencies>
<dependency>
<groupId>icu.wzk</groupId>
<artifactId>wzk-service-api</artifactId>
</dependency>
</dependencies>
对应的内容如下所示: