隨著業務增長,單體應用演進為微服務架構:服務拆分、獨立部署、動態擴縮容。此時需要**服務治理**能力:
Dubbo 作為高性能 RPC 框架,配合 Zookeeper 作為註冊中心,是 Java 生態最經典的微服務基礎設施組合。

docker run -d \
--name zookeeper \
--hostname zookeeper-host \
-v /data/zookeeper:/data \
-p 2181:2181 \
jplock/zookeeper:latest
-v 持久化數據目錄-p 2181 客戶端端口映射git clone https://github.com/DeemOpen/zkui.git && cd zkui && mvn clean installconfig.cfg 到 JAR 同級目錄,修改 zookeeper.connect=localhost:2181nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &https://宿主機IP:9090,默認賬號密碼 admin/manager

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.4.10</version>
<exclusions>
<exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.3</version>
</dependency>
<!-- slf4j + logback 日誌 -->
</dependencies>
package jim;
public interface IProduct {
String getProductName();
}
package jim;
import org.springframework.stereotype.Service;
@Service("productService") // 指定 bean 名稱,供 dubbo:service ref 引用
public class ProductService implements IProduct {
@Override
public String getProductName() {
return "Jim's Product";
}
}
applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="https://code.alibabatech.com/schema/dubbo"
xmlns:context="https://www.springframework.org/schema/context"
xsi:schemaLocation="
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://code.alibabatech.com/schema/dubbo https://code.alibabatech.com/schema/dubbo/dubbo.xsd
https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath*:config.properties"/>
<!-- 應用名稱、日誌框架 -->
<dubbo:application name="dubbo-provider-demo" logger="slf4j" />
<!-- 註冊中心:Zookeeper -->
<dubbo:registry protocol="zookeeper" address="192.168.21.128:2181" />
<!-- 協議:Dubbo 協議,開啟訪問日誌 -->
<dubbo:protocol name="dubbo" port="20880" accesslog="true" />
<!-- 掃描 @Service 註解 -->
<dubbo:annotation package="jim" />
<!-- 發布服務:interface 對應接口,ref 對應 Spring Bean 名稱 -->
<dubbo:service interface="jim.IProduct" ref="productService" />
<context:component-scan base-package="jim" />
</beans>
package jim;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ProviderApp {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
ctx.start();
System.out.println("Dubbo Provider Started...");
System.in.read(); // 阻塞主線程
}
}
consumer.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="https://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://code.alibabatech.com/schema/dubbo https://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-consumer-demo" />
<dubbo:registry protocol="zookeeper" address="192.168.21.128:2181" />
<!-- 遠程引用:id 必須與提供者 dubbo:service ref 一致 -->
<dubbo:reference id="productService" interface="jim.IProduct" />
</beans>
package jim.web;
import jim.IProduct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HomeController {
@Autowired
private IProduct productService;
@RequestMapping("/")
@ResponseBody
public String home() {
return "Product: " + productService.getProductName();
}
}
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:consumer.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
/dubbo/jim.IProduct/providers 節點出現提供者 URLaccesslog="true")

| 特性 | 配置示例 | 場景 |
|---|---|---|
| 超時控制 | <dubbo:method name="*" timeout="3000"/> | 防止調用阻塞 |
| 重試次數 | <dubbo:method name="*" retries="2"/> | 冪等接口提高成功率 |
| 負載均衡 | <dubbo:reference loadbalance="leastactive"/> | 根據活躍度分發 |
| 服務降級 | <dubbo:reference mock="return null"/> | 降級返回默認值 |
| 多版本 | <dubbo:service version="1.0.0"/> | 灰度發布、兼容舊版 |
| 本地存根 | <dubbo:service stub="jim.IProductStub"/> | 本地緩存、降級邏輯 |
新項目**強烈建議**直接使用 Dubbo 3.x:
dubbo-spring-boot-starter)# application.yml 片段
dubbo:
application:
name: dubbo3-demo
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: tri
port: 50051
scan:
base-packages: com.example.service
本文完整演示了從 Docker 部署 Zookeeper、ZKUI 管理,到 Dubbo 2.x XML 配置風格的提供者/消費者開發、啟動驗證、Admin 管控及核心治理能力。掌握此流程,即可快速搭建企業級 RPC 服務治理基礎設施。新項目請直接擁抱 Dubbo 3 + Spring Boot,享受雲原生時代的開發體驗。