分散式系統架構——SSM整合Dubbo
- SpringMVC+Spring+MyBatis
- Dubbo
專案地址:https://github.com/ryiann/ssm-dubbo
- 1、本文主要側重於專案中Dubbo部分,SSM框架如何搭建的這裡就不再贅述,關於SSM搭建部分
- 2、閱讀本文前需要知道Dubbo、Dubbo-Admin、Zookeeper是幹什麼用的
-
Dubbo是什麼?
-
1.Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案,即遠端服務呼叫的分散式框架
-
2.大體來看,Dubbo分為消費者、提供者和註冊中心
-
3.從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色
-
4.Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring載入Dubbo的配置即可,Dubbo基於Spring的Schema擴充套件進行載入
-
Dubbo能做什麼?
-
1.透明化的遠端方法呼叫,就像呼叫本地方法一樣呼叫遠端方法,只需簡單配置,沒有任何API侵入
-
2.軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點
-
3.服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑新增或刪除服務提供者
-
Dubbo核心功能:
-
Remoting:遠端通訊,提供對多種NIO框架抽象封裝,包括“同步轉非同步”和“請求-響應”模式的資訊交換方式
-
Cluster: 服務框架,提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及軟負載均衡,失敗容錯,地址路由,動態配置等叢集支援
-
Registry: 服務註冊中心,基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器
-
Zookeeper在Dubbo中扮演了一個什麼角色,起到了什麼作用?
-
Zookeeper是Dubbo推薦的註冊中心, zookeeper用來註冊服務和進行負載均衡
-
什麼是Dubbo-Admin:
-
用Zookeeper當註冊中心,我們無法看到是否存在了什麼提供者或消費者,這時就要藉助Dubbo-Admin管理平臺來實時的檢視,也可以通過這個平臺來管理提者和消費者
執行一個完整的Dubbo專案,除了需要Tomcat、Mysql外,還需要用到Zookeeper、Dubbo-Admin,請在執行專案前將所需環境準備好
##專案結構
.
└── ssm-dubbo
├── background
└── foreground
Dubbo服務可分為提供者和消費者,我把提供服務的統稱為提供者,我將整套專案拆分成了background、foreground 兩個子專案,其中background專案是dubbo提供者,主要負責處理業務、操作資料庫及暴露介面供消費者使用,foreground專案就很簡單了,僅僅作為處理View的轉發,呼叫介面。流程如下圖
###background結構
.
└── background
├── background-api # 提供的dubbo介面
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── com
│ └── ryan
├── background-common # 工具類
│ ├── pom.xml # 引入常用工具依賴
│ └── src
│ └── main
│ └── java
│ └── com
│ └── ryan
├── background-dao # 資料庫訪問層
│ ├── pom.xml # 描述工程資源的目錄,編譯打包 mapper.xml
│ └── src
│ └── main
│ └── java
│ └── com
│ └── ryan
├── background-domain # 域模型層
│ └── pom.xml
├── background-service # 業務邏輯層
│ ├── pom.xml # 引入Spring、JDBC依賴
│ └── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── ryan
│ └── resources
│ └── applicationContext-service.xml # 掃描註解配置
├── background-web #表現層
│ ├── pom.xml # 定義一些常量 [jdk version]
│ └── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── ryan
│ ├── resources
│ │ ├── applicationContext-aop.xml # 事務配置檔案
│ │ ├── applicationContext.properties # 配置檔案
│ │ ├── applicationContext-thread.xml # 執行緒池配置檔案
│ │ ├── applicationContext-web.xml # Spring跳轉相關配置檔案
│ │ ├── applicationContext.xml # Spring配置檔案
│ │ ├── dataSource.xml # 連線池資料來源配置檔案
│ │ ├── dubbo-provider.xml # Dubbo提供者配置檔案
│ │ ├── log4j.properties # 日誌配置檔案
│ │ └── mybatis-config.xml # Mybatis配置檔案
│ └── webapp # Web靜態資原始檔
│ ├── index.jsp
│ └── WEB-INF # Web應用程式配置檔案
│ ├── rest-servlet.xml
│ └── web.xml
└── pom.xml #父POM
###foreground結構
.
└── foreground
├── foreground-common # 工具類
│ ├── pom.xml # 引入常用工具依賴
│ └── src
│ └── main
│ └── java
│ └── com
├── foreground-dao # 資料庫訪問層
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── com
├── foreground-domain # 域模型層
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── com
├── foreground-service # 業務邏輯層
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── com
│ └── resources
│ └── applicationContext-service.xml # 掃描註解配置
├── foreground-web #表現層
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── com
│ ├── resources
│ │ ├── applicationContext-aop.xml # 事務配置檔案
│ │ ├── applicationContext.properties # 配置檔案
│ │ ├── applicationContext-thread.xml # 執行緒池配置檔案
│ │ ├── applicationContext-web.xml # Spring跳轉相關配置檔案
│ │ ├── applicationContext.xml # Spring配置檔案
│ │ ├── dataSource.xml # 連線池資料來源配置檔案
│ │ ├── dubbo-consumer.xml # Dubbo消費者配置檔案
│ │ ├── log4j.properties # 日誌配置檔案
│ │ └── mybatis-config.xml # Mybatis配置檔案
│ └── webapp # Web靜態資原始檔
│ ├── index.jsp
│ └── WEB-INF # Web應用程式配置檔案
└── pom.xml #父POM
##SSM框架Dubbo整合配置
簡單來說,一個SSM專案想要整合Dubbo,只需要在SSM框架的基礎之上引入Dubbo所需要的依賴,和新增dubbo-consumer.xml、dubbo-provider.xml配置檔案就行了
###引入dubbo依賴
<!-- dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- zookeeper -->
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- zkclient -->
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
###提供者配置
注:${}
常量是從applicationContext.properties配置檔案中讀取的
dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方應用資訊,用於計算依賴關係 -->
<dubbo:application name="${dubbo.appname}" logger="slf4j" />
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.url}" register="true"/>
<!-- 用dubbo協議在20880埠暴露服務 -->
<dubbo:protocol payload="${dubbo.upload}" name="dubbo" port="${dubbo.port}"/>
<!-- 具體的實現bean -->
<bean id="StudentDubboService" class="com.ryan.service.impl.StudentDubboServiceImpl"/>
<!-- 宣告需要暴露的服務介面 -->
<dubbo:service interface="com.ryan.service.StudentDubboService"
ref="StudentDubboService"
timeout="${dubbo.timeout}"
version="${dubbo.version}" />
</beans>
###消費者配置
dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方應用資訊,用於計算依賴關係 -->
<dubbo:application name="${dubbo.appname}" logger="slf4j" />
<!-- 使用multicast廣播註冊中心暴露發現服務地址 -->
<!-- register:false,只訂閱,不註冊 -->
<dubbo:registry id="registry" protocol="zookeeper" address="${dubbo.url}"/>
<!-- dubbo介面 -->
<dubbo:reference registry="registry"
check="false"
connections="1"
interface="com.ryan.service.StudentDubboService"
id="studentDubboService"
timeout="${dubbo.timeout}"
version="${dubbo.version}"
retries="0"
/>
</beans>
我們在SSM框架的基礎上新增以上配置,就可以進行測試了
##測試
JDK:1.8
Dubbo-Admin :http://116.62.22.2:8081/dubbo
- 使用者名稱: root
- 密碼: root
1、先將background專案編譯(install)打包下,因為foreground專案會依賴background-api.jar
2、分別將background、foreground專案扔到單獨的 tomcat裡執行,可以在上方提供的dubbo-admin中檢視是否dubbo服務註冊成功
3、呼叫foreground專案中的findStudentListByPage方法,驗證dubbo是否配置成功,因為專案中沒有寫任何view頁面,所以直接在Postman或瀏覽器中訪問地址,例:
http://localhost:8080/foreground/json/findStudentListByPage
如果能正常返回json格式的查詢資訊,那麼就能證明我們的dubbo已經配置成功了
注:
- dubbo-admin僅為平時測試所用
- 專案配置檔案中的資料庫資訊為測試庫,只有select許可權
- 該伺服器為博主平時測試demo的伺服器
##資料庫指令碼
這裡貼上demo的資料庫,併為student表初始化一些資料
student.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_student_info
-- ----------------------------
DROP TABLE IF EXISTS `t_student_info`;
CREATE TABLE `t_student_info` (
`stu_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
`stu_number` int(11) NULL DEFAULT NULL COMMENT '學號',
`stu_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`stu_gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性別',
`stu_age` int(3) NULL DEFAULT NULL COMMENT '年齡',
PRIMARY KEY (`stu_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10004 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_student_info
-- ----------------------------
INSERT INTO `t_student_info` VALUES (10001, 95001, '張三', '男', 20);
INSERT INTO `t_student_info` VALUES (10002, 95002, '李四', '男', 21);
INSERT INTO `t_student_info` VALUES (10003, 95003, '王五', '女', 22);
SET FOREIGN_KEY_CHECKS = 1;
demo裡實現了簡單的增刪改查,需要的同學可以去下載,感覺還不錯就給個star吧!