SSM整合+Dubbo+zookeeper-3.4.6


最近剛好有點時間,特意來整合一下項目,以后會陸續把前端框架和一些組件也給整合進去,今天就先來整合一下SSM+mysql+dubbo+zookeeper來做一個用戶列表功能。關於理論性的知識,大家可以自行查閱下資料,這里重點講解一下怎么搭建這一套開發環境。

背景

隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。

  • 單一應用架構
    • 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
    • 此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。
    • 早期的JSP,ASP,PHP都是把數據操作寫在前端,功能相當簡單。
  • 垂直應用架構
    • 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
    • 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。現在很多非互聯網公司仍然采用這種架構設計。
  • 分布式服務架構
    • 當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
    • 此時,用於提高業務復用及整合的 分布式服務框架(RPC) 是關鍵。
  • 流動計算架構
    • 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。
    • 此時,用於提高機器利用率的 資源調度和治理中心(SOA) 是關鍵。

開發工具:

這里貼出自己的開發工具和版本號,因為有的時候可能會因為版本號而造成很多不必要的沖突。

zookeeper-3.4.6+windows系統+mysql 5.6+jdk7+eclipse+tomcat7+dubbo 2.5.3

zookeeper:

下載zookeeper注冊中心,下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下載后解壓即可。


然后進入conf里面,改一下我們的配置,打開zoo.cfg,有得可能不叫這個名字,把zoo_sample.cfg改成zoo.cfg

clientPort=2181
#server.1=127.0.0.1:3881:4881
#server.2=127.0.0.1:3882:4882
#server.3=127.0.0.1:3883:4883




dataDir=../data
dataLogDir=../log


# The number of milliseconds of each tick
tickTime=10000
# 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=../data
#dataLogDir=../dataLog

# the port at which the clients will connect
#clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
當這些配置項配置好后,你現在就可以啟動 Zookeeper 了,啟動后要檢查 Zookeeper 是否已經在服務,可以通過 netstat – ano 命令查看是否有你配置的 clientPort 端口號在監聽服務。

  • server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。


最后到bin目錄下面啟動,客戶端和服務端。


Dubbo:

需要下載:dubbo-admin-2.5.3的war

然后Tomcat啟動一下。這里有兩種啟動方式,一種是找到自己的tomcat安裝目錄,替換掉tomcat/webapps下自帶的ROOT文件夾內容(即替換tomcat的啟動主頁),將下載的war包解壓到webapps/ROOT中,直接替換即可。

我用的是下面這種,比較簡單點。打開eclipse里面的tomcat管理頁面。


然后選擇第二個,找到自己剛剛下載的war包,部署並且啟動一下。

這個時候在瀏覽器輸入自己的ip和端口,我的是localhost:8080


看到這個管理頁面就代表成功了。可以來檢測我們的消費者和生產者了。

SSM整合:

這里先編寫我們的服務端,我把提供服務的統稱為服務端,所以這里先創建一個服務端。

所以這里新建一個項目叫做user-service

Maven引入需要的JAR包

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>user</groupId>
    <artifactId>user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>user-service</artifactId>
  <packaging>jar</packaging>
<!--   <name>user-service Maven Webapp</name>
  <url>http://maven.apache.org</url> -->
      <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 設置 Spring 的版本 -->
	<org.springframework.version>4.1.7.RELEASE</org.springframework.version>
  </properties>
  <dependencies>
   <dependency>
	      <groupId>user-api</groupId>
	      <artifactId>user-api</artifactId>
	      <version>0.0.1-SNAPSHOT</version>
	    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
 
    <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>
    <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>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- 實現slf4j接口並整合 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--2:數據庫相關依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <!-- DAO框架:MyBatis依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!-- mybats自身實現的spring整合依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!-- 3:Servlet web相關依賴 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <!--4:spring依賴 -->
        <!--1)spring核心依賴  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <!--2)spring dao層依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <!--3)spring web相關依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <!-- 4)spring test相關依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <!-- redis客戶端:Jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!-- protostuff序列化依賴 -->
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.0.8</version>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.0.8</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2</version>
        </dependency>
        
         <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
    </dependency>
  </dependencies>
<!--   <build>
    <finalName>user-service</finalName>
  </build> -->
</project>

Web.xml

這里使用contextConfigLocation來加載我們spring的配置文件。
	<servlet>
		<servlet-name>user-service</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置springMVC需要加載的配置文件 spring-dao.xml,spring-service.xml,spring-web.xml 
			Mybatis -> spring -> springMVC -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/spring-*.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>user-service</servlet-name>
		<!-- 默認匹配所有的請求 -->
		<url-pattern>/</url-pattern>
	</servlet-mapping>

配置視圖解析器:

<?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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
        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://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 配置SpringMVC -->
    <!-- 1:開啟SpringMVC注解模式 -->
    <!-- 簡化配置:
        (1)自動注冊DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
        (2)提供一系列:數據綁定,數字和日期的format @NumberFormat,@DataTimeFormat,
            xml,json默認讀寫支持.
     -->
    <mvc:annotation-driven/>

    <!--
        2:靜態資源默認servlet配置
        1:加入對靜態資源的處理:js,gif,png
        2:允許使用"/"做整體映射
     -->
    <mvc:default-servlet-handler/>

    <!--3:配置jsp 顯示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>

    </bean>
     <!--4:掃描web相關的bean -->
    <context:component-scan base-package="com.dubbo.controller"/>
</beans>

建立JDBC屬性文件

jdbc.properties(文件編碼修改為utf-8)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

Spring整合mybatis DAO層

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置整合mybatis過程 -->
    <!-- 1:配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 2:數據庫連接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 配置連接池屬性 -->
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- c3p0連接池的私有屬性 -->
        <property name="maxPoolSize" value="30"/>
        <property name="minPoolSize" value="10"/>
        <!-- 關閉連接后不自動commit -->
        <property name="autoCommitOnClose" value="false"/>
        <!-- 獲取連接超時時間 -->
        <property name="checkoutTimeout" value="1000"/>
        <!-- 當獲取連接失敗重試次數 -->
        <property name="acquireRetryAttempts" value="2"/>
    </bean>

    <!-- 約定大於配置 -->
    <!-- 3:配置SqlSessionFactory對象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入數據庫連接池 -->
        <property name="dataSource"  ref="dataSource"/>
        <!-- 配置MyBatis全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 掃描entity包 使用別名 -->
        <property name="typeAliasesPackage" value="com.dubbo.entity"/>
        <!-- 掃描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 4:配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出需要掃描Dao接口包 -->
        <property name="basePackage" value="com.dubbo.dao"/>
    </bean>

    <!-- RedisDao -->
    <bean id="redisDao" class="com.dubbo.dao.cache.RedisDao">
        <constructor-arg index="0" value="localhost"/>
        <constructor-arg index="1" value="6379"/>
    </bean>
</beans>
redisDao以后會用到,現在先不管。

spring整合service層,開啟事務

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 掃描service包下所有使用注解的類型 -->
    <context:component-scan base-package="com.dubbo.service"/>

    <!-- 配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫連接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基於注解的聲明式事務
        默認使用注解來管理事務行為
    -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
		 <!-- 具體的實現bean -->  
</beans>

mybatis配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置全局屬性 -->
    <settings>
        <!-- 使用jdbc的getGeneratedKeys 獲取數據庫自增主鍵值 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 使用列別名替換列名 默認:true
         select name as title from table
         -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 開啟駝峰命名轉換:Table(create_time) -> Entity(createTime) -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
</configuration>
基本上配置就這些,log4我感覺用處不大,懶得配置了。下面還有有一些mybatis的xml配置,這個后面再講。

mysql:

創建我們的sql

CREATE TABLE `user` (
	`userId` BIGINT (20),
	`userName` VARCHAR (108),
	`account` VARCHAR (108),
	`password` VARCHAR (108),
	`phone` VARCHAR (66),
	`address` VARCHAR (108)
); DEFAULT CHARSET=utf8; 

簡單創建幾個字段,隨便加幾條數據就好。

創建實體類:

在創建實體類之前我先把包結構給建立好了;


在我們的entity里面創建一下User的實體類。

public class User implements Serializable{
		private String userId;
		private String userName;
		private String account;
		private String phone;
		private String password;
		private String address;
		public String getUserId() {
			return userId;
		}
		public void setUserId(String userId) {
			this.userId = userId;
		}
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public String getAccount() {
			return account;
		}
		public void setAccount(String account) {
			this.account = account;
		}
		public String getPhone() {
			return phone;
		}
		public void setPhone(String phone) {
			this.phone = phone;
		}
		public String getAddress() {
			return address;
		}
		public void setAddress(String address) {
			this.address = address;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		
}

編寫dao和service

public interface UserDao {
			public List<User> getListUser();
}

public interface UserService {
		public List<User> getListUser();
}

@Service
public class UserServiceImpl implements UserService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //注入Service依賴
    @Autowired
    private UserDao userDao;

	/**
	 * @return
	 * @see com.dubbo.service.UserService#getListUser()
	 *<pre>
	 *<li>Author:</li>
	 *<li>Date: 2016年9月23日</li>
	 *</pre>
	 */
	@Override
	public List<User> getListUser() {
		return userDao.getListUser();
	}




}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dubbo.dao.UserDao">
    <!-- 目的:為DAO接口方法提供sql語句配置-->

    <select id="getListUser" resultType="User">
      	SELECT*FROM USER
    </select>
</mapper>

編寫Controller

   @Autowired
    private UserService userService;
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String list(Model model) {
        //獲取列表頁
        List<User> list = userService.getListUser();
        model.addAttribute("list", list);
        //list.jsp + model = ModelAndView
        return "list";// /WEB-INF/jsp/"list".jsp
    }

啟動Tomcat測試:


整合Dubbo和zookeeper

在整合之前首先要明白Dubbo和zookeeper是干嘛用的。

SOA的框架也正是現在網站的系統架構演化史,也從側面反映了我國網民數量的增加和對網站性能的提升。

大型網站系統特點

  (1)高並發、大流量:PV量巨大

  (2)高可用:7*24小時不間斷服務

  (3)海量數據:文件數目分分鍾xxTB

  (4)用戶分布廣泛,網絡情況復雜:網絡運營商

  (5)安全環境惡劣:黑客的攻擊

  (6)需求快速變更,發布頻繁:快速適應市場,滿足用戶需求

  (7)漸進式發展:慢慢地運營出大型網站


例子:

小明作為一個屌絲碼農,有一天創建了一個網站,最開始只是小明一個人在運營,所有的程序都在一個Server里面跑,數據庫訪問和邏輯控制也都寫在jsp文件里面。應用程序、數據庫、文件等所有資源都集中在一台Server上。這就是典型的純jsp網站。



后來他的好朋友小王來了,他覺得小明的網站做的不錯,於是就提出了改造建議,小王可是受過培訓的啊,什么MVC人家可是經常背,於是他們的網站就開始拆分MVC三層了。並且把文件服務器和數據庫單獨部署到一個Server上。

這個時候三台Server平天下,應用和數據服務分離。



再到后來,他們的網站越來越大了,普通的架構已經滿足不了他們了,怎么辦,必須得做集群,必須要有緩存,什么讀寫分離啊,redis啊和反向代理和CDN加速等等,慢慢的開始應用起來。

分布式服務:既然每一個應用系統都需要執行許多相通的業務操作,比如用戶管理、商品管理等,那么可以將這些共用的業務提取出來,獨立部署。


好了,其實dubbo簡單來說就是用來管理我們的服務的,以前我們都是自己調自己的服務,如果服務掛掉的話,那么整個系統就掛掉了,現在是我們把服務交給dubbo去統一管理,而zookeeper是管理我們的dubbo的。

創建user-api;user-api的作用很簡單,作為一個API,把接口暴露出來供我們的客戶端調用。

public interface UserService {
		public List getListUser();
}
修改服務端代碼,這里要修改一下我們的user-service。把他作為一個服務層,只和數據庫進行交互。

Web-xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <!-- 修改servlet版本為3.1 --> <!-- 配置DispatcherServlet --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </context-param> <servlet> <servlet-name>user-service</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springMVC需要加載的配置文件 spring-dao.xml,spring-service.xml,spring-web.xml Mybatis -> spring -> springMVC --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>user-service</servlet-name> <!-- 默認匹配所有的請求 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
這里如果不用<listener>加載的話dubbo服務注冊不上去,具體原因還沒有找到,還有這里加載了兩遍配置文件才起作用,具體原因也還在探索中(迷茫。。)最后一個攔截器,可以不需要,因為我們不通過user-service訪問頁面。
去掉service接口,這里我們通過引入user-api里面的接口,並且也基礎里面的接口,所以user-service里面的接口可以去掉。

創建dubbo配置文件 spring-dubbo.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:p="http://www.springframework.org/schema/p"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	http://code.alibabatech.com/schema/dubbo
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

	
	<!-- 提供方應用信息,用於計算依賴關系 -->
	<dubbo:application name="test_provider" />

	<!-- 使用zookeeper注冊中心暴露服務地址 -->
	<dubbo:registry address="zookeeper://172.16.1.37:2181" />

	<!-- 用dubbo協議在20880端口暴露服務 -->
	<dubbo:protocol name="dubbo" port="20880" />
	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:service interface="com.dubbo.service.UserService"  ref="userService" />
	<!-- 具體的實現bean -->
	<bean id="userService" class="com.dubbo.service.impl.UserServiceImpl" />

	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:service interface="com.dubbo.service.TestService"  ref="testService" />
	<!-- 具體的實現bean -->
	<bean id="testService" class="com.dubbo.service.impl.TestServiceImpl" />
	
	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:service interface="com.dubbo.service.SeckillService"  ref="seckillService" />
	<!-- 具體的實現bean -->
	<bean id="seckillService" class="com.dubbo.service.impl.SeckillServiceImpl" />
	

</beans>

最后啟動Tomcat;

我們使用zk-Inspector,來監控一下zk的服務。



點擊綠色的箭頭,然后開啟監控,我們可以看到

dubbo服務已經注冊成功,然后我們再進入dubbo管理頁面看看。


也創建了三個服務,證明我們的服務端已經開發完成。

客戶端:

這個時候要創建我們的客戶端了,客戶端也采用SSM架構,其實根本不用Mybatis,因為數據交互都交給了我們的客戶端,這里直接把服務端的架構復制過來;
<?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="test_consumer" />

	<!-- 使用zookeeper注冊中心暴露服務地址 -->
	<dubbo:registry address="zookeeper://172.16.1.37:2181" />

	<!-- 用dubbo協議在20880端口暴露服務 -->
	<dubbo:protocol name="dubbo" port="20880" />
		<!-- 聲明需要暴露的服務接口 -->
	<dubbo:reference interface="com.dubbo.service.UserService" id="userService" check="false" />
	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:reference interface="com.dubbo.service.TestService" id="testService" check="false" />
	
	<!-- 聲明需要暴露的服務接口 -->
	<dubbo:reference interface="com.dubbo.service.SeckillService" id="seckillService" check="false" />

</beans>

這里加載一下視圖解析器和dubbo配置就好了。

@Controller
public class UserController {
	
	@Autowired
	private UserService userService;
	@ResponseBody
	 @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String list(Model model) {
        //獲取列表頁
        List list = userService.getListUser();
        model.addAttribute("list", list);
        //list.jsp + model = ModelAndView
        return "list";// /WEB-INF/jsp/"list".jsp
    }
	
}

最后另外啟動一個tomcat。

訪問我們的客戶端





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com