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

Maven + SpringMVC + Dubbo + Zookeeper 微服務拆分實戰:從單體到分佈式服務治理

     編輯:Java 綜合教學

Maven + SpringMVC + Dubbo + Zookeeper 微服務拆分實戰:從單體到分佈式服務治理

傳統 MVC 所有邏輯耦合在單體 WAR 包,擴展性差、部署風險大。本文實戰演示:
① 模塊拆分:API 接口模塊、Provider 服務實現模塊、Consumer Web 控制器模塊
② Zookeeper 注冊中心:單機啟動、Dubbo Admin 管控台部署
③ Dubbo 服務暴露/引用:XML 配置、服務啟動類、管控台驗證
為後續微服務架構奠定基礎。

架構拆分圖解

┌─────────────┐     Dubbo RPC      ┌──────────────────┐
│  Consumer   │ ◄─────────────────► │    Provider      │
│  (Web控制器) │  註冊中心 Zookeeper  │  (ServiceImpl)   │
└──────┬──────┘                     └────────┬─────────┘
       │                                      │
       ▼                                      ▼
┌──────────────────┐                 ┌──────────────────┐
│  Public Interface │◄──── 依賴 ──────►│   Public Interface│
│  (API 模塊)       │                 │   (API 模塊)      │
└──────────────────┘                 └──────────────────┘

三模塊 Maven 結構

parent-pom (packaging=pom)
├── public-interface   (jar)  -- Service 接口、DTO、常量
├── dubbo-provider     (jar)  -- ServiceImpl、DAO、Spring+Dubbo 配置
└── web-consumer       (war)  -- Controller、SpringMVC、Dubbo Consumer 配置

關鍵依賴 (parent 統一版本管理)

<properties>
    <dubbo.version>2.5.3</dubbo.version>
    <zookeeper.version>3.3.3</zookeeper.version>
    <spring.version>4.3.10.RELEASE</spring.version>
</properties>

<dependencies>
    <!-- 公共接口模塊 -->
    <dependency><groupId>com.example</groupId><artifactId>public-interface</artifactId><version>${project.version}</version></dependency>

    <!-- Dubbo 核心 -->
    <dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency>
    <dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>${zookeeper.version}</version></dependency>
    <!-- Spring Context -->
    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
</dependencies>

Zookeeper 單機啟動 (Windows)

  1. 下載解壓 zookeeper-3.4.x
  2. 重命名 conf/zoo_sample.cfg → zoo.cfg,核心配置:
    tickTime=2000
    dataDir=./data
    clientPort=2181
  3. 雙擊 bin/zkServer.cmd 啟動,日誌顯示 binding to port 2181 即成功

Dubbo Admin 管控台部署

  1. 下載 dubbo-admin-2.5.3.war,解壓
  2. 修改 META-INF/dubbo.properties:
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest
  3. Tomcat webapps/ROOT 清空,複製解壓文件進去
  4. 啟動 Tomcat,訪問 https://localhost:8080,登錄 root/root

Provider 端核心配置

1. 接口定義 (public-interface)

package com.cl.user.servicei;
public interface UserService {
    String sayHello();
}

2. 實現類 (dubbo-provider)

@Service("userService")
public class UserServiceImpl implements UserService {
    @Override public String sayHello() {
        System.out.println("hello world----------------------------");
        return "hello world";
    }
}

3. Spring+Dubbo XML (META-INF/spring/applicationContext-dubbo.xml)

<beans xmlns="..." xmlns:dubbo="https://code.alibabatech.com/schema/dubbo" ...>
    <dubbo:application name="user-service-provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:protocol name="dubbo" port="20880"/>

    <bean id="userService" class="com.cl.user.serviceImpl.UserServiceImpl"/>
    <dubbo:service interface="com.cl.user.servicei.UserService" ref="userService"/>
</beans>

4. 啟動類 (關鍵:加載 META-INF/spring/*.xml)

package com.test;
public class ProviderStart {
    public static void main(String[] args) {
        // Dubbo 容器會自動掃描 classpath:META-INF/spring/*.xml
        com.alibaba.dubbo.container.Main.main(args);
    }
}

原理:DubboContainer 啟動時調用 SpringContainer,掃描 META-INF/spring/ 下所有 XML,故配置文件必須放在此目錄。

Consumer 端配置 (web-consumer)

<!-- web.xml 加載 SpringMVC + Dubbo Consumer 配置 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:META-INF/spring/*.xml</param-value>
</context-param>

<!-- applicationContext-dubbo-consumer.xml -->
<dubbo:application name="web-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference id="userService" interface="com.cl.user.servicei.UserService"/>

Controller 調用

@Controller
@RequestMapping("/user")
public class UserController {
    @Reference // 或 @Autowired 注入 dubbo:reference 的 bean
    private UserService userService;

    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return userService.sayHello(); // 遠程 RPC 調用
    }
}

驗證流程

  1. 啟動 Zookeeper
  2. 啟動 ProviderStart.main(),控制台輸出「Service exported」
  3. Dubbo Admin 頁面刷新,看到 com.cl.user.servicei.UserService 提供者 192.168.x.x:20880
  4. 啟動 Web Consumer (Tomcat 部署 war)
  5. 瀏覽器訪問 https://localhost:8080/user/hello → 返回 hello world

避坑指南

現象原因解決
Provider 啟動報 ClassNotFound public-interface 未 install 到本地倉庫 mvn clean install -DskipTests 先裝 API 模塊
Consumer 注入 null dubbo:reference id 與 @Autowired 名稱不一致 統一 bean name 或用 @Reference(version="...")
Zookeeper 連接超時 防火牆擋 2181/20880 端口 放行端口或關閉防火牆測試
Dubbo Admin 顯示空 dubbo.properties registry.address 錯誤 檢查 IP/端口與 Zookeeper 一致

演進方向

  • 配置中心化:Nacos/Apollo 替代 XML
  • 註解驅動:@DubboService/@DubboReference 替代 XML
  • 註冊中心高可用:Zookeeper 集群 (3/5 節點)
  • 服務網格:Sidecar 模式 (Istio/Linkerd) 實現零侵入治理

架構感悟:微服務拆分的本質是「業務邊界劃分」,技術棧只是手段。先做好「高內聚、低耦合」的模塊劃分,再引入 Dubbo/Zookeeper 解決分佈式調用問題,切忌為拆分而拆分。

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