zookeeper+dubbo實現java分佈式服務

ZooKeeper簡介

ZooKeeper(Zookeeper 下載地址)是一個分佈式的,開放源碼的分佈式應用程序協調服務,是 Apache Hadoop 的一個子項目,是Google的Chubby一個開源的實現,主要是用來解決分佈式應用中常常遇到的一些數據管理問題,它是集羣的管理者,監視着集羣中各個節點的狀態根據節點提交的反饋進行下一步合理操做。最終,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶.
每一個子目錄項如 NameService 都被稱做爲znode,和文件系統同樣,咱們可以自由的增長、刪除znode,在一個znode下增長、刪除子znode,惟一的不一樣在於znode是能夠存儲數據的。
客戶端與zookeeper斷開鏈接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號:html

  1. 命名服務
  2. 配置管理
  3. 集羣管理
  4. 分佈式鎖
  5. 隊列管理

Zookeeper命名服務

在zookeeper的文件系統裏建立一個目錄,即有惟一的path。在咱們使用tborg沒法肯定上游程序的部署機器時便可與下游程序約定好path,經過path即能互相探索發現。java

Zookeeper的配置管理

程序老是須要配置的,若是程序分散部署在多臺機器上,要逐個改變配置就變得困難。如今把這些配置所有放到zookeeper上去,保存在 Zookeeper 的某個目錄節點中,
而後全部相關應用程序對這個目錄節點進行監聽,一旦配置信息發生變化,每一個應用程序就會收到 Zookeeper 的通知,
而後從 Zookeeper 獲取新的配置信息應用到系統中就好。node

tickTime=2000  
dataDir= /zookeeper-3.4.8/data 
dataLogDir=/zookeeper-3.4.8/logs  
clientPort=2181
server.1=IP1:2888:3888
server.2=IP2:2888:3888

參數說明:
tickTime: zookeeper中使用的基本時間單位, 毫秒值.
dataDir: 數據目錄. 能夠是任意目錄.
dataLogDir: log目錄, 一樣能夠是任意目錄. 若是沒有設置該參數, 將使用和#dataDir相同的設置.
clientPort: 監聽client鏈接的端口號.
server.id=host:port:port解析.
每一行此配置表示一個集羣中的一臺服務器。其中id爲Server ID,用來標識該機器在集羣中的編號。同時,在所在服務器的數據目錄(/tmp/zookeeper)下建立一個myid文件,該文件只有一行內容,而且是一個數字,就是對應每臺服務器的Server ID數字。
好比server.1=IP1:2888:3888的myid中的內容就是1。不一樣服務器的ID須要保持不一樣,而且和zoo.cfg文件中server.id中的id和myid文件的內容保持一致。id的取值範圍爲1~255。
其中,server.id中配置參數的第一個port是集羣中其餘機器與Leader之間通訊的端口,第二個port爲當Leader宕機或其餘故障時,集羣進行從新選舉Leader時使用的端口。
按照以上相同步驟,配置集羣中的其餘機器。每一個集羣的zoo.cfg文件都是相同的,可經過版本控制或其餘工具保證每臺zookeeper服務器的配置文件相同。集羣中每臺機器惟一不一樣的是server.id對應的myid文件中的數字不一樣,須要注意的是通常zookeeper集羣由3~5臺服務器組成,即2n+1臺機器。
詳細的客戶端命令:https://zhuanlan.zhihu.com/p/...git

Dubbo簡介

Dubbo是阿里旗下的一個彈性的分佈式服務框架,2012 年,阿里巴巴在 GitHub上開源了基於 Java的分佈式服務治理框架 Dubbo,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
Dubbo透明化的遠程方法調用,沒有API侵入,就能像調用本地方法同樣調用遠程方法,軟負載均衡及容錯機制,能夠在內網替代F5等硬件負載均衡器,下降成本,減小單點。
服務框架中,與業務相關,但與業務功能的整合無關的組件之外部服務形式引入(也就是說把一些業務分離出來,變成一種服務,供其餘人調用該服務)。github

調用關係說明:算法

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

Zookeeper+dubbo:

Dubbo的將註冊中心進行抽象,是得它能夠外接不一樣的存儲媒介給註冊中心提供服務,有ZooKeeper,Memcached,Redis引入了ZooKeeper做爲存儲媒介,也就把ZooKeeper的特性引進來。首先是負載均衡,單註冊中心的承載能力是有限的,在流量達到必定程度的時候就須要分流,負載均衡就是爲了分流而存在的,一個ZooKeeper羣配合相應的Web應用就能夠很容易達到負載均衡;資源同步,單單有負載均衡還不夠,節點之間的數據和資源須要同步,ZooKeeper集羣就自然具有有這樣的功能;命名服務,將樹狀結構用於維護全局的服務地址列表,服務提供者在啓動的時候,向ZK上的指定節點/dubbo/${serviceName}/providers目錄下寫入本身的URL地址,這個操做就完成了服務的發佈。其餘特性還有Mast選舉,分佈式鎖等。 spring

相關代碼:
spring
Pom.xmlapache

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.8.4</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.20.0-GA</version>
        </dependency>

Applicationcontext.xmlspringboot

<dubbo:annotation package="com.bbs.service"/>
    <dubbo:application name="bbs"/> 
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <dubbo:protocol port="1213"></dubbo:protocol>
    <dubbo:consumer check="false" timeout="50000"></dubbo:consumer>
    <dubbo:provider timeout="50000"></dubbo:provider>

springboot
Pom.xml服務器

<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.4.10</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>slf4j-log4j12</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>
    
   
    <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>

Application.properties

spring.dubbo.application.name=bootsec
spring.dubbo.registry.address=zookeeper://localhost:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=3100
spring.dubbo.scan=com.emsoft.studentboot

圖片描述

服務端代碼

#dubbo配置
spring.dubbo.application.name=bootthr
spring.dubbo.registry.address=zookeeper://192.168.31.119:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=3200
spring.dubbo.scan=com.emsoft.stuthr.server 業務代碼所在的包名
spring.dubbo.application.registries.timeout=10000
spring.dubbo.application.registries.session=10000

客戶端代碼
圖片描述

spring.dubbo.application.name=bootsec
spring.dubbo.registry.address=zookeeper://localhost:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=3100
spring.dubbo.scan=com.emsoft.studentboot
相關文章
相關標籤/搜索