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

分布式開發實戰(一):Maven 多模塊 + Dubbo + Zookeeper 搭建服務化架構

     編輯:Java 綜合教學

項目背景

隨著業務增長,單體應用面臨部署耦合、擴展受限、團隊協作衝突等問題。本文演示如何用 Maven 多模塊聚合 + Dubbo 服務治理 + Zookeeper 註冊中心,從零構建一個標準分布式服務架構雛形。

模塊劃分與依賴關係

mcweb (pom)          ← 父項目,統一依賴版本
├─ mcweb-api (jar)   ← 服務接口層:Entity、DAO/Service Interface
├─ mcweb-logic (jar) ← 服務提供者:接口實現、DAO 實現、Provider 配置
└─ mcweb-web (war)   ← 服務消費者:Controller、Consumer 配置、Web 端

依賴方向:logic → api、web → api、(web → logic 僅編譯期,運行期透過 Dubbo 遠程調用)

核心模塊代碼實現

1. mcweb-api:接口定義

// IUserService.java
public interface IUserService {
    User query(String userId);
}

// IUserDao.java
public interface IUserDao {
    User query(Class<User> clazz, Object userId);
}

// User.java (Entity)
public class User implements Serializable {
    private String id, userName, userChName;
    // getter/setter
}

2. mcweb-logic:提供者實現

// UserDao.java
@Repository
public class UserDao implements IUserDao {
    @PersistenceContext EntityManager em;
    public User query(Class<User> clazz, Object userId) {
        // return em.find(clazz, userId); // 實際連 DB
        User u = new User(); u.setUserName("zhangsan"); u.setUserChName("張三"); return u;
    }
}

// UserService.java
@Service @Transactional
public class UserService implements IUserService {
    @Autowired IUserDao userDao;
    public User query(String userId) { return userDao.query(User.class, userId); }
}

3. Dubbo Provider 配置:dubbo-provider.xml

<beans xmlns:dubbo="https://code.alibabatech.com/schema/dubbo">
    <dubbo:application name="mcweb-logic" />
    <dubbo:registry protocol="zookeeper" address="192.168.2.129:2181" />
    <dubbo:protocol name="dubbo" port="20880" />
    <dubbo:service interface="com.mcweb.api.service.IUserService" ref="userService" />
</beans>

在 applicationContext.xml 中 <import resource="dubbo-provider.xml"/>

4. mcweb-web:消費者實現

// UserController.java
@Controller @RequestMapping("/user")
public class UserController {
    @Autowired IUserService userService; // 遠程代理
    @RequestMapping("/query")
    public String query(@RequestParam("userId") String userId, Model model) {
        User user = userService.query(userId); // 透明遠程調用
        model.addAttribute("user", user);
        return "/user.jsp";
    }
}

5. Dubbo Consumer 配置:dubbo-consumer.xml

<beans xmlns:dubbo="https://code.alibabatech.com/schema/dubbo">
    <dubbo:application name="mcweb-web" />
    <dubbo:registry protocol="zookeeper" address="192.168.2.129:2181" />
    <dubbo:reference interface="com.mcweb.api.service.IUserService" id="userService" check="false" />
</beans>

check="false" 允許提供者未啟動時消費者先啟動。

基礎設施部署

  1. Zookeeper 單節點:解壓 → 修改 zoo.cfg → zkServer.sh start → 驗證 zkCli.sh
  2. Dubbo Admin:下載 dubbo-admin.war → 放入 Tomcat webapps → 配置 dubbo.properties 指向 ZK → 啟動訪問管控台

啟動驗證流程

  1. 啟動 Zookeeper
  2. 部署 mcweb-logic 到 Tomcat → 控制台見 SyncConnected、ZK 日誌見 NodeExists /dubbo/com.mcweb.api.service.IUserService → 服務註冊成功
  3. 部署 mcweb-web 到 Tomcat → 控制台見 SyncConnected → 服務訂閱成功
  4. 瀏覽器訪問 https://localhost:8090/mcweb-web/user/query?userId=aaaa → 頁面顯示 zhangsan / 張三 → 端到端通鏈
  5. Dubbo Admin 管控台查看服務提供者/消費者在線狀態、調用統計

關鍵配置標簽速查表

標簽角色關鍵屬性
<dubbo:service>提供者暴露服務interface, ref (Spring Bean ID)
<dubbo:reference>消費者引用服務interface, id (注入 Bean ID), check
<dubbo:provider>提供者默認值timeout, retries, loadbalance
<dubbo:consumer>消費者默認值check, timeout, cluster

架構優勢總結

  1. 模塊解耦:接口/實現/消費物理隔離,團隊並行開發
  2. 服務治理:註冊發現、負載均衡、容錯、監控開箱即用
  3. 技術棧統一:Maven 依賴管理、Spring 容器整合、Dubbo RPC 透明化
  4. 平滑演進:後續可引入 API 网關、配置中心、鏈路追蹤、服務網格

下一步預告

  • 多注冊中心高可用、服務分組/版本控制
  • Dubbo 协议调优、序列化選型(Hessian2/Kryo/Protobuf)
  • 服務熔斷降級(Sentinel/Hystrix 整合)
  • 分布式事務(Seata/TCC/Saga)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved