點一下關注吧!!!非常感謝!!持續更新!!!
🚀 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 {@Overridepublic 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>
對應的內容如下所示: