1. 程式人生 > >分散式系統架構——SSM整合Dubbo

分散式系統架構——SSM整合Dubbo

  • SpringMVC+Spring+MyBatis
  • Dubbo

專案地址:https://github.com/ryiann/ssm-dubbo

1、本文主要側重於專案中Dubbo部分,SSM框架如何搭建的這裡就不再贅述,關於SSM搭建部分

參考文章:
SSM框架——(SpringMVC+Spring+MyBatis+Maven多模組)整合

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