zookeeper的集群搭建在上一編已經(jīng)說(shuō)過(guò)醒第,不會(huì)的可以查看。
下面開(kāi)始搭建springboot+dubbo+zk注冊(cè)中心的demo
生產(chǎn)者工程目錄如圖
一舀锨、創(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ù)接口
服務(wù)接口的實(shí)現(xiàn)
定義服務(wù)接口暴露出去的dubbo實(shí)現(xiàn)(因?yàn)閷?shí)際項(xiàng)目中會(huì)包裝一層facade胶滋,而不會(huì)將service當(dāng)作dubbo接口)
二板鬓、創(chuàng)建provider的api工程(Module)
api工程用于給消費(fèi)者工程引用依賴得到api接口來(lái)調(diào)用
pom.xml文件,什么都不用依賴
暴露給其他服務(wù)的api接口
****最后就是springboot啟動(dòng)服務(wù)的類****
生產(chǎn)者工程搭建成功
****消費(fèi)者工程目錄如圖
一究恤、創(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)
消費(fèi)者工程搭建成功
現(xiàn)在啟動(dòng)生產(chǎn)者服務(wù)(直接啟動(dòng)springboot的main就可以了)
生產(chǎn)者啟動(dòng)成功
啟動(dòng)消費(fèi)者(調(diào)用ConsumerTest測(cè)試)
調(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
接口節(jié)點(diǎn)上還有providers窟赏,configuartors等節(jié)點(diǎn)
查看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使用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ù)提供者。
服務(wù)提供者在啟動(dòng)時(shí)套菜,向注冊(cè)中心注冊(cè)自己提供的服務(wù)亲善。
服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)逗柴。
注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者蛹头,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
服務(wù)消費(fèi)者渣蜗,從提供者地址列表中屠尊,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用耕拷,如果調(diào)用失敗知染,再選另一臺(tái)調(diào)用。
-
服務(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)者)
下一編會(huì)對(duì)dubbo的生產(chǎn)者和消費(fèi)者的一些參數(shù)配置和服務(wù)治理的參數(shù)進(jìn)行測(cè)試說(shuō)明么夫。