1. 程式人生 > 實用技巧 >分散式架構Duboo+Zookeeper的基礎使用

分散式架構Duboo+Zookeeper的基礎使用

系統架構

垂直專案架構

特點
	不管專案多複雜,有多少個模組,全在一個專案中編寫
	專案部署在一個web容器上,適合於 訪問量小,使用者數不多的業務

結構圖

缺點

  1. 耦合度比較高
    所有功能模板程式碼都放到了一起,
  2. 不利於擴充套件
    寫好了, 測試完了,想要加一個模組非常的困難
    如果果某個功能出錯有問題,所有的功能都需要再重新打包編譯,部署效率極低。
    上線時, 把專案停掉
  3. 不利於團隊協作維護
    團隊協作難度高,如多人使用SVN/git很可能在同一個功能上,多人同時進行了修改,作為一個大而全的專案,可能個人只是需要開發其中一個小的模組的需求,卻需要匯入整個專案全量的程式碼。

優點:結構簡單

SOA架構

SOA(Service-Oriented Architecture)它是一種支援面向服務的架構。(分散式架構)

特點:將傳統專案中的一個模組,拆分成一個一個專案
優點
1. 降低模組之間的耦合度
2. 利於擴充套件
3. 利於維護

缺點
1. 結構複雜
2. 對於小型專案 ,成本比較高

特點:
1. 模組的拆分
	如果某一個系統訪問量比較大時, 可以多部署幾臺tomcat,
	當出現高併發的時候 , 通過nigix負載均衡,進行分配訪問
	如果今後, 想要再新增 一個模組, 可以直接在寫一個專案,弄臺新機器,直接上線
2. 業務功能的拆分
	除了把對應模組拆成一個系統外, 還可以把我們的三層架構拆成對應的服務,把Controller做為一個系統,Dao和Service做為一個系統
	如果呼叫多了,一臺不夠使用者了, 可以多部署幾臺
3. 存在的問題
	在以前Controller呼叫Service,通過注入進行呼叫,注入屬於是Spring的
	當Controller在一個伺服器中, Service在另一臺伺服器,是沒有辦法注入的
	此時, 可以採用一個技術叫Dubbox,可以實現跨tomcat 注入 遠端呼叫
	Dubbo是的跨伺服器,注入的技術,這麼多服務,到底是認認證呼叫誰,怎麼知道的呢
	通過zookeeper註冊中心,所有的服務都到zookeeper當中註冊一下, 註冊後, 
	今後服務之間的呼叫,就可以通過zookeeper找到對應的服務,通過Dubbo進入注入

Dubbo

什麼是Dubbo

概述

Dubbo是阿里巴巴內部使用的分散式業務框架,2012年由阿里巴巴開源。
由於Dubbo在阿里內部經過廣泛的業務驗證,在很短時間內,Dubbo就被許多網際網路公司所採用,併產生了許多衍生版本,如網易,京東,新浪,噹噹等等。
由於阿里策略變化,2014年10月Dubbo停止維護。隨後部分網際網路公司公開了自行維護的Dubbo版本,比較著名的如噹噹DubboX,新浪Motan等。
經過三年的沉寂,在2017年9月,阿里宣佈重啟Dubbo專案,並決策在未來對開源進行長期持續的投入。隨後Dubbo開始了密集的更新,並將停擺三年以來大量分支上的特性及缺陷修正快速整合。
2018.2月,阿里將Dubbo捐獻給Apache基金會,Dubbo成為Apache孵化器專案。

基於rpc

rpc遠端過程呼叫協議 是JDK底層提出的協議,Dubbo只是對這個協議的實現的一個框架技術 rpc協議就是跨伺服器,跨tomcat ,可以從一個專案呼叫另一個專案中的方法

作用

跨專案呼叫方法
從一個專案中的Controller可以呼叫另一個專案中的service方法

同類型的技術有哪些

  1. Dubbo
  2. DubboX
    優點:傳輸效率快
    缺點:Controller和Service兩個專案必須都是Java語言實現
  3. springCloud
  4. webService技術
    cfx:使用的soap協議,傳輸的是xml資料

如何使用

  1. 服務層註解
    service實現類上寫@service註解
    寫此註解的時候,注意先包,選的是阿里dubbo下的包

  2. Controlle注入
    使用@refrence註解來進行注入
    選擇也是dubbo下的

  3. pojo傳輸
    如果Controller和service之間傳輸pojo實體類,
    那麼實體類必須實現Java的序列化介面

    序列化

網路傳輸,是通過插在電腦上的網線(雙絞線)進行
網線當中傳輸入的是模擬訊號,波浪形式的訊號,有高電位和底電位
可以使用高底電位 代表 0 或 1 網線是插在電腦網絡卡上,網絡卡我們又稱數模轉換器 數字訊號和模擬資訊進行轉換 網路傳輸是模擬資訊 計算機處理時, 數字訊號
轉換成數字訊號後, 進入作業系統, 再根據相應的埠號找到對應的服務處理
在Java中只要告訴它,實現序列化介面,
JVM就會自動的把實現類轉換成對應的訊號進行傳輸

Dubbo呼叫流程

  1. 所有的服務都要在Zookeeper註冊中心當中進入註冊
    每一個服務都有自己的配置檔案,
    在配置檔案當中配置好自己埠號和地址
    然後把埠號和地址註冊在zookeeper註冊中心統一管理
  2. Zookeeper註冊中心 ,管理服務提供方伺服器的ip和埠,並知道哪臺機器啟動了,哪臺機器關閉了
  3. 服務呼叫方Controller專案詢問ZooKeeper可以提供服務的IP和埠
  4. Zookeeper返回可以使用的IP和埠號給Controller
  5. Controller使用IP+埠+介面+方法呼叫,到指定的服務中呼叫對應的方法
  6. 服務返回對應的結果

Zookeeper

概述

Zookeeper 是 Apacahe Hadoop 的子專案
是一個樹型的目錄服務,支援變更推送
最早是用在大資料當中
適合作為Dubbox 服務的註冊中心

作用

zookeeper 註冊中心
註冊中心負責服務地址的註冊與查詢,相當於目錄服務
服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小。

安裝

在Linux環境下安裝
確保Linux網路環境正常

  1. 安裝JDK
rm -f /var/run/yum.pid
yum -y install java-1.8.0-openjdk.x86_64
java -version

進入Root使用者

執行安裝jdk
yum -y install java-1.8.0-openjdk.x86_64

檢視版本號
java -version

  1. 把 zookeeper 的壓縮包,上傳到Linux系統
  2. 解壓縮壓縮包
    tar -zxvf zookeeper-3.4.6.tar.gz
  3. 進入conf目錄 ,把 zoo_sample.cfg 改名為 zoo.cfg
    mv zoo_sample.cfg zoo.cfg
  4. 進入bin目錄,啟動服務輸入命令
    ./zkServer.sh start
  5. 檢視狀態
    ./zkServer.sh status

    關閉服務
    ./zkServer.sh stop
    關閉防火牆
    systemctl stop firewalld.service

Duboo呼叫Zookeeper例項

  1. 建立Maven工程
  2. 引入依賴
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!-- Spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.2.7.RELEASE</version>
    </dependency>
    <!-- dubbo相關 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.6</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
    </dependency>
    <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
    </dependency>
    <dependency>
      <groupId>javassist</groupId>
      <artifactId>javassist</artifactId>
      <version>3.11.0.GA</version>
    </dependency>
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.32.Final</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.0.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>4.0.1</version>
    </dependency>
  </dependencies>
  1. 新增web.xml配置檔案
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 載入spring容器 -->
  <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>

  1. 在resouces中新增applicationContext-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:p="http://www.springframework.org/schema/p"
       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="dubboxdemo-service"/>
    <!-- 配置連線zookeeper的IP和埠 -->
    <dubbo:registry address="zookeeper://192.168.0.108:2181"/>
    <!-- 配置包掃描, 在這個包下面的實現類中使用@Service註解才會生效 -->
    <dubbo:annotation package="com.dj.service"/>
</beans>

  1. 編寫提供方

    測試啟動Tomcat
  2. 編寫消費方
    建立Maven web專案
  3. 引入pom依賴
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.2.7.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- Spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- dubbo相關 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.6</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
    </dependency>
    <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
    </dependency>
    <dependency>
      <groupId>javassist</groupId>
      <artifactId>javassist</artifactId>
      <version>3.11.0.GA</version>
    </dependency>

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.32.Final</version>
    </dependency>
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.0.1</version>
    </dependency>

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>4.0.1</version>
    </dependency>

  </dependencies>
  1. 新增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>

  <!-- 配置springMvc前端控制器  -->
  <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:applicationContext-web.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 攔截所有,不包括jsp,包含.js .png.css     建議使用  -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>



        
  1. 在resouces中新增applicationContext-web.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: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">

    <!--註解掃描-->
    <context:component-scan base-package="com.dj"/>

    <!-- 註解驅動 -->
    <mvc:annotation-driven >
        <!-- 將傳輸的字串強制轉換成utf-8編碼, 防止中文亂碼  -->
        <mvc:message-converters register-defaults="false">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 給當前專案服務起個名-->
    <dubbo:application name="dubboxdemo-web" />
    <!-- 配置連線zookepper  -->
    <dubbo:registry address="zookeeper://192.168.0.108:2181"/>
    <!-- 配置包掃描, 只有在這個包下面才可以注入service -->
    <dubbo:annotation package="com.dj.controller" />
</beans>

  1. 在Java資料夾中, 建立Controller

  2. 配置tomcat啟動 注意埠號

  3. 建立service介面和提供方一樣

  4. 在Controller注入service

    注意:要使用alibaba的duboo註解

  5. 先啟動提供方 後啟動消費方測試

    通過消費方的Controller呼叫提供方的方法

注意事項

  1. zookeeper的埠
  2. Linux的ip地址
  3. linux防火牆關閉
  4. 提供方和消費方的埠
  5. 註解使用alibaba的註解