Dubbo 服务调用机制详解
基本架构与交互原理
在 Dubbo 分布式服务框架中,所有的服务调用都是基于 Java 接口进行交互的。这种接口契约式设计确保了服务提供者和消费者之间的解耦。具体工作流程如下:
- 接口协定:服务提供方和消费方首先需要共同定义一套标准的服务接口
- 服务注册:提供者实现这些接口后,将服务实例注册到注册中心
- 服务发现:消费者从注册中心获取可用服务列表
- 远程调用:消费者通过动态代理发起对提供者的RPC调用
Maven 工程结构说明
Dubbo 项目通常采用多模块的Maven工程结构,典型布局如下:
dubbo-demo/
├── dubbo-api/ # 接口定义模块
├── dubbo-provider/ # 服务提供方
└── dubbo-consumer/ # 服务消费方
父工程
创建一个父级工程,用于管理所有的模块,移除src目录。
<?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>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模块
这个模块用于定义接口抽象类,不提供实际的实现。
接口定义
package icu.wzk.service;
public interface WzkHelloService {
String sayHello(String name);
}