學習筆記-Dubbo

官方網站:http://dubbo.apache.org/en-us/
(最右上角可選擇中文版)

一、 Dubbo產生的背景及系統進化理論

互聯網的高速發展,使得網站應用和App應用都面臨巨大的流量洪峯,當大量用戶涌入時,使得應用程序面臨巨大的考驗,甚至崩潰,那麼如何應對呢?

我們傳統的網站架構爲單一應用架構,也就是說,把所有的功能放在一個項目工程中,且部署在一臺服務器上,當訪問量過大時,則單臺服務器的壓力會越來越大。業務的不斷擴展,也使得我們需要不斷添加新的服務器,所以,我們必須要把功能進行拆分。

隨着用戶數的增長和業務的發展,我們拆分的應用將越來越多,應用之間的交互和數據傳輸已不可避免,此時我們就需要將一些核心的功能抽取出來,形成一個公共的服務,不同系統直接調用這些公共服務,提高業務複用。

但是,當我們的服務越來越多,資源的不合理分配也會變得比較嚴重,比如一些訪問量很小的服務,佔用了大量的IT資源,而另外一些應用的資源嚴重不足,服務負載一直高居不下,我們需要能基於訪問流量的情況實時監控和管理各個服務,提高資源的利用率。

二、 集羣與分佈式

1、集中式系統
就是把所有的程序、功能、模塊都集中到一個項目中,部署在一臺服務器上,從而對外提供服務。
2、分佈式系統
分佈:是指在一定的範圍內散開。
分佈式系統就是把所有的程序、功能拆分成不同的子系統,部署在多臺不同的服務器上,這些子系統相互協作共同對外提供服務,而對用戶而言,他並不知道後臺是多少子系統。

三、 分佈式架構

分佈式系統設計的本質就是:如何合理地將一個系統拆分為多個子系統部署到墮胎不同的服務器上。因此需要解決如下問題:
1. 如何合理的拆分系統
2. 拆分後的各個子系統之間如何通信
3. 通信過程如何防止信息攔截和串改問題
4. 可擴展性
5. 數據可靠性和一致性

四、 認識Dubbo

Dubbo是一個分佈式服務治理框架,提供高性能和透明化的RPC遠程服務調用以及服務治理。
Dubbo是阿里巴巴的開源產品,國內大量企業都在使用。官網:
http://dubbo.apache.org/
Dubbo的用途:
1、 RPC遠程調用:dubbo、spring cloud、hessian、thrift、motan、Grpc等
2、 服務治理:dubbo、spring cloud、motan等

五、 認識RPC

RPC(Remote Procedure Call)遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
RPC採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答覆信息,然後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,獲得進程結果,然後調用執行繼續進行。
RPC調用過程的實現:
1、基於tcp協議的RPC:序列化與反序列化、socket、反射
2、基於Http協議的RPC:xml、json、http

六、 Dubbo的整體架構

五大核心部件:

  • Provider:提供服務的服務方(生產者)
  • Consumer:調用遠程服務的服務消費方(消費者)
  • Registry:服務註冊與發現的註冊中心(註冊中心)
  • Monitor:統計服務調用次數和調用時間的監控中心(監控中心)
  • Container:服務運行容器(運行容器)
    在這裏插入圖片描述

七、 第一個Dubbo程序

在開發以及測試環境中,爲了方便,我們經常需要繞過註冊中心,直接進行連接,這就是無註冊中心的點對點直連。
點對點直連實現步驟:
1、 服務提供者取消服務註冊:register=”N/A”
新建Maven項目,新建過程中指定是:
在這裏插入圖片描述
在這裏插入圖片描述
applicationContext.xml是spring的配置文件,具體內容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    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.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

	<import resource="applicationContext-dubbo-provider.xml"/>
	
</beans>

applicationContext-dubbo-provider.xml是Dubbo的配置文件,對於引入的dubbo.xsd文件可以在Eclipse中直接配置本地的:

<?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">
</beans>

在這裏插入圖片描述
Pom文件主要包含spring依賴和Dubbo:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.delta.dubbo</groupId>
	<artifactId>MyDubboService</artifactId>
	<packaging>war</packaging>
	<version>1.0.0</version>
	
	<name>MyDubbo Maven Webapp</name>
	<url>http://maven.apache.org</url>
	
	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.20.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>
	
	<dependencies>
		<!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <!-- zkclient  -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        
        <!--  zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-asm</artifactId>
            <!-- <version>${spring.version}</version> -->
            <version>3.1.4.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- log -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
	</dependencies>
	
	<build>
		<finalName>MyDubbo</finalName>
	</build>
	
</project>

在這裏插入圖片描述
定義實現類:
在這裏插入圖片描述
定義啓動類:
在這裏插入圖片描述
其中,System.in.read();語句的作用是使得程序阻塞在這裏,以保持程序運行。
2、 服務消費者指定訪問的IP以及端口:dubbo://localhost:20880
消費者端的程序結構如下:
在這裏插入圖片描述
同樣該項目是maven的web項目。
Spring的主配置文件:applicationContext.xml中引入dubbo配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" 
    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.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

	<import resource="applicationContext-dubbo-consumer.xml"/>
	
</beans>

Dubbo消費者端的配置文件:applicationContext-dubbo-consumer.xml
在這裏插入圖片描述
需要在MyDubboService-1項目中導出對外調用的接口jar:

在這裏插入圖片描述
將導出的該接口的jar,放到MyDubboClient-1項目中,並在MyDubboClient-1項目中的Pom.xml文件註冊該jar爲依賴。
具體的pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.delta.dubbo</groupId>
	<artifactId>MyDubboClient</artifactId>
	<packaging>war</packaging>
	<version>1.0.0</version>

	<name>MyDubboClient Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>4.3.20.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>
	
	<dependencies>
		<!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        
        <!-- zkclient  -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        
        <!--  zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
        
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-asm</artifactId>
            <!-- <version>${spring.version}</version> -->
            <version>3.1.4.RELEASE</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- log -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        
        <!-- Local jar -->
        <dependency>
        	<groupId>com.delta.dubbo.service</groupId>
        	<artifactId>service</artifactId>
        	<version>1.0.0</version>
        	<scope>system</scope>
        	<systemPath>${basedir}\src\main\webapp\WEB-INF\lib\service-1.0.0.jar</systemPath>
        </dependency>
        
	</dependencies>

	<build>
		<finalName>MyDubboClient</finalName>
	</build>

</project>

定義啓動主函數:
在這裏插入圖片描述
3、啓動驗證:運行MyDubboService-1中的主函數
在這裏插入圖片描述
具體輸出信息如下:

[22/10/18 01:18:06:006 CST] main  INFO support.ClassPathXmlApplicationContext: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1: display name [org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1]; startup date [Mon Oct 22 13:18:06 CST 2018]; root of context hierarchy
[22/10/18 01:18:06:006 CST] main  INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from class path resource [applicationContext.xml]
[22/10/18 01:18:07:007 CST] main  INFO xml.XmlBeanDefinitionReader: Loading XML bean definitions from class path resource [applicationContext-dubbo-provider.xml]
[22/10/18 01:18:07:007 CST] main  INFO logger.LoggerFactory: using logger: com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter
[22/10/18 01:18:07:007 CST] main  INFO support.ClassPathXmlApplicationContext: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@20fa23c1]: org.springframework.beans.factory.support.DefaultListableBeanFactory@3b6eb2ec
[22/10/18 01:18:07:007 CST] main  INFO support.DefaultListableBeanFactory: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@3b6eb2ec: defining beans [helloService,MyDubboService-1,com.delta.dubbo.service.ServiceHello]; root of factory hierarchy
[22/10/18 01:18:07:007 CST] main  INFO config.AbstractConfig:  [DUBBO] The service ready on spring started. service: com.delta.dubbo.service.ServiceHello, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.delta.dubbo.service.ServiceHello to local registry, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.delta.dubbo.service.ServiceHello to url dubbo://192.168.110.1:20880/com.delta.dubbo.service.ServiceHello?anyhost=true&application=MyDubboService-1&dubbo=2.5.3&interface=com.delta.dubbo.service.ServiceHello&methods=hello&pid=9256&side=provider&timestamp=1540185487828, dubbo version: 2.5.3, current host: 127.0.0.1
[22/10/18 01:18:08:008 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.110.1:20880, dubbo version: 2.5.3, current host: 127.0.0.1

運行MyDubboClient-1中的主函數:
在這裏插入圖片描述

八、 註冊中心

Multicast註冊中心(本地調試,不會在生產環境中使用)
特點:
(1) 不需要安裝和啓動任何中心節點,只要服務提供者與服務消費者的廣播地址一樣,就可以相互發現。
(2) 組播地址段:224.0.0.0 ~ 239.255.255.255
(3) 組播只適合小規模應用或開發調試使用。
實現:
對於“Provider”只需要修改“applicationContext-dubbo-provider.xml”:
在這裏插入圖片描述
對於“Consumer”只需要修改“applicationContext-dubbo-consumer.xml”:
在這裏插入圖片描述
Zookeeper註冊中心(最常用)
ZooKeeper簡稱ZK,是一個高性能、分佈式的,開源分佈式應用協調服務。Dubbo官方推薦使用Zookeeper作爲註冊中心。
官方網址:http://zookeeper.apache.org/
1、Linux環境下安裝(單機)
(1)下載:在上面的官方鏈接上即可下載“zookeeper-3.4.10.tar.gz”
(2)安裝:安裝目錄:/usr/local/zookeeper-3.4.5,解壓縮:# tar -zxf zookeeper-3.4.10.tar.gz -C /usr/local
(3)配置:在解壓後的主目錄下創建data和logs兩個目錄用於存儲數據:# cd /usr/local/zookeeper-3.4.5,# mkdir data,並複製zoo-sample.cfg文件爲zoo.cfg文件,並更新其中的dataDir=/usr/local/zookeeper-3.4.10/data。
(4)啓動和停止:進入bin目錄下:
# ./zkServer.sh start
# ./zkServer.sh stop
# ./zkServer.sh restart
# ./zkServer.sh status

(4) 查看端口:# netstat -tunpl | grep 2181
在這裏插入圖片描述
2、Windows環境下安裝(單機)
(1)下載:官網下載相應的版本:https://www.apache.org/dyn/closer.cgi/zookeeper/
(下載同Linux環境下),解壓下載的壓縮包:
在這裏插入圖片描述
(2)配置:在conf目錄下,複製一份zoo_sample.cfg並更名成zoo.cfg,修改和添加其中的參數:
dataDir=D:/Logs/Zookeeper-Datas
dataLogDir=D:/Logs/Zookeeper-Logs
主要參數釋義:
tickTime:這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
dataLogDir:顧名思義就是 Zookeeper 保存日誌文件的目錄
clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
(3)啓動:雙擊運行bin/zkServer.cmd即可啓動:

在這裏插入圖片描述
3、使用Zookeeper註冊中心(由於防火牆等因素,請儘量使用本地服務)
與使用multicast類似,只需要把註冊的地址修改成:<dubbo:registry address=“zookeeper://127.0.0.1:2181”/>即可,協議://IP:port。

Redis註冊中心(較少)
1、 Redis的安裝和配置
2、 使用Redis註冊中心
與使用Multicast也是類似的,只需要修改一下協議、IP和端口號,如下:
在這裏插入圖片描述
如果需要密碼則:
在這裏插入圖片描述

九、 dubbo分佈式開發模式

SOA服務化:項目分割的模式。
接口項目、實現項目、消費者項目。

十、 dubbo的常用協議

常用協議以及常用協議的配置

Dubbo一共提供了8種協議:dubbo、hessian、rmi、http、webservice、thrift、memcached、redis。
默認使用的是dubbo協議。

協議的配置位置:(以下使用其中一種即可)
<dubbo:protocol name=”dubbo” /> //
<dubbo:provider protocol=”dubbo” /> //
<dubbo:service protocol =”dubbo” /> // 服務提供者
<dubbo:reference protocol =”dubbo” /> // 服務消費端

1、dubbo協議採用單一長連接和NIO異步通訊,適合小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。Dubbo協議底層默認使用的是netty,性能非常優秀,官方推薦使用此協議。Dubbo不適合傳送大數據量的服務,比如傳文件、視頻等,除非請求量很低。<dubbo:protocol name=”dubbo” port=”20880” />,dubbo默認端口20880。
2、Hessian協議:
在這裏插入圖片描述
3、rmi協議:
在這裏插入圖片描述
4、Http協議:採用Spring的HttpInvoker實現
在這裏插入圖片描述
5、webservice協議:
在這裏插入圖片描述
WSDL:
http://10.20.123.10:8080/com.foo.HelloWorld?wsdl

6、thrift協議:
在這裏插入圖片描述
7、memcached協議:
在這裏插入圖片描述
8、redis協議:

在這裏插入圖片描述

十一、 啓動時檢查(常用配置)

Dubbo缺省會在啓動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止Spring初始化完成,以便上線時能及早發現問題,默認check=true。
通過check=“false”關閉檢查,比如,測試時有些服務不關心,或者出現了循環依賴,必須有一方先啓動。(即,如果消費方已經開發完成,但服務提供方還沒有上線,那麼就可以先把檢查關掉,check=false,這樣就不影響消費方的服務正常運行。否則,服務提供方沒有啓動成功,消費方也啓動不成功。)

關閉某個服務的啓動時檢查
關閉所有服務的啓動時檢查
關閉註冊中心啓動時檢查

十二、 負載均衡策略

Dubbo提供了多種均衡策略,缺省爲random隨機調用。
Random、RoundRobin、LeastActive、ConsistentHash

十三、 Dubbo的多協議與多策略

根據具體的服務情況,採用不同的協議。

當一個接口實現出現了不兼容的升級時,可以用版本號過度,版本號不同的服務相互之間不引用。

在低壓力時間段,先升級一半提供者爲新版本,再將所有消費者升級爲新版本,然後再將剩餘的一半提供者升級爲新版本。

服務端:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

十四、 dubbo服務分組

當一個接口有多種實現時,可以用group區分,服務分組是dubbo用來區分相同接口名,但是方法具體實現不同的一種模式。
在這裏插入圖片描述

十五、 dubbo的token驗證

防止消費者繞過註冊中心訪問提供者
在這裏插入圖片描述

十六、 dubbo的配置覆蓋策略

Dubbo的配置主要分爲三類:

  • 服務發現:表示說該配置項用於服務的註冊與發現,目的是讓消費方找到提供方。
  • 服務治理:表示該配置項用於治理服務間的關係,或爲開發測試提供便利條件。
  • 性能調優:表示該配置項用於調優性能,不同的選項對性能會產生影響。
    在這裏插入圖片描述

十七、 dubbo的常用標籤

1、7大常用標籤
在這裏插入圖片描述
2、7大常用標籤的關係
在這裏插入圖片描述
3、7大常用標籤的分類
在這裏插入圖片描述

十八、dubbo管理控制的部署與使用

在這裏插入圖片描述
在這裏插入圖片描述

十九、zookeeper集羣部署

1、 zk集羣的特點:
集羣中只有超過半數的機器是正常工作的,那麼整個集羣對外就是可用的;

2、 zk集羣配置:
在這裏插入圖片描述
3、 Dubbo的配置:

在這裏插入圖片描述
以上兩種方式都可以。

二十、springmvc-spring-dubbo-mybatis綜合示例

開發模式:
在這裏插入圖片描述

二十一、dubbo服務化的建議

在這裏插入圖片描述

二十二、Dubbo的管理控制檯dubbo-admin

前往github上下載dubbo-admin:https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.0
注意:dubbo-2.6.1以後的版本不再有dubbo-admin

進入dubbo-admin文件夾,輸入cmd,打開dos窗口,輸入以下命令:

// 打包,並跳過測試
mvn  package -Dmaven.skip.test=true

將打包好的war 放到tomcat的webapps/ROOT目錄下(把原來ROOT目錄下的文件都刪掉),直接進行解壓到當前目錄即可,進行部署。
修改配置文件:
進入webapps\dubbo-admin-2.6.0\WEB-INF目錄下,找到dubbo.properties,修改如下:

# 和zookeeper註冊中心<dubbo:registry address="zookeeper://127.0.0.1:2181" />中的保持一致,對於多臺zookeeper服務器,需要加上?backup=ip:port,ip:port
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 用戶名
dubbo.admin.root.password=root
# 密碼
dubbo.admin.guest.password=guest

# 其他節點/組的服務
# dubbo.registry.group=myGroup

啓動zk和tomcat即可。

注意
第一、dubbo.admin.root.password=root和dubbo.admin.guest.password=guest必須要在dubbo.properties中進行設置。zk設置用戶名和密碼方法如下:
通過zkCli -server 127.0.0.1:2181連接後,執行:addauth digest root:guest。
第二、啓動後,dubbo-admin默認只是監控dubbo節點下的目錄,但是有時候我們會把服務註冊到不同的節點下,這就是組的概念。此時就需要在dubbo.properties中配置:dubbo.registry.group=myGroup。這樣就能看到不在dubbo節點下的其他組的服務。
第三、現在使用dubbo-admin的越來越少了,而且確實有一些BUG,官方也不再進行升級了。

補充

1、zookeeper的集羣模式
Zookeeper 不僅可以單機提供服務,同時也支持多機組成集羣來提供服務。實際上 Zookeeper 還支持另外一種僞集羣的方式,也就是可以在一臺物理機上運行多個 Zookeeper 實例,下面將介紹集羣模式的安裝和配置。

Zookeeper 的集羣模式的安裝和配置也不是很複雜,所要做的就是增加幾個配置項。集羣模式除了上面的三個配置項還要增加下面幾個配置項:

initLimit=5
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888

initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 52000=10 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2
2000=4 秒
server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是僞集羣的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是那個 server。
數據模型

Zookeeper 會維護一個具有層次關係的數據結構,它非常類似於一個標準的文件系統,如圖 1 所示:
在這裏插入圖片描述

Zookeeper 這種數據結構有如下這些特點:

  •  每個子目錄項如 NameService 都被稱作爲 znode,這個 znode 是被它所在的路徑唯一標識,如 Server1 這個
    znode 的標識爲 /NameService/Server1
  •  znode 可以有子節點目錄,並且每個 znode 可以存儲數據,注意 EPHEMERAL 類型的目錄節點不能有子節點目錄
  •  znode 是有版本的,每個 znode 中存儲的數據可以有多個版本,也就是一個訪問路徑中可以存儲多份數據
  •  znode 可以是臨時節點,一旦創建這個 znode 的客戶端與服務器失去聯繫,這個 znode 也將自動刪除,Zookeeper的客戶端和服務器通信採用長連接方式,每個客戶端和服務器通過心跳來保持連接,這個連接狀態稱爲 session,如果 znode是臨時節點,這個 session 失效,znode 也就刪除了
  •  znode 的目錄名可以自動編號,如 App1 已經存在,再創建的話,將會自動命名爲 App2
  •  znode 可以被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化可以通知設置監控的客戶端,這個是Zookeeper 的核心特性,Zookeeper 的很多功能都是基於這個特性實現的,後面在典型的應用場景中會有實例介紹

如何使用
Zookeeper 作爲一個分佈式的服務框架,主要用來解決分佈式集羣中應用系統的一致性問題,它能提供基於類似於文件系統的目錄節點樹方式的數據存儲,但是 Zookeeper 並不是用來專門存儲數據的,它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基於數據的集羣管理。

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