Dubbo入門學(xué)習(xí)筆記

Dubbo是什么

Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu),使用這種方式可以使各個(gè)層之間解耦合(或者最大限度地松耦合)。從服務(wù)模型的角度來看峡捡,Dubbo采用的是一種非常簡(jiǎn)單的模型委刘,要么是提供方提供服務(wù),要么是消費(fèi)方消費(fèi)服務(wù)人弓,所以基于這一點(diǎn)可以抽象出服務(wù)提供方(Provider)和服務(wù)消費(fèi)方(Consumer)兩個(gè)角色沼死。
簡(jiǎn)單說呢,Dubbo用起來就和EJB崔赌、WebService差不多意蛀,調(diào)用一個(gè)遠(yuǎn)程的服務(wù)(或者JavaBean)的時(shí)候在本地有一個(gè)接口,就像調(diào)用本地的方法一樣去調(diào)用健芭,它底層幫你實(shí)現(xiàn)好你的方法參數(shù)傳輸和遠(yuǎn)程服務(wù)運(yùn)行結(jié)果傳回之后的返回县钥,就是RPC的一種封裝啦~
當(dāng)然,這個(gè)只是Dubbo的最基本的功能慈迈,它的特點(diǎn)是:

  1. 它主要是使用高效的網(wǎng)絡(luò)框架和序列化框架若贮,讓分布式服務(wù)之間調(diào)用效率更高。
  2. 采用注冊(cè)中心管理眾多的服務(wù)接口地址,當(dāng)你想調(diào)用服務(wù)的時(shí)候只需要跟注冊(cè)中心詢問即可谴麦,不用像使用WebService一樣每個(gè)服務(wù)都得記錄好接口調(diào)用方式蠢沿。
  3. 監(jiān)控中心:實(shí)現(xiàn)對(duì)服務(wù)方和調(diào)用方之間運(yùn)行狀態(tài)的監(jiān)控,還能控制服務(wù)的優(yōu)先級(jí)匾效、權(quán)限搏予、權(quán)重、上下線等弧轧,讓整個(gè)龐大的分布式服務(wù)系統(tǒng)的維護(hù)和治理比較方便雪侥。
  4. 高可用:有個(gè)服務(wù)宕機(jī)了?注冊(cè)中心就會(huì)從服務(wù)列表去掉該節(jié)點(diǎn)精绎。還是調(diào)用到了速缨?客戶端會(huì)向注冊(cè)中心請(qǐng)求另一臺(tái)可用的服務(wù)節(jié)點(diǎn)重新調(diào)用。注冊(cè)中心宕機(jī)代乃?注冊(cè)中心也能實(shí)現(xiàn)高可用(ZooKeeper)旬牲。
  5. 負(fù)載均衡:采用軟負(fù)載均衡算法實(shí)現(xiàn)對(duì)多個(gè)相同服務(wù)的節(jié)點(diǎn)的請(qǐng)求負(fù)載均衡。
  6. 等等搁吓。原茅。。很多高大上的堕仔,看官方文檔吧擂橘,我也是文檔中抄過來的~

一些參考站點(diǎn)或博客

*** 注意 ***

所有東西以官方用戶指南為準(zhǔn):http://dubbo.io/User+Guide-zh.htm
其他第三方文章博客什么的可以參考輔助理解夯辖,但是由于阿里是國(guó)內(nèi)公司,官方用戶指南董饰,特別是中文版都特別詳細(xì)蒿褂,真的沒有很多必要去找一堆第三方的教程來看啦~

Dubbo環(huán)境準(zhǔn)備

Dubbo需要四大基本組件:Registry圆米、Monitor、Provider啄栓、Consumer娄帖。


dubbo-architecture.jpg-version=1&modificationDate=1330892870000.jpg
  1. 安裝注冊(cè)中心(Registry),我用ZooKeeper昙楚,具體參考我的ZooKeeper教程博客近速,安裝好ZooKeeper之后注冊(cè)中心就有了,先放著堪旧,等會(huì)用削葱。

  2. 安裝簡(jiǎn)單監(jiān)控中心:simple-monitor。網(wǎng)上找dubbo-monitor-simple-2.8.4-assembly.tar.gz淳梦。

  • 解壓析砸,找到conf文件夾下的dubbo.properties文件,下面簡(jiǎn)單介紹各個(gè)配置參數(shù)的意義:

容器爆袍,就是說這個(gè)簡(jiǎn)單監(jiān)控中心是在jetty和spring環(huán)境下運(yùn)行的首繁,依賴于注冊(cè)中心,日志系統(tǒng)是log4j

dubbo.container=log4j,spring,registry,jetty

監(jiān)控系統(tǒng)對(duì)整個(gè)Dubbo服務(wù)系統(tǒng)來說也是一個(gè)服務(wù)陨囊,這里指定了這個(gè)監(jiān)控服務(wù)的名稱

dubbo.application.name=simple-monitor

服務(wù)的所有者弦疮,這是Dubbo的服務(wù)的功能,可以指定服務(wù)的負(fù)責(zé)人

dubbo.application.owner=coselding

下面四個(gè)是指定注冊(cè)中心地址的蜘醋,分別為廣播胁塞、zookeeper、redis堂湖、dubbo(自帶)方式的注冊(cè)中心闲先,前面說了,我用的是Zookeeper(前面配好了)无蜂,因此去掉zookeeper前面的#,配置zookeeper的ip和端口號(hào)蒙谓。之后簡(jiǎn)單監(jiān)控中心就能通過注冊(cè)中心獲取當(dāng)前可用的服務(wù)列表及其狀態(tài)斥季,在頁面向你匯報(bào)Dubbo中的服務(wù)運(yùn)行情況。

dubbo.registry.address=multicast://224.5.6.7:1234

dubbo.registry.address=zookeeper://{ip}:{port}

dubbo.registry.address=redis://127.0.0.1:6379

dubbo.registry.address=dubbo://127.0.0.1:9090

dubbo協(xié)議端口號(hào)累驮,保持默認(rèn)即可

dubbo.protocol.port=7070

jetty工作端口號(hào)酣倾,平時(shí)不是習(xí)慣8080嗎?當(dāng)然谤专,這里為了不影響之后運(yùn)行的tomcat躁锡,就不要占用8080端口啦。

dubbo.jetty.port=8082

一個(gè)工作目錄置侍,在這個(gè)目錄會(huì)保存一些監(jiān)控中心的數(shù)據(jù)映之,比如調(diào)用曲線圖等拦焚,這里指定一個(gè)存在的空目錄即可

dubbo.jetty.directory=${user.home}/monitor

監(jiān)控中心報(bào)表存放的目錄,同上杠输,一般默認(rèn)即可

dubbo.charts.directory=${dubbo.jetty.directory}/charts

監(jiān)控中心數(shù)據(jù)資料目錄赎败,同上,一般默認(rèn)即可

dubbo.statistics.directory=${user.home}/monitor/statistics

監(jiān)控中心日志文件路徑

dubbo.log4j.file=logs/dubbo-monitor-simple.log

監(jiān)控中心日志記錄級(jí)別

dubbo.log4j.level=WARN

>* 運(yùn)行bin目錄下的start.sh(unix系下)或start.bat(win下)即可蠢甲。
>* 瀏覽器訪問:`http://{簡(jiǎn)單監(jiān)控中心所在的主機(jī)ip}:8082`僵刮,端口號(hào)是剛才配置文件設(shè)置的8082,即可訪問查看Dubbo服務(wù)集群中的應(yīng)用和服務(wù)的簡(jiǎn)單情況鹦牛。

3. 安裝**Dubbo管理控制臺(tái)**:
>* 下載`dubbo-admin-2.8.4.war`搞糕,這個(gè)是Dubbo的管理控制臺(tái)的webapp的war包,將其解壓曼追。
>* WEB-INF目錄下的`dubbo.properties`文件配置Dubbo的信息寞宫,如下:
>```bash
# 配置注冊(cè)中心地址,和簡(jiǎn)單監(jiān)控中心一樣拉鹃,通過注冊(cè)中心才能監(jiān)控當(dāng)前所有可用的服務(wù)辈赋。
dubbo.registry.address=zookeeper://127.0.0.1:2181
# root賬戶的密碼,網(wǎng)頁進(jìn)入控制臺(tái)界面之前需要輸入帳號(hào)密碼
dubbo.admin.root.password=root
# guest訪客賬戶的密碼
dubbo.admin.guest.password=guest
  • 將修改完配置的dubbo-admin的整個(gè)目錄復(fù)制到tomcat的webapps目錄下膏燕,重啟tomcat钥屈,說白了dubbo-admin就是tomcat的一個(gè)webapp的形式存在。

Dubbo注冊(cè)中心

上面已經(jīng)安裝完成了zookeeper的注冊(cè)中心了坝辫,這個(gè)注冊(cè)中心主要就是負(fù)責(zé)dubbo的所有服務(wù)地址列表維護(hù)篷就,并且可以通過在ZooKeeper節(jié)點(diǎn)中設(shè)置相應(yīng)的值來實(shí)現(xiàn)對(duì)這個(gè)服務(wù)的權(quán)重、優(yōu)先級(jí)近忙、是否可用竭业、路由、權(quán)限等的控制及舍。
你可以先記住未辆,之后在Dubbo的管理控制臺(tái)對(duì)服務(wù)的一堆治理策略設(shè)置和調(diào)整,實(shí)際上就是修改了注冊(cè)中心中的服務(wù)對(duì)應(yīng)的配置數(shù)據(jù)(即修改了zookeeper中服務(wù)對(duì)應(yīng)的節(jié)點(diǎn)的配置數(shù)據(jù))锯玛。
之后Consumer從注冊(cè)中心請(qǐng)求到服務(wù)的數(shù)據(jù)時(shí)就能根據(jù)這些配置數(shù)據(jù)進(jìn)行相應(yīng)的治理配置參數(shù)的代碼執(zhí)行生效咐柜。

Dubbo樣例服務(wù)開發(fā)

這里我用maven構(gòu)建項(xiàng)目,在Spring環(huán)境中配置Provider和Consumer攘残。
先說明使用的依賴:

        <!-- Spring所需依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.3.RELEASE</version>
        </dependency>

        <!-- dubbo所需依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.8.4</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
            <version>LATEST</version>
        </dependency>

        <!-- ZooKeeper所需依賴 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
  1. Provider
  • 聲明服務(wù)的接口:
public interface IMyDemo {
        String sayHello(String name);
}
  • 對(duì)接口進(jìn)行實(shí)現(xiàn)(這里是Provider拙友,需要真的實(shí)現(xiàn),之后在Consumer端調(diào)用接口之后實(shí)際就是在這里的實(shí)現(xiàn)代碼執(zhí)行所需邏輯的):
public class MyDemo implements IMyDemo {
        @Override
        public String sayHello(String name) {
            String hello = "hello " + name;
            System.out.println(hello);
            return hello;
        }
}
  • Spring配置相應(yīng)的Dubbo服務(wù)(provider.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!-- 這里添加了dubbo的命名空間歼郭,之后Spring通過dubbo中擴(kuò)展的配置解析生成對(duì)應(yīng)的dubbo實(shí)例放到Spring的IoC容器中 -->
<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">
    <!-- 指定服務(wù)的應(yīng)用名稱遗契,在dubbo中層次級(jí)別是先分為多個(gè)應(yīng)用(可以理解為一個(gè)項(xiàng)目),在每個(gè)應(yīng)用下有多個(gè)服務(wù)(可以理解為項(xiàng)目下具體的某個(gè)提供服務(wù)的服務(wù)類) -->
    <!-- 這里就是指定一個(gè)應(yīng)用的名稱病曾,指定相同的應(yīng)用名的服務(wù)在dubbo中都會(huì)被分配在同一個(gè)應(yīng)用分支下 -->
    <dubbo:application name="hello-world-app"  />
    <!-- 之前配置好的ZooKeeper服務(wù)器作為注冊(cè)中心牍蜂,這里指定好ZooKeeper的地址漾根,此處的Dubbo才能連接上注冊(cè)服務(wù)器,很好理解 -->
    <dubbo:registry address="zookeeper://119.29.153.56:2181" id="registry" />
    <!-- Dubbo的每個(gè)節(jié)點(diǎn)之間通信可以支持rmi捷兰、Http立叛、Dubbo等一系列的協(xié)議,這里指定默認(rèn)的dubbo協(xié)議贡茅,以及此處的服務(wù)Provider對(duì)外暴露的服務(wù)端口號(hào) -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 到這里秘蛇,這個(gè)Provider節(jié)點(diǎn)就已經(jīng)能連上注冊(cè)服務(wù)器,并使用指定的協(xié)議進(jìn)行通信了 -->
    <!-- 這里對(duì)外暴露剛才編寫的接口顶考,并指定IoC容器中接口的實(shí)現(xiàn)來為這個(gè)接口提供實(shí)際的服務(wù) -->
    <dubbo:service interface="com.weidian.dubbo.IMyDemo" ref="myDemo"/>
    <!-- 這里是Spring原始的JavaBean聲明方式赁还,并放在IoC容器中 -->
    <bean id="myDemo" class="com.weidian.dubbo.MyDemo"/>
</beans>
  • 本地測(cè)試一下這個(gè)服務(wù)是否可用,這里還沒用到Dubbo驹沿,只是先測(cè)試一下Spring容器是否有問題:
@org.junit.Test
public void testDubbo() throws InterruptedException {
        ApplicationContext providerContext = new ClassPathXmlApplicationContext("provider.xml");
        IMyDemo demo = providerContext.getBean(IMyDemo.class);
        System.out.println(demo.sayHello("world"));
        Thread.sleep(60000);
    }
  • 運(yùn)行結(jié)果:


    provider.png

Provider內(nèi)部代碼輸出了一遍艘策,返回到測(cè)試代碼又輸出了一遍,總共兩遍hello world

  1. Consumer
  • 編寫和Provider服務(wù)的對(duì)應(yīng)接口:
public interface IMyDemo {
        String sayHello(String name);
}
  • Spring配置遠(yuǎn)程的服務(wù)為本地的JavaBean(consumer.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!-- 這里添加了dubbo的命名空間渊季,之后Spring通過dubbo中擴(kuò)展的配置解析生成對(duì)應(yīng)的dubbo實(shí)例放到Spring的IoC容器中 -->
<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">
    <!-- 聲明要連接的應(yīng)用名稱朋蔫,要和Provider聲明的指定的應(yīng)用名一致 -->
    <dubbo:application name="hello-world-app"  />
    <!-- 之前配置好的ZooKeeper服務(wù)器作為注冊(cè)中心,這里指定好ZooKeeper的地址却汉,此處的Dubbo才能連接上注冊(cè)服務(wù)器驯妄,很好理解 -->
    <dubbo:registry address="zookeeper://119.29.153.56:2181" id="registry" />
    <!-- Dubbo的每個(gè)節(jié)點(diǎn)之間通信可以支持rmi、Http合砂、Dubbo等一系列的協(xié)議青扔,這里指定默認(rèn)的dubbo協(xié)議,
        以及此處的Consumer對(duì)外暴露的服務(wù)端口號(hào)翩伪,因?yàn)樽?cè)中心有服務(wù)節(jié)點(diǎn)列表更新是要實(shí)時(shí)推送到Consumer中的 
        -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 到這里微猖,這個(gè)Consumer節(jié)點(diǎn)就已經(jīng)能連上注冊(cè)服務(wù)器,并使用指定的協(xié)議進(jìn)行通信了 -->
    <!-- 接口指定Consumer端的那個(gè)服務(wù)接口缘屹,之后它就會(huì)通過這個(gè)接口的應(yīng)用名和全限定名去注冊(cè)中心
        查找實(shí)際的服務(wù)Provider地址列表凛剥,再通過指定的dubbo協(xié)議進(jìn)行通信,實(shí)現(xiàn)RPC囊颅,而在Consumer
        本機(jī)端對(duì)Spring的IoC容器指定id当悔,方便之后對(duì)這個(gè)遠(yuǎn)程JavaBean的引用調(diào)用 -->
    <dubbo:reference id="demoRemote" interface="com.weidian.dubbo.IMyDemo" protocol="dubbo"/>
</beans>
  • 另外,也能繞過Registry直連Provider踢代,如下:
<dubbo:reference interface="com.weidian.dubbo.IMyDemo" version="1.0" id="myDemo" url="dubbo://127.0.0.1:20880/"></dubbo:reference>
  • 遠(yuǎn)程過程調(diào)用測(cè)試(前提是先把Provider的服務(wù)先運(yùn)行起來再來運(yùn)行這個(gè)Consumer(在兩個(gè)端的測(cè)試代碼尾部都添加了sleep代碼的原因):
@org.junit.Test
public void testGetRemoteService() throws InterruptedException {
        ApplicationContext consumerContext = new ClassPathXmlApplicationContext("consumer.xml");
        IMyDemo demoRemote = consumerContext.getBean(IMyDemo.class);
        System.out.println(demoRemote.sayHello("world"));
        Thread.sleep(30000);
    }
  • 運(yùn)行結(jié)果:
    Provider:


    remote-provider.png

啟動(dòng)Provider輸出了兩遍,Consumer調(diào)用時(shí)本地實(shí)現(xiàn)又輸出了一遍嗅骄,共三遍胳挎。
Consumer:


consumer.png

啟動(dòng)Consumer,遠(yuǎn)程返回輸出了一遍溺森。

Dubbo簡(jiǎn)單監(jiān)控中心

簡(jiǎn)單介紹慕爬,其實(shí)用處不大窑眯,我覺得管理后臺(tái)的功能已經(jīng)把這個(gè)監(jiān)控中心的功能覆蓋了,僅僅只是拿來測(cè)試使用一下医窿。

  • 主界面:


    simple-monitor.png
  • 服務(wù)列表界面磅甩,顯示所有服務(wù)以及它的Provider和Consumer情況:


    simple-monitor-Service.png

Dubbo管理后臺(tái)使用

之前Tomcat中配置好了dubbo-admin的webapp,現(xiàn)在只要打開tomcat姥卢,并輸入相應(yīng)的地址即可訪問dubbo-admin的界面卷要,如我的是http://127.0.0.1:8080/dubbo-admin/
其實(shí)就是一個(gè)很常見的管理后臺(tái)独榴,可以控制每個(gè)服務(wù)僧叉、應(yīng)用的狀態(tài)、權(quán)重棺榔、路由控制瓶堕、訪問控制、負(fù)載均衡症歇、各個(gè)應(yīng)用的服務(wù)情況和消費(fèi)情況等郎笆,不需要教程,直接上手使用即可忘晤,至于其中的一些可能有疑問的概念宛蚓,下面的內(nèi)容將一一說明。

服務(wù)路由

路由德频,顧名思義苍息,就是通過配置去設(shè)定哪些Consumer節(jié)點(diǎn)的請(qǐng)求由哪些節(jié)點(diǎn)的Provider節(jié)點(diǎn)的服務(wù)來進(jìn)行響應(yīng),可以在一定程度上控制負(fù)載分布壹置。
知道這個(gè)概念竞思,那剩下就是配置的問題了,明白怎么回事其實(shí)就很簡(jiǎn)單啦~

在dubbo-admin主界面——服務(wù)治理——路由規(guī)則钞护,如下:

router-main.png

點(diǎn)擊新增

router-new.png

路由名稱:為你定義的這個(gè)路由規(guī)則聲明一個(gè)名稱盖喷,之后可以根據(jù)這個(gè)名稱來找這個(gè)路由規(guī)則。
優(yōu)先級(jí):很明顯难咕,一個(gè)int數(shù)值代表這個(gè)路由規(guī)則的優(yōu)先級(jí)课梳,優(yōu)先級(jí)越高這個(gè)規(guī)則越先匹配。
服務(wù)名:列表選擇的余佃,從注冊(cè)中心中已有的服務(wù)列表中選擇一個(gè)服務(wù)暮刃,表示這個(gè)路由規(guī)則要約束的是哪個(gè)服務(wù)。
方法名:列表選擇的爆土,選擇要約束的這個(gè)服務(wù)中的哪個(gè)方法椭懊。
匹配條件:填寫匹配下面的列表就表示匹配了條件才受這個(gè)路由規(guī)則約束,否則就是不匹配規(guī)則才受該規(guī)則約束步势。
消費(fèi)者IP地址:要約束的Consumer的IP地址列表氧猬,逗號(hào)隔開背犯。
消費(fèi)者應(yīng)用名:要約束的Consumer的應(yīng)用名列表。
消費(fèi)者集群:按照提示上寫的去找盅抚,沒找到相應(yīng)的選項(xiàng)漠魏,暫時(shí)也沒用到,之后再回頭編輯妄均。
過濾規(guī)則:填寫匹配下面的列表就表示匹配了條件才受這個(gè)路由規(guī)則約束柱锹,否則就是不匹配規(guī)則才受該規(guī)則約束。
提供者IP地址:要約束的Provider的IP地址列表丛晦,逗號(hào)隔開奕纫。
提供者集群:按照提示上寫的去找,沒找到相應(yīng)的選項(xiàng)烫沙,暫時(shí)也沒用到匹层,之后再回頭編輯。
提供者協(xié)議:指定Provider的協(xié)議锌蓄,不是該協(xié)議的也不約束升筏。
提供者端口:指定Provider的端口,不是這個(gè)端口的也不約束瘸爽。

測(cè)試樣例展示:


router-sample.png

這樣配置的路由就能夠生效您访,效果是:com.weidian.dubbo.IMyDemo服務(wù)的sayHello方法下,地址為192.168.31.164的Consumer的請(qǐng)求由(地址:192.168.31.164剪决;協(xié)議:dubbo灵汪;端口:20880)的Provider進(jìn)行響應(yīng),如果沒有匹配的Provider就會(huì)默認(rèn)返回所有的Provider列表給Consumer柑潦,讓Consumer自己選享言。
點(diǎn)擊保存,保存新增的路由規(guī)則渗鬼,并在路由規(guī)則列表中啟用這個(gè)規(guī)則览露,如下:

router-list.png

點(diǎn)擊預(yù)覽,在消費(fèi)者地址填寫192.168.31.164譬胎,點(diǎn)擊預(yù)覽差牛,如下圖所示:

router-success.png

運(yùn)行Consumer程序,查看消費(fèi)者狀態(tài)堰乔,可知設(shè)定的這個(gè)路由規(guī)則對(duì)該對(duì)應(yīng)地址的消費(fèi)真生效了偏化,如下圖:


router-consumer.png

另外,IP地址支持結(jié)尾為匹配所有镐侯,如10.0.0.或者10.0.*等夹孔。
不匹配的配置規(guī)則和匹配的配置規(guī)則是一致的。

負(fù)載均衡

dubbo提供4種負(fù)載均衡方式:
Random:隨機(jī)析孽,按權(quán)重配置隨機(jī)概率搭伤,調(diào)用量越大分布越均勻,默認(rèn)是這種方式
RoundRobin:輪詢袜瞬,按權(quán)重設(shè)置輪詢比例怜俐,如果存在比較慢的機(jī)器容易在這臺(tái)機(jī)器的請(qǐng)求阻塞較多
LeastActive:最少活躍調(diào)用數(shù),不支持權(quán)重邓尤,只能根據(jù)自動(dòng)識(shí)別的活躍數(shù)分配拍鲤,不能靈活調(diào)配
ConsistentHash:一致性hash,對(duì)相同參數(shù)的請(qǐng)求路由到一個(gè)服務(wù)提供者上汞扎,如果有類似灰度發(fā)布需求可采用
dubbo的負(fù)載均衡機(jī)制是在客戶端調(diào)用時(shí)通過內(nèi)存中的服務(wù)方信息及配置的負(fù)責(zé)均衡策略選擇季稳,如果對(duì)自己系統(tǒng)沒有一個(gè)全面認(rèn)知,建議先采用random方式澈魄。

Dubbo過濾器

有需要自己實(shí)現(xiàn)dubbo過濾器的景鼠,可關(guān)注如下步驟:

  1. dubbo初始化過程加載ClassPath下的META-INF/dubbo/internal/META-INF/dubbo/痹扇,META-INF/services/三個(gè)路徑(classloader resource)下面的com.alibaba.dubbo.rpc.Filter文件铛漓。
    文件內(nèi)容:
    每行Name=FullClassName,這些類必須是實(shí)現(xiàn)Filter接口鲫构,如下圖:

    filter-prop.png

  2. 自定義Filter類:

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
//激活這個(gè)過濾器的注解浓恶,標(biāo)記這個(gè)過濾器在消費(fèi)者端加入過濾器鏈
@Activate(group = Constants.CONSUMER)
//dubbo過濾器的實(shí)現(xiàn)類
public class DubboTestFilter implements Filter {
    /**計(jì)時(shí)器過濾器,記錄這個(gè)RPC的整個(gè)過程執(zhí)行時(shí)間
     * @param invoker
     * @param invocation
     * @return
     * @throws RpcException
     */
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        long start = System.currentTimeMillis();
        //這個(gè)是RPC的實(shí)現(xiàn)體结笨,Result就是RPC的執(zhí)行結(jié)果包晰,和Servlet的過濾器有些類似
        Result result = invoker.invoke(invocation);
        System.out.println("time = " + (System.currentTimeMillis() - start) + "ms");
        System.out.println(result.getValue());
        return result;
    }
}
  1. consumer.xml配置文件中配置這個(gè)過濾器,如下圖:


    filter-spring.png
  2. 先來看看配置完成之后的執(zhí)行效果:


    filter-run.png

對(duì)比上面的過濾器代碼可知炕吸,先輸出了RPC過程的運(yùn)行時(shí)間伐憾,之后在過濾器中輸出了一遍執(zhí)行結(jié)果hello world,之后單元測(cè)試本身再把執(zhí)行結(jié)果輸出一遍算途,因此hello world輸出了兩遍塞耕。

  1. Dubbo過于這個(gè)過濾器的加載過程:

(1) 先加載那三個(gè)路徑下的com.alibaba.dubbo.rpc.Filter文件里面的鍵值對(duì),key為過濾器的名稱嘴瓤,value為過濾器的類全限定名(這個(gè)類必須實(shí)現(xiàn)Dubbo中的Filter接口)扫外;
(2) 這樣就能找到這個(gè)類的class文件了,檢查@Activate注解加載這個(gè)過濾器設(shè)定的一些全局基本屬性廓脆;
(3) Spring在加載consumer.xml文件的時(shí)候筛谚,通過

<dubbo:consumer filter="dubboTestFilter" id="dubboTestFilter" retries="0"/>

指定消費(fèi)者端要加載的過濾器,通過filter屬性指定過濾器名稱(就是配置文件中的過濾器key)停忿,這樣剛才加載的過濾器類就加入消費(fèi)者代碼邏輯中的過濾器鏈了驾讲。

  1. 關(guān)于@Activate注解: —— 自動(dòng)激活

group:(provider|consumer)匹配了對(duì)應(yīng)的角色才被加載
value:標(biāo)明過濾條件,不寫則所有條件下都會(huì)被加載,寫了則只有dubbo URL中包含該參數(shù)名且參數(shù)值不為空才被加載吮铭,這個(gè)參數(shù)會(huì)以dubbo協(xié)議的一個(gè)參數(shù)K-V對(duì)傳到Provider时迫。

Dubbo Rest風(fēng)格服務(wù)

  1. 當(dāng)當(dāng)Dubbox:https://dangdangdotcom.github.io/dubbox/rest.html
  2. Dubbo Rest風(fēng)格服務(wù)開發(fā):https://segmentfault.com/a/1190000005170426

----

還欠缺安全保護(hù)和集群性能調(diào)優(yōu)方面的講解,畢竟才剛?cè)腴T谓晌,待我在公司的項(xiàng)目中使用一段時(shí)間有了真正的一些實(shí)戰(zhàn)感悟再來好好總結(jié)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掠拳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纸肉,更是在濱河造成了極大的恐慌溺欧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏肪,死亡現(xiàn)場(chǎng)離奇詭異姐刁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烦味,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門聂使,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拐叉,你說我怎么就攤上這事岩遗。” “怎么了凤瘦?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵宿礁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蔬芥,道長(zhǎng)梆靖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任笔诵,我火速辦了婚禮返吻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乎婿。我一直安慰自己测僵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布谢翎。 她就那樣靜靜地躺著捍靠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪森逮。 梳的紋絲不亂的頭發(fā)上榨婆,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音褒侧,去河邊找鬼良风。 笑死谊迄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烟央。 我是一名探鬼主播统诺,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吊档!你這毒婦竟也來了篙议?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤怠硼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后移怯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體香璃,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年舟误,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葡秒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嵌溢,死狀恐怖眯牧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赖草,我是刑警寧澤学少,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站秧骑,受9級(jí)特大地震影響版确,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乎折,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一绒疗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骂澄,春花似錦吓蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至樱衷,卻和暖如春棋嘲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矩桂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工沸移, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痪伦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓雹锣,卻偏偏與公主長(zhǎng)得像网沾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕊爵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理辉哥,服務(wù)發(fā)現(xiàn),斷路器攒射,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 0 準(zhǔn)備 安裝注冊(cè)中心:Zookeeper醋旦、Dubbox自帶的dubbo-registry-simple;安裝Du...
    七寸知架構(gòu)閱讀 13,970評(píng)論 0 88
  • 1.背景 想象下這么個(gè)場(chǎng)景: 有個(gè)做生活服務(wù)的APP会放,主要提供一些生活化的咨詢信息饲齐,比如天氣、新聞咧最、個(gè)人三金賬單捂人、...
    點(diǎn)融黑幫閱讀 3,868評(píng)論 0 33
  • 午醒逛園藤滿路。幾種心情矢沿,只把冰眉蹙滥搭。月少半邊天狗吐,心缺一角誰能補(bǔ)捣鲸? 遍地殘花弗忍顧瑟匆。淚眼忽寒,愁絮穿朱戶摄狱。又是...
    瑰洱閱讀 249評(píng)論 0 2
  • 用了好幾年的蘋果原裝數(shù)據(jù)線脓诡,終于還是無法忍受它的愛破皮、不耐臟以及價(jià)格略貴媒役。圖拉斯數(shù)據(jù)線是我用的第一款第三方數(shù)據(jù)線...
    黎虹閱讀 627評(píng)論 0 3