天天看點

Dubbo在SSM項目中的使用Dubbo在SSM項目中的使用

Dubbo在SSM項目中的使用

案例源代碼下載下傳位址

https://download.csdn.net/download/pcbhyy/10764704

操作步驟

  1. 建立一個ssm內建的項目,及編寫初始代碼
  2. 把該項目拆分為兩部分(表示層一部分、業務邏輯和資料通路層一部分)
  3. 通過dubbo在表示層中通路業務邏輯層中的元件(關鍵)

Dubbo簡介

Dubbo是阿裡巴巴公司開源的一個高性能優秀的服務架構,使得應用可通過高性能的 RPC 實作

服務的輸出和輸入功能,可以和Spring架構無縫內建。

  1. Provider

    暴露服務方稱之為“服務提供者”。

  2. Consumer

    調用遠端服務方稱之為“服務消費者”。

  3. Registry

    服務注冊與發現的中心目錄服務稱之為“服務注冊中心”。

  4. Monitor

    統計服務的調用次數和調用時間的日志服務稱之為“服務監控中心”。

一、項目拆分

  1. 拆分内容:

    web.xml

    pom.xml

    springmvc.xml

    applicationContext.xml

    部配置設定置檔案的删除

    代碼的删減

  2. 表示層項目

    1)pom.xml(注意:添加了dubbo、zookeeper的依賴)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
			<modelVersion>4.0.0</modelVersion>
			<groupId>com.yy</groupId>
			<artifactId>ssm_dept2_vc</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<packaging>war</packaging>
			<build>
				<resources>
					<resource>
						<directory>src/main/java</directory>
						<excludes>
							<exclude>**/*.java</exclude>
						</excludes>
					</resource>
					<resource>
						<directory>src/main/resources</directory>
					</resource>
				</resources>
				<plugins>
					<!-- 資源檔案拷貝插件 -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-resources-plugin</artifactId>
						<version>2.7</version>
						<configuration>
							<encoding>UTF-8</encoding>
						</configuration>
					</plugin>
					<!-- java編譯插件 -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-compiler-plugin</artifactId>
						<version>3.2</version>
						<configuration>
							<source>1.8</source>
							<target>1.8</target>
							<encoding>UTF-8</encoding>
						</configuration>
					</plugin>
					<plugin>
						<groupId>org.apache.tomcat.maven</groupId>
						<artifactId>tomcat7-maven-plugin</artifactId>
						<version>2.2</version>
						<configuration>
							<!-- 部署路徑,如:/e3mall,表明部署到/e3mall路徑下 -->
							<path>/</path>
							<!-- 端口号 -->
							<port>8090</port>
							<uriEncoding>utf-8</uriEncoding>
						</configuration>
					</plugin>
				</plugins>
			</build>
			<dependencies>
				<dependency>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
					<version>4.12</version>
				</dependency>
				<dependency>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
					<version>1.2.17</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>aopalliance</groupId>
					<artifactId>aopalliance</artifactId>
					<version>1.0</version>
				</dependency>
				<dependency>
					<groupId>org.aspectj</groupId>
					<artifactId>aspectjweaver</artifactId>
					<version>1.8.10</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-tx</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-jdbc</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-orm</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>


				<dependency>
					<groupId>org.mybatis</groupId>
					<artifactId>mybatis-spring</artifactId>
					<version>1.2.2</version>
				</dependency>
				<dependency>
					<groupId>jstl</groupId>
					<artifactId>jstl</artifactId>
					<version>1.2</version>
				</dependency>
				<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
				<dependency>
					<groupId>javax.servlet</groupId>
					<artifactId>javax.servlet-api</artifactId>
					<version>3.1.0</version>
					<scope>provided</scope>
				</dependency>
				<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
				<dependency>
					<groupId>javax.servlet.jsp</groupId>
					<artifactId>jsp-api</artifactId>
					<version>2.2</version>
					<scope>provided</scope>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-webmvc</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>

				<!--解決Spring使用slf4j輸出日志與log4j沖突的問題 -->
				<dependency>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
					<version>1.7.25</version>
				</dependency>

				<dependency>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate-validator</artifactId>
					<version>5.4.1.Final</version>
				</dependency>
				<dependency>
					<groupId>javax.validation</groupId>
					<artifactId>validation-api</artifactId>
					<version>1.1.0.Final</version>
				</dependency>
				<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
				<dependency>
					<groupId>org.jboss.logging</groupId>
					<artifactId>jboss-logging</artifactId>
					<version>3.3.1.Final</version>
				</dependency>
				<!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
				<dependency>
					<groupId>com.fasterxml</groupId>
					<artifactId>classmate</artifactId>
					<version>1.3.3</version>
				</dependency>
				<dependency>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
					<version>1.3.2</version>
				</dependency>
				<dependency>
					<groupId>com.fasterxml.jackson.core</groupId>
					<artifactId>jackson-databind</artifactId>
					<version>2.8.8.1</version>
				</dependency>
				<dependency>
					<groupId>com.github.pagehelper</groupId>
					<artifactId>pagehelper</artifactId>
					<version>5.0.0</version>
				</dependency>
				<dependency>
					<groupId>com.alibaba</groupId>
					<artifactId>dubbo</artifactId>
					<version>2.5.3</version>
				</dependency>
				<dependency>
					<groupId>org.apache.zookeeper</groupId>
					<artifactId>zookeeper</artifactId>
					<version>3.4.7</version>
				</dependency>
				<dependency>
					<groupId>com.github.sgroschupf</groupId>
					<artifactId>zkclient</artifactId>
					<version>0.1</version>
				</dependency>
			</dependencies>
		</project>
           

2)web.xml(注意:去掉了監聽器和上下文參數)

<?xml version="1.0" encoding="UTF-8"?>
		<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
		  <display-name>spring_demo</display-name>
		  <welcome-file-list>
			<welcome-file>index.jsp</welcome-file>
		  </welcome-file-list>
		  
		  <filter>
			<filter-name>CharacterEncodingFilter</filter-name>
			<filter-class>
				org.springframework.web.filter.CharacterEncodingFilter
			</filter-class>
			<init-param>
				<param-name>encoding</param-name>
				<param-value>utf-8</param-value>
			</init-param>
		  </filter>
		  
		  <filter-mapping>
			<filter-name>CharacterEncodingFilter</filter-name>
			<url-pattern>/*</url-pattern>
		  </filter-mapping>
		  
		  <servlet>
			<servlet-name>DispatcherServlet</servlet-name>
			<servlet-class>
				org.springframework.web.servlet.DispatcherServlet
			</servlet-class>
			<init-param>
			  <param-name>contextConfigLocation</param-name>
			  <param-value>classpath:springmvc.xml</param-value>
			</init-param>
		  </servlet>
		  <servlet-mapping>
			<servlet-name>DispatcherServlet</servlet-name>
			<url-pattern>/</url-pattern>
		  </servlet-mapping>  
		</web-app>
           

3)去掉了applicationContext.xml、db.properties、SqlMapConfig.xml三個配置檔案

4)删除了com.yy.mapper包和com.yy.service包中的實作類(接口留着)

3. 業務邏輯和資料通路層項目

1)pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
			<modelVersion>4.0.0</modelVersion>
			<groupId>com.yy</groupId>
			<artifactId>ssm_dept2_m</artifactId>
			<version>0.0.1-SNAPSHOT</version>
			<packaging>war</packaging>
			<build>
				<resources>
					<resource>
						<directory>src/main/java</directory>
						<excludes>
							<exclude>**/*.java</exclude>
						</excludes>
					</resource>
					<resource>
						<directory>src/main/resources</directory>
					</resource>
				</resources>
				<plugins>
					<!-- 資源檔案拷貝插件 -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-resources-plugin</artifactId>
						<version>2.7</version>
						<configuration>
							<encoding>UTF-8</encoding>
						</configuration>
					</plugin>
					<!-- java編譯插件 -->
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-compiler-plugin</artifactId>
						<version>3.2</version>
						<configuration>
							<source>1.8</source>
							<target>1.8</target>
							<encoding>UTF-8</encoding>
						</configuration>
					</plugin>
					<plugin>
						<groupId>org.apache.tomcat.maven</groupId>
						<artifactId>tomcat7-maven-plugin</artifactId>
						<version>2.2</version>
						<configuration>
							<!-- 部署路徑,如:/e3mall,表明部署到/e3mall路徑下 -->
							<path>/</path>
							<!-- 端口号 -->
							<port>8089</port>

							<uriEncoding>utf-8</uriEncoding>
						</configuration>
					</plugin>
				</plugins>
			</build>
			<dependencies>
				<dependency>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
					<version>4.12</version>
				</dependency>
				<dependency>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
					<version>1.2.17</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>aopalliance</groupId>
					<artifactId>aopalliance</artifactId>
					<version>1.0</version>
				</dependency>
				<dependency>
					<groupId>org.aspectj</groupId>
					<artifactId>aspectjweaver</artifactId>
					<version>1.8.10</version>
				</dependency>
				<dependency>
					<groupId>commons-dbcp</groupId>
					<artifactId>commons-dbcp</artifactId>
					<version>1.4</version>
				</dependency>
				<dependency>
					<groupId>mysql</groupId>
					<artifactId>mysql-connector-java</artifactId>
					<version>5.1.6</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-tx</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-jdbc</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-orm</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>
				<dependency>
					<groupId>org.mybatis</groupId>
					<artifactId>mybatis</artifactId>
					<version>3.2.6</version>
				</dependency>
				<dependency>
					<groupId>cglib</groupId>
					<artifactId>cglib</artifactId>
					<version>3.2.5</version>
				</dependency>
				<dependency>
					<groupId>org.mybatis</groupId>
					<artifactId>mybatis-spring</artifactId>
					<version>1.2.2</version>
				</dependency>

				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>spring-webmvc</artifactId>
					<version>4.3.8.RELEASE</version>
				</dependency>

				<!--解決Spring使用slf4j輸出日志與log4j沖突的問題 -->
				<dependency>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-log4j12</artifactId>
					<version>1.7.25</version>
				</dependency>
				<dependency>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate-validator</artifactId>
					<version>5.4.1.Final</version>
				</dependency>
				<dependency>
					<groupId>javax.validation</groupId>
					<artifactId>validation-api</artifactId>
					<version>1.1.0.Final</version>
				</dependency>
				<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
				<dependency>
					<groupId>org.jboss.logging</groupId>
					<artifactId>jboss-logging</artifactId>
					<version>3.3.1.Final</version>
				</dependency>
				<!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
				<dependency>
					<groupId>com.fasterxml</groupId>
					<artifactId>classmate</artifactId>
					<version>1.3.3</version>
				</dependency>
				<dependency>
					<groupId>com.github.pagehelper</groupId>
					<artifactId>pagehelper</artifactId>
					<version>5.0.0</version>
				</dependency>
				<dependency>
					<groupId>com.alibaba</groupId>
					<artifactId>dubbo</artifactId>
					<version>2.5.3</version>
				</dependency>
				<dependency>
					<groupId>org.apache.zookeeper</groupId>
					<artifactId>zookeeper</artifactId>
					<version>3.4.7</version>
				</dependency>
				<dependency>
					<groupId>com.github.sgroschupf</groupId>
					<artifactId>zkclient</artifactId>
					<version>0.1</version>
				</dependency>
			</dependencies>
		</project>
           
  1. web.xml(删除了前端控制器Servlet的配置)
<?xml version="1.0" encoding="UTF-8"?>
		<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
		  <display-name>spring_demo</display-name>
		  <welcome-file-list>
			<welcome-file>index.jsp</welcome-file>
		  </welcome-file-list>
		  
		  <filter>
			<filter-name>CharacterEncodingFilter</filter-name>
			<filter-class>
				org.springframework.web.filter.CharacterEncodingFilter
			</filter-class>
			<init-param>
				<param-name>encoding</param-name>
				<param-value>utf-8</param-value>
			</init-param>
		  </filter>
		  
		  <filter-mapping>
			<filter-name>CharacterEncodingFilter</filter-name>
			<url-pattern>/*</url-pattern>
		  </filter-mapping> 
		  
		  <context-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:applicationContext.xml</param-value>
		  </context-param>
		  <listener>
			<listener-class>
				org.springframework.web.context.ContextLoaderListener
			</listener-class>
		  </listener>
		</web-app>
           

3)删除了springmvc.xml

4)删除了com.yy.controller包和所有jsp頁面

二、在linux中安裝zookeeper

1)測試java環境

java -version

2)SSH上傳提示:encountered 1 errors during the transfer錯誤解決辦法

上傳的時候 windows 的路徑不能存在括号“()”, 把括号去掉 重新上傳就好了 或

把檔案移到不帶小括号的路徑下就可以正常上傳檔案了。

3)zookeeper是java開發的可以運作在windows、linux環境。需要先安裝jdk。

安裝步驟:

第一步:安裝jdk

第二步:把zookeeper的壓縮包上傳到linux系統。

第三步:解壓縮壓縮包

tar -zxvf zookeeper-3.4.6.tar.gz
           

第四步:進入zookeeper-3.4.6目錄,建立data檔案夾。

mkdir data
           

第五步:進入conf檔案夾,把zoo_sample.cfg改名為zoo.cfg

第六步:編輯 zoo.cfg(vim zoo.cfg),修改data屬性:dataDir=/root/zookeeper-3.4.6/data

第七步:啟動zookeeper

關閉:

檢視狀态:

成功啟動顯示如下内容:

	JMX enabled by default
	Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
	Mode: standalone
           

注意:需要關閉防火牆。

service iptables stop
           

永久關閉修改配置開機不啟動防火牆:

chkconfig iptables off
           

如果不能成功啟動zookeeper,需要删除data目錄下的zookeeper_server.pid檔案。

三、通過dubbo在表示層中通路業務邏輯層中的元件

  1. 業務邏輯項目中釋出元件(在applicationContext.xml中添加)
<!-- 使用dubbo釋出服務 -->
<dubbo:application name="ssm_dept2_m"/>

<!-- address為虛拟機zookeeper位址及端口号,叢集時候可以配置多個位址 -->
<dubbo:registry protocol="zookeeper" address="192.168.220.129:2181"></dubbo:registry>

<!-- 用dubbo協定在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 聲明需要暴露的接口,ref為該接口的實作類,為自動掃描到的元件 -->
<dubbo:service interface="com.yy.service.DeptService" ref="deptServiceImpl"></dubbo:service>
<dubbo:service interface="com.yy.service.EmpService" ref="empServiceImpl"></dubbo:service>
           
  1. 在表示層項目中引用元件(在springmvc.xml中添加)
<!-- 引用dubbo服務-->
<!-- name為目前項目名即可 -->
<dubbo:application name="ssm_dept2_vc"/>

<dubbo:registry protocol="zookeeper" address="192.168.220.129:2181"></dubbo:registry>

<!-- id相當于引用後為引用bean起的id -->
<dubbo:reference interface="com.yy.service.DeptService" id="deptService"></dubbo:reference>
<dubbo:reference interface="com.yy.service.EmpService" id="empService"></dubbo:reference>
           
  1. 先啟動業務邏輯項目,在啟動表示層項目(注意:修改兩個項目中tomcat的端口号不相同)
  2. 在浏覽器中通路action,測試

四、說明

Dubbo是什麼?

Dubbo是一個分布式服務架構,緻力于提供高性能和透明化的RPC遠端服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務架構,如果沒有分布式的需求,其實是不需要用的,隻有在分布式的時候,才有dubbo這

樣的分布式服務架構的需求,并且本質上是個服務調用的東東,說白了就是個遠端服務調用的分布式架構(告别Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上注冊)

其核心部分包含:

  1. 遠端通訊: 提供對多種基于長連接配接的NIO架構抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的資訊交換方式。
  2. 叢集容錯: 提供基于接口方法的透明遠端過程調用,包括多協定支援,以及軟負載均衡,失敗容錯,位址路由,動态配置等叢集支援。
  3. 自動發現: 基于注冊中心目錄服務,使服務消費方能動态的查找服務提供方,使位址透明,使服務提供方可以平滑增加或減少機器。

Dubbo能做什麼?

  1. 透明化的遠端方法調用,就像調用本地方法一樣調用遠端方法,隻需簡單配置,沒有任何API侵入。
  2. 軟負載均衡及容錯機制,可在内網替代F5等硬體負載均衡器,降低成本,減少單點。
  3. 服務自動注冊與發現,不再需要寫死服務提供方位址,注冊中心基于接口名查詢服務提供者的IP位址,并且能夠平滑添加或删除服務提供者。

繼續閱讀