首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

從零手把手搭建 Dubbo + Zookeeper 微服務平台(含 Docker、配置、提供者/消費者、Admin 管理)

     編輯:Java 綜合教學

背景:為什麼需要 Dubbo + Zookeeper?

隨著業務增長,單體應用演進為微服務架構:服務拆分、獨立部署、動態擴縮容。此時需要**服務治理**能力:

  • 服務註冊與發現(自動感知上下線)
  • 負載均衡、容錯、熔斷、限流
  • 多版本管理、服務降級、路由規則
  • 可視化監控與治理控制台

Dubbo 作為高性能 RPC 框架,配合 Zookeeper 作為註冊中心,是 Java 生態最經典的微服務基礎設施組合。

架構圖解

網站架構演進 服務治理需求 Dubbo架構 註冊中心選型

一、基礎設施部署(Docker 一鍎搞定)

1. Zookeeper 單節點

docker run -d \
  --name zookeeper \
  --hostname zookeeper-host \
  -v /data/zookeeper:/data \
  -p 2181:2181 \
  jplock/zookeeper:latest
  • -v 持久化數據目錄
  • -p 2181 客戶端端口映射

2. ZKUI 可視化管理界面(可選)

  1. 源碼構建:git clone https://github.com/DeemOpen/zkui.git && cd zkui && mvn clean install
  2. 複製 config.cfg 到 JAR 同級目錄,修改 zookeeper.connect=localhost:2181
  3. 啟動:nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &
  4. 訪問 https://宿主機IP:9090,默認賬號密碼 admin/manager

ZKUI登錄 ZKUI節點管理

二、Dubbo 服務提供者開發

1. Maven 依賴 (dubbo 2.4.x + Spring 3.x 風格,現代項目建議 Dubbo 3.x + Spring Boot)

<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>

2. 服務接口定義

package jim;
public interface IProduct {
    String getProductName();
}

3. 服務實現

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";
    }
}

4. Spring + Dubbo 配置 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>

5. 啟動類(保持進程不退出)

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();  // 阻塞主線程
    }
}

三、Dubbo 服務消費者開發

1. 消費者配置 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>

2. Spring MVC Controller 調用示例

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();
    }
}

3. web.xml 載入消費者配置

<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>

四、驗證與進階治理

1. 啟動順序

  1. Zookeeper (Docker)
  2. ProviderApp (Java Main)
  3. Consumer Web 應用 (Tomcat/Jetty)

2. 驗證

  • ZKUI 中查看 /dubbo/jim.IProduct/providers 節點出現提供者 URL
  • 瀏覽器訪問 Consumer 暴露的 HTTP 接口,返回服務調用結果
  • Provider 控制台打印訪問日誌(accesslog="true")

3. Dubbo Admin 管理控制台(可選)

  • 官方下載:dubbo-admin(現代版基於 Spring Boot + Vue)
  • 功能:服務查詢、路由規則動態配置、熔斷降級、訪問控制、元數據管理

Dubbo Admin架構 Dubbo Admin界面

4. 核心治理能力(配置即生效,無需改代碼)

特性配置示例場景
超時控制<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 + Spring Boot 2.7+/3.x

新項目**強烈建議**直接使用 Dubbo 3.x:

  • 全面支援 Spring Boot 自動配置(dubbo-spring-boot-starter)
  • 原生支援 Nacos/Zookeeper/Etcd/Consul 多註冊中心
  • Triple 協議(基於 HTTP/2 + gRPC)、REST、gRPC 多協議
  • 元數據中心、服務網格集成、Kubernetes 原生
  • 配置中心整合(Nacos/Apollo),動態刷新無需重啟
# 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,享受雲原生時代的開發體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved