dubbo-zookeeper介紹及項目開發

一、dubbo介紹

  1. dubbo是什麼?
    本質:一個Jar包,一個分佈式框架,,一個遠程服務調用的分佈式框架。 既然是新手教學,肯定很多同學不明白什麼是分佈式和遠程服務調用,爲什麼要分佈式,爲什麼要 遠程調用。
    在這裏插入圖片描述

  2. Dubbo的好處?

    1. 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵 入。
    2. 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
    3. 服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP 地址,並且能夠平滑添加或刪除服務提供者。
    4. Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載 Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。
  3. dubbo架構
    在這裏插入圖片描述

     0. 服務容器負責啓動,加載,運行服務提供者。 
     1. 服務提供者(生產者)在啓動時,向註冊中心註冊自己提供的服務。
     2. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
     3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據 給消費者。 
     4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。 
     5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
    

二、zookeeper介紹

  1. zookeeper介紹
    1. zookeeper實際上是yahoo開發的,用於分佈式中一致性處理的框架。

    2. 背景介紹:最初其作爲研發Hadoop時的副產品。由於分佈式系統中一致性 處理較爲困難,其他的分佈式系統沒有必要 費勁重複造輪子,故隨後的分佈式 系統中大量應用了zookeeper。故隨後的大部分分佈式系統中大量應用了 zookeeper,以至於zookeeper成爲了各種分佈式系統的基礎組件,其地位之 重要,可想而知。(類比下之前學習過的netty,netty是對 socket 網絡編程的優秀包裝,是一個通訊組件框架。不瞭解netty的可以再花五分鐘學習下,這麼說吧,Netty很簡單,其實就是個Jar包,是作爲通訊組件用的)

    3. 具體應用場景:著名的hadoop、kafka、dubbo 都是基於zookeeper而構 建。

    4. 好處:保證在分佈式環境下數據的最終一致性,這個就是zookeeper能解決 的問題。

    5. 上面提到了很多次一致性,那麼究竟什麼是一致性,給大家補充下這個概 念:
      所謂的一致性,實際上就是圍繞着“看見”來的。誰能看見?能否看見?什麼時 候看見?
      舉個例子:
      淘寶後臺賣家,在後臺上架一件大促的商品,通過服務器A 提交到主數據庫,假設剛提交後立馬就有用戶去通過應用服務器B去從數據庫查 詢該商品,就會出現一個現象,賣家已經更新成功了,然而買家卻看不到;
      而經 過一段時間後,主數據庫的數據同步到了從數據庫,買家才能查到。(真技術 文)

       假設賣家更新成功之後買家立馬就能看到賣家的更新,則稱爲強一致性; 
       如果賣家更新成功後買家不能看到賣家更新的內容,則稱爲弱一致性; 
       而賣家更新成功後,買家經過一段時間最終能看到賣家的更新,則稱爲最終一致性。
      

三、項目開發及配置文件

  1. dubbo項目目錄結構(maven)
    注: spa_parent、spa_common、spa_interface建立後,maven工程先測試安裝下;
    spa_common(無骨架):存放實體類,工具類等;
    spa_interface(無骨架):存放接口等(如:service接口);
    spa_provider(webapp骨架):存放dao層接口、mapper映射文件和service接口實現類等;
    spa_web(webapp骨架):controller層代碼、後臺項目代碼及頁面代碼等。
    在這裏插入圖片描述

  2. pom依賴
    spa_common:jar包

    <packaging>jar</packaging>
    

    spa_interface:jar包,依賴spa_common

    <packaging>jar</packaging>
    <dependencies>
            <dependency>
                <groupId>com.sys</groupId>
                <artifactId>spa_common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    

    spa_provider:war包,依賴spa_interface

    <packaging>war</packaging>
     <dependencies>
         <dependency>
            <groupId>com.sys</groupId>
            <artifactId>spa_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>8081</port>
                    <!-- 請求路徑 -->
                    <path>/</path>
                </configuration>
            </plugin>
    
        </plugins>
    </build>
    

    spa_web:war包,依賴spa_interface

    <packaging>war</packaging>
    <dependencies>
    	   <dependency>
    	         <groupId>com.sys</groupId>
    	         <artifactId>spa_interface</artifactId>
    	         <version>1.0-SNAPSHOT</version>
    	    </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>8082</port>
                    <!-- 請求路徑 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  3. resources資源配置文件

    1. spa_provicer
      spring-service.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:context="http://www.springframework.org/schema/context"
             xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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://code.alibabatech.com/schema/dubbo
                                  http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                                  http://www.springframework.org/schema/context
                                  http://www.springframework.org/schema/context/spring-context.xsd">
          <!-- 指定應用名稱 -->
          <dubbo:application name="spa_provider"/>
          <!--指定暴露服務的端口,如果不指定默認爲20880-->
          <dubbo:protocol name="dubbo" port="20887"/>
          <!--指定服務註冊中心地址-->
          <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
          <!--批量掃描,發佈服務-->
          <dubbo:annotation package="com.sys.service"/>
      </beans>
      

      spring-dao.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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
      							http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
      
          <!--數據源-->
          <bean id="dataSource"
                class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
              <property name="username" value="root" />
              <property name="password" value="root" />
              <property name="driverClassName" value="com.mysql.jdbc.Driver" />
              <property name="url" value="jdbc:mysql://localhost:3306/spa_dubbo?characterEncoding=UTF-8" />
          </bean>
          <!--spring和mybatis整合的工廠bean-->
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <property name="configLocation" value="classpath:SqlMapConfig.xml" />
          </bean>
          <!--批量掃描接口生成代理對象-->
          <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              <!--指定接口所在的包-->
              <property name="basePackage" value="com.sys.dao" />
          </bean>
      </beans>
      

      spring-tx.xml
      <property name="dataSource" ref="dataSource"/>ref="dataSource"的dataSource書寫時報錯,不用管,加載時自動加載

      <?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"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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/tx
                              http://www.springframework.org/schema/tx/spring-tx.xsd
                              http://www.springframework.org/schema/context
                              http://www.springframework.org/schema/context/spring-context.xsd">
          <!-- 事務管理器  -->
          <bean id="transactionManager"
                class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"/>
          </bean>
          <!--
              開啓事務控制的註解支持
              注意:此處必須加入proxy-target-class="true",
                    需要進行事務控制,會由Spring框架產生代理對象,
                    Dubbo需要將Service發佈爲服務,要求必須使用cglib創建代理對象。
          -->
          <tx:annotation-driven transaction-manager="transactionManager"
                                proxy-target-class="true"/>
      </beans>
      

      SqlMapConfig.xml

      <?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>
          <plugins>
              <!-- com.github.pagehelper 爲 PageHelper 類所在包名 -->
              <plugin interceptor="com.github.pagehelper.PageHelper">
                  <!-- 設置數據庫類型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六種數據庫-->
                  <property name="dialect" value="mysql"/>
              </plugin>
          </plugins>
      </configuration>
      
    2. spa_web
      springmvc.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:context="http://www.springframework.org/schema/context"
             xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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://code.alibabatech.com/schema/dubbo
      						http://code.alibabatech.com/schema/dubbo/dubbo.xsd
      						http://www.springframework.org/schema/context
      						http://www.springframework.org/schema/context/spring-context.xsd">
          <mvc:annotation-driven/>
          <dubbo:annotation package="com.sys"/>
          <context:component-scan base-package="com.sys"/>
          <mvc:annotation-driven>
              <mvc:message-converters register-defaults="true">
                  <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                      <property name="supportedMediaTypes" value="application/json"/>
                      <property name="features">
                          <list>
                              <value>WriteMapNullValue</value>
                              <value>WriteDateUseDateFormat</value>
                          </list>
                      </property>
                  </bean>
              </mvc:message-converters>
          </mvc:annotation-driven>
          <!-- 指定應用名稱 -->
           <dubbo:application name="spa-web" />
          <!--指定服務註冊中心地址-->
           <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
      
          <!--
              超時全局設置 10分鐘
              check=false 不檢查服務提供方,開發階段建議設置爲false
              check=true 啓動時檢查服務提供方,如果服務提供方沒有啓動則報錯
          -->
              <dubbo:consumer timeout="600000" check="false"/>
          <!--文件上傳組件-->
          <bean id="multipartResolver"
                class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
              <property name="maxUploadSize" value="104857600"/>
              <property name="maxInMemorySize" value="4096"/>
              <property name="defaultEncoding" value="UTF-8"/>
          </bean>
          <!--  <import resource="spring-redis.xml"></import>
            <import resource="spring-security.xml"></import>-->
      </beans>
      
  4. 註解使用

    1. service接口實現類使用dubbo的service註解@Service(interfaceClass = SpaItemService.class)
    2. controller層調用接口,使用註解@Reference,如:
      @Reference
      private SpaItemService spaItemService;
      
  5. web.xml配置

    1. spa_provider
      web.xml,加載spring容器
      <!DOCTYPE web-app PUBLIC
       "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
       "http://java.sun.com/dtd/web-app_2_3.dtd" >
      
      <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!-- 加載spring容器 -->
        <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:spring*.xml</param-value>
        </context-param>
        <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
      </web-app>
      
    2. spa_web
      web.xml
      <!DOCTYPE web-app PUBLIC
              "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
              "http://java.sun.com/dtd/web-app_2_3.dtd" >
      
      <web-app>
        <display-name>Archetype Created Web Application</display-name>
      
        <!-- 解決post亂碼 -->
        <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>
          <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
          </init-param>
        </filter>
        <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- 指定加載的配置文件 ,通過參數contextConfigLocation加載 -->
          <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>springmvc</servlet-name>
          <url-pattern>*.do</url-pattern>
        </servlet-mapping>
      
      </web-app>
      
      
  6. 啓動事項
    兩個web項目都要啓動(spa_provider和spa_web),還要啓動zookeeper服務;
    當spa_common、spa_interface項目有改動時,要重新 install 安裝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章