隨著業務增長,單體應用面臨部署耦合、擴展受限、團隊協作衝突等問題。本文演示如何用 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 遠程調用)
// 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
}
// 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); }
}
<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"/>
// 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";
}
}
<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" 允許提供者未啟動時消費者先啟動。
zoo.cfg → zkServer.sh start → 驗證 zkCli.shdubbo-admin.war → 放入 Tomcat webapps → 配置 dubbo.properties 指向 ZK → 啟動訪問管控台mcweb-logic 到 Tomcat → 控制台見 SyncConnected、ZK 日誌見 NodeExists /dubbo/com.mcweb.api.service.IUserService → 服務註冊成功mcweb-web 到 Tomcat → 控制台見 SyncConnected → 服務訂閱成功https://localhost:8090/mcweb-web/user/query?userId=aaaa → 頁面顯示 zhangsan / 張三 → 端到端通鏈| 標簽 | 角色 | 關鍵屬性 |
|---|---|---|
<dubbo:service> | 提供者暴露服務 | interface, ref (Spring Bean ID) |
<dubbo:reference> | 消費者引用服務 | interface, id (注入 Bean ID), check |
<dubbo:provider> | 提供者默認值 | timeout, retries, loadbalance |
<dubbo:consumer> | 消費者默認值 | check, timeout, cluster |