springboot+dubbo+zk集群搭建

zookeeper的集群搭建在上一編已經(jīng)說(shuō)過(guò),不會(huì)的可以查看。

下面開(kāi)始搭建springboot+dubbo+zk注冊(cè)中心的demo

生產(chǎn)者工程目錄如圖

image

一、創(chuàng)建dubbo-provider父工程
一、創(chuàng)建dubbo-provider父工程

父pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>provider</module>
<module>api</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>springboot</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

二、創(chuàng)建provider工程(Module)

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubbo-provider</artifactId>
<groupId>springboot</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>provider</artifactId>
<dependencies>

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>
    <!-- exclusions去掉log4j的依賴,會(huì)沖突 -->
    <dependency>
        <artifactId>zookeeper</artifactId>
        <groupId>org.apache.zookeeper</groupId>
        <version>3.4.14</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
            <exclusion>
                <groupId>io.netty</groupId>
                <artifactId>netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>springboot</groupId>
        <artifactId>api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

</project>

application.yml配置文件信息
#dubbo的name默認(rèn)使用${spring.application.name},所以不用配置dubbo.application.name也行
spring:
?application:
??name: dubbo-provider
#使用注解,要配置dubbo的掃描包路徑
dubbo:
?scan:
??base-packages: com.facade
#dubbo啟動(dòng)的端口
?protocol:
??port: 20880
?registry:
??protocol: zookeeper
??address: 192.168.79.135:2181,192.168.79.136:2181,192.168.79.137:2181

定義一個(gè)服務(wù)接口

image

服務(wù)接口的實(shí)現(xiàn)

image

定義服務(wù)接口暴露出去的dubbo實(shí)現(xiàn)(因?yàn)閷?shí)際項(xiàng)目中會(huì)包裝一層facade,而不會(huì)將service當(dāng)作dubbo接口)

image

二、創(chuàng)建provider的api工程(Module)

api工程用于給消費(fèi)者工程引用依賴得到api接口來(lái)調(diào)用

pom.xml文件,什么都不用依賴

image

暴露給其他服務(wù)的api接口

image

****最后就是springboot啟動(dòng)服務(wù)的類****

image

生產(chǎn)者工程搭建成功

****消費(fèi)者工程目錄如圖

image

一、創(chuàng)建dubbo-consumer父工程

pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>springboot</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

application.yml配置文件

#dubbo的name默認(rèn)使用${spring.application.name},所以不用配置dubbo.application.name也行
spring:
?application:
??name: dubbo-consumer
#dubbo啟動(dòng)的端口
dubbo:
?protocol:
??port: 20881
?registry:
??protocol: zookeeper
??address: 192.168.79.135:2181,192.168.79.136:2181,192.168.79.137:2181
這里用springboot的test來(lái)啟動(dòng)消費(fèi)者來(lái)

image

消費(fèi)者工程搭建成功

現(xiàn)在啟動(dòng)生產(chǎn)者服務(wù)(直接啟動(dòng)springboot的main就可以了)

image

生產(chǎn)者啟動(dòng)成功

啟動(dòng)消費(fèi)者(調(diào)用ConsumerTest測(cè)試)

image

調(diào)用成功,說(shuō)明搭建的springboot+dubbo+zk集群成功了

查詢zk節(jié)點(diǎn)的變化,看看暴露的接口存到注冊(cè)中心的是什么東西

發(fā)現(xiàn)多了dubbo節(jié)點(diǎn),并者dubbo節(jié)點(diǎn)的子節(jié)點(diǎn)下有注冊(cè)到zk上的服務(wù)(api接口)名稱 有多少個(gè)服務(wù),dubbo下就有多少個(gè)子節(jié)點(diǎn)

/dubbo/com.api.HelloFacade

image
image

接口節(jié)點(diǎn)上還有providers,configuartors等節(jié)點(diǎn)

image

查看providers節(jié)點(diǎn)下發(fā)現(xiàn)這一串東西(這是生產(chǎn)者注冊(cè)到zk上的地址)

[dubbo%3A%2F%2F172.16.19.186%3A20880%2Fcom.api.HelloFacade%3Fanyhost%3Dtrue%26application%3Ddubboprovider%26bean.name%3DServiceBean%3Acom.api.HelloFacade%3A1.0.0%26dubbo%3D2.0.2%26generic%3Dfalse%26interface%3Dcom.api.HelloFacade%26methods%3DsayH%26pid%3D11836%26revision%3D1.0.0%26side%3Dprovider%26timestamp%3D1557481294861%26version%3D1.0.0]

百度一下url解碼

[dubbo://172.16.19.186:20880/com.api.HelloFacade?anyhost=true&application=dubboprovider&bean.name=ServiceBean:com.api.HelloFacade:1.0.0&dubbo=2.0.2&generic=false&interface=com.api.HelloFacade&methods=sayH&pid=11836&revision=1.0.0&side=provider&timestamp=1557481294861&version=1.0.0]

dubbo使用zookeeper作為注解中心,服務(wù)啟動(dòng)后,zk節(jié)點(diǎn)會(huì)創(chuàng)建/dubbo節(jié)點(diǎn),然后把在dubbo節(jié)點(diǎn)上創(chuàng)建生產(chǎn)者注冊(cè)到zk的服務(wù)(api接口)名稱/dubbo/com.api.HelloFacade,該節(jié)點(diǎn)下會(huì)保存provider和consumer的節(jié)點(diǎn),/dubbo/com.api.HelloFacade/provider節(jié)點(diǎn)(持久節(jié)點(diǎn))下會(huì)保存生產(chǎn)者的地址信息(協(xié)議://ip+port/接口名稱...),provider節(jié)點(diǎn)下保存的 地址信息(臨時(shí)節(jié)點(diǎn)),生產(chǎn)者關(guān)閉服務(wù)地址節(jié)點(diǎn)就會(huì)被刪除。

看出這是dubbo協(xié)議的地址,我們的配置文件沒(méi)配置dubbo的協(xié)議,說(shuō)明dubbo默認(rèn)使用的就是dubbo協(xié)議。

消費(fèi)者服務(wù)啟動(dòng)時(shí)就會(huì)HelloFacade的代理對(duì)象

消費(fèi)者調(diào)用dubbo接口的方法時(shí)會(huì)到zk下找到對(duì)應(yīng)接口的生產(chǎn)者地址(172.16.19.186:20880),消費(fèi)者與生產(chǎn)者通過(guò)netty進(jìn)行通信,生產(chǎn)者通過(guò)動(dòng)態(tài)代理和反射機(jī)制把方法執(zhí)行后的返回值通過(guò)netty通訊傳給消費(fèi)者

我們可以看看官網(wǎng)上的圖

0.服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。

  1. 服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。

  2. 服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)。

  3. 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。

  4. 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用。

  5. 服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心


    第4步invoke是通過(guò)netty通信進(jìn)行,消費(fèi)者會(huì)生成動(dòng)態(tài)代理類,調(diào)用服務(wù)的方法時(shí)會(huì)請(qǐng)求生產(chǎn)者,生產(chǎn)者會(huì)通過(guò)invoke調(diào)用方法,然后把返回值傳給消費(fèi)者 (相當(dāng)于消費(fèi)者proxy.newproxyinstance(...)時(shí),代理對(duì)象會(huì)觸發(fā)invocationHandler,invocationHandler接口的實(shí)現(xiàn)中處理與生產(chǎn)者進(jìn)行傳遞消息,生產(chǎn)者把方法調(diào)用后的結(jié)果傳遞給消費(fèi)者)

image

下一編會(huì)對(duì)dubbo的生產(chǎn)者和消費(fèi)者的一些參數(shù)配置和服務(wù)治理的參數(shù)進(jìn)行測(cè)試說(shuō)明。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容