分散式架構Duboo+Zookeeper的基礎使用
系統架構
垂直專案架構
特點
不管專案多複雜,有多少個模組,全在一個專案中編寫
專案部署在一個web容器上,適合於 訪問量小,使用者數不多的業務
結構圖
缺點
- 耦合度比較高
所有功能模板程式碼都放到了一起, - 不利於擴充套件
寫好了, 測試完了,想要加一個模組非常的困難
如果果某個功能出錯有問題,所有的功能都需要再重新打包編譯,部署效率極低。
上線時, 把專案停掉 - 不利於團隊協作維護
團隊協作難度高,如多人使用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方法
同類型的技術有哪些
- Dubbo
- DubboX
優點:傳輸效率快
缺點:Controller和Service兩個專案必須都是Java語言實現 - springCloud
- webService技術
cfx:使用的soap協議,傳輸的是xml資料
如何使用
-
服務層註解
service實現類上寫@service註解
寫此註解的時候,注意先包,選的是阿里dubbo下的包 -
Controlle注入
使用@refrence註解來進行注入
選擇也是dubbo下的 -
pojo傳輸
如果Controller和service之間傳輸pojo實體類,
那麼實體類必須實現Java的序列化介面序列化
網路傳輸,是通過插在電腦上的網線(雙絞線)進行
網線當中傳輸入的是模擬訊號,波浪形式的訊號,有高電位和底電位
可以使用高底電位 代表 0 或 1 網線是插在電腦網絡卡上,網絡卡我們又稱數模轉換器 數字訊號和模擬資訊進行轉換 網路傳輸是模擬資訊 計算機處理時, 數字訊號
轉換成數字訊號後, 進入作業系統, 再根據相應的埠號找到對應的服務處理
在Java中只要告訴它,實現序列化介面,
JVM就會自動的把實現類轉換成對應的訊號進行傳輸
Dubbo呼叫流程
- 所有的服務都要在Zookeeper註冊中心當中進入註冊
每一個服務都有自己的配置檔案,
在配置檔案當中配置好自己埠號和地址
然後把埠號和地址註冊在zookeeper註冊中心統一管理 - Zookeeper註冊中心 ,管理服務提供方伺服器的ip和埠,並知道哪臺機器啟動了,哪臺機器關閉了
- 服務呼叫方Controller專案詢問ZooKeeper可以提供服務的IP和埠
- Zookeeper返回可以使用的IP和埠號給Controller
- Controller使用IP+埠+介面+方法呼叫,到指定的服務中呼叫對應的方法
- 服務返回對應的結果
Zookeeper
概述
Zookeeper 是 Apacahe Hadoop 的子專案
是一個樹型的目錄服務,支援變更推送
最早是用在大資料當中
適合作為Dubbox 服務的註冊中心
作用
zookeeper 註冊中心
註冊中心負責服務地址的註冊與查詢,相當於目錄服務
服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小。
安裝
在Linux環境下安裝
確保Linux網路環境正常
- 安裝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
- 把 zookeeper 的壓縮包,上傳到Linux系統
- 解壓縮壓縮包
tar -zxvf zookeeper-3.4.6.tar.gz - 進入conf目錄 ,把 zoo_sample.cfg 改名為 zoo.cfg
mv zoo_sample.cfg zoo.cfg - 進入bin目錄,啟動服務輸入命令
./zkServer.sh start
- 檢視狀態
./zkServer.sh status
關閉服務
./zkServer.sh stop
關閉防火牆
systemctl stop firewalld.service
Duboo呼叫Zookeeper例項
- 建立Maven工程
- 引入依賴
<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>
- 新增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>
- 在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>
- 編寫提供方
測試啟動Tomcat
- 編寫消費方
建立Maven web專案
- 引入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>
- 新增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>
- 在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>
-
在Java資料夾中, 建立Controller
-
配置tomcat啟動 注意埠號
-
建立service介面和提供方一樣
-
在Controller注入service
注意:要使用alibaba的duboo註解 -
先啟動提供方 後啟動消費方測試
通過消費方的Controller呼叫提供方的方法
注意事項
- zookeeper的埠
- Linux的ip地址
- linux防火牆關閉
- 提供方和消費方的埠
- 註解使用alibaba的註解