maven搭建ssm分模組框架+dubbo (myeclipse版) (三)
前面已經把ssm的框架搭好了,在第二篇的地址可以下載到原始碼,部落格中也有搭建ssm相關的教程地址,相信大家可以搭建起來的
接下來就把dubbo引入進去了
關於dubbo的一些概念性的東西 請大家自行百度 或google一下吧
官方的地址是 dubbo.io
我這邊使用的是官方推薦的zookeeper來 排程dubbo服務的 zookeeper和dubbo一樣是分散式模式的
有四種註冊中心模式
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\zookeeper-3.4.5\\data
dataLogDir=D:\\zookeeper-3.4 .5\\log
# the port at which the clients will connect
clientPort=2181
然後就是 pom.xml引入的jar包
<!-- dubbo start -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version >
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo end -->
jar包引入之後,就是服務消費者 和 提供者檔案配置了,我之前 搭好的ssm框架中 service 是用來提供 也就是用來暴露服務的那層
而web 是用來消費 也就是引用服務的那層
web 和 service 都在pom中引用了interface層,當dubbo使用起來之後,web層就只需要Interface層的jar包 就可以呼叫service 提供的服務了,也算是達到了解耦 ,看起來web層跟service是沒有任何的聯絡
interface層 只是介面
public interface DubboDao {
public void dubboTest();
}
service層 服務提供者配置檔案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="ssmDemo-service" />
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 用dubbo協議在20880埠暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- dubbo釋出服務 配置資訊表 -->
<dubbo:service interface="cn.com.test.dao.DubboDao" ref="DubboService"/>
</beans>
對於這個埠,是使用zookeeper預設的2181埠
<dubbo:registry address="zookeeper://localhost:2181"/>
dubbo的埠也是使用預設的
<dubbo:protocol name="dubbo" port="20880" />
服務的暴露,interface的值是interface層介面的路徑,ref的值則是service層實現 @Service() 註解設定的名稱
<dubbo:service interface="cn.com.test.dao.DubboDao" ref="DubboService"/>
=========================================
DubboServiceImpl.java
@Service("DubboService")
public class DubboServiceImpl implements DubboDao{
@Override
public void dubboTest() {
System.out.println("web層引用service服務成功");
}
}
service層配置好之後,我們要怎麼讓不是web工程的service工程讀取配置檔案呢,這裡是直接用了一個main方法來載入這些配置檔案
main.java
public class TestMain {
public static void main(String[] args){
String[] xmls=new String[]{"classpath:spring-mybatis.xml","classpath:dubbo-provider.xml"};
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(xmls);
context.start();
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} // 按任意鍵退出
}
}
web層 服務消費者配置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="ssmDemo-web" />
<!-- 使用zookeeper註冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 引用service-authority的遠端服務 介面鑑權服務 -->
<dubbo:reference id="DubboDao" interface="cn.com.test.dao.DubboDao" check="false" />
</beans>
對於 id的名稱沒有特定的要求,可以跟介面的名稱一樣,interface的值也就是介面的路徑,check=false是在工程啟動的時候不會去檢查 對應的服務是否已經註冊到註冊中心,不會報該服務沒有被提供的異常錯誤
<dubbo:reference id="DubboDao" interface="cn.com.test.dao.DubboDao" check="false" />
之後要讓容器載入dubbo-consumer.xml檔案,我是放在web.xml中,大家也可以考慮把它在applicationContext.xml中使用Import resource引入進去。
web.xml
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml,classpath:dubbo-consumer.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
PS:之前提供的ssm框架 web層的pom中忘記引入interface層了,這裡補上
<dependency>
<groupId>cn.com.test</groupId>
<artifactId>ssmDemo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
接下來要做的就是先將zookeeper跑起來,在zookeeper的目錄bin下,啟動zkServer.cmd
然後將service的main方法跑起來
然後把web層加入到tomcat 跑起來
最後訪問頁面 localhost:8080/test/dubbo
TestMain列印的資訊
web層controller列印資訊
zookeeper的日誌,我是把服務停止,但是可以看出之前服務是成功註冊到zookeeper上了
還有一個小問題
執行的時候可能會遇到解析不了XML檔案的錯誤SAXException:
在maven的本地倉庫下找到maven->com->alibaba->dubbo->2.5.3->dubbo-2.5.3.jar (具體的看自己的本地倉庫) 解壓它獲得dubbo.xsd檔案
然後開啟Eclipse:1. Window->Preferences->XML->XML Catalog->User Specified Entries視窗中,選擇Add 按紐
順便再說一下,下載的ssm框架 使用的話需要 clean install一下