Dubbo是什么
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點是按照分層的方式來架構(gòu),使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務(wù)模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務(wù),要么是消費方消費服務(wù),所以基于這一點可以抽象出服務(wù)提供方(Provider)和服務(wù)消費方(Consumer)兩個角色。
簡單說呢,Dubbo用起來就和EJB、WebService差不多,調(diào)用一個遠程的服務(wù)(或者JavaBean)的時候在本地有一個接口,就像調(diào)用本地的方法一樣去調(diào)用,它底層幫你實現(xiàn)好你的方法參數(shù)傳輸和遠程服務(wù)運行結(jié)果傳回之后的返回,就是RPC的一種封裝啦~
當然,這個只是Dubbo的最基本的功能,它的特點是:
- 它主要是使用高效的網(wǎng)絡(luò)框架和序列化框架,讓分布式服務(wù)之間調(diào)用效率更高。
- 采用
注冊中心
管理眾多的服務(wù)接口地址,當你想調(diào)用服務(wù)的時候只需要跟注冊中心詢問即可,不用像使用WebService一樣每個服務(wù)都得記錄好接口調(diào)用方式。 -
監(jiān)控中心
:實現(xiàn)對服務(wù)方和調(diào)用方之間運行狀態(tài)的監(jiān)控,還能控制服務(wù)的優(yōu)先級、權(quán)限、權(quán)重、上下線等,讓整個龐大的分布式服務(wù)系統(tǒng)的維護和治理比較方便。 - 高可用:有個服務(wù)宕機了?注冊中心就會從服務(wù)列表去掉該節(jié)點。還是調(diào)用到了?客戶端會向注冊中心請求另一臺可用的服務(wù)節(jié)點重新調(diào)用。注冊中心宕機?注冊中心也能實現(xiàn)高可用(ZooKeeper)。
- 負載均衡:采用軟負載均衡算法實現(xiàn)對多個相同服務(wù)的節(jié)點的請求負載均衡。
- 等等。。。很多高大上的,看官方文檔吧,我也是文檔中抄過來的~
一些參考站點或博客
- 官方用戶指南:http://dubbo.io/User+Guide-zh.htm
- 官網(wǎng)(還有挺多東西,不一一列出了,自己點點就有):http://dubbo.io/
- Dubbo開源地址:https://github.com/alibaba/dubbo/
- Dubbo另一開源地址:https://github.com/dubbo/
主要包括了Alibaba的Dubbo項目和當當網(wǎng)拓展之后的Dubbox項目,以及一些其他子項目和工具的代碼,可以作為參考。- Dubbo架構(gòu)設(shè)計詳解:http://shiyanjun.cn/archives/325.html
一開始會有很多看不懂的,很正常,先整體過一遍,了解大致情況,等學(xué)的比較清楚了,再看一遍,會有額外收獲,溫故而知新,可以為師矣。- 一個很詳細的Dubbo學(xué)習(xí)筆記博客:http://blog.csdn.net/lipslive/article/details/46530361
- 軟負載均衡算法:http://www.cnblogs.com/xrq730/p/5154340.html
*** 注意 ***
所有東西以官方用戶指南為準:http://dubbo.io/User+Guide-zh.htm
其他第三方文章博客什么的可以參考輔助理解,但是由于阿里是國內(nèi)公司,官方用戶指南,特別是中文版都特別詳細,真的沒有很多必要去找一堆第三方的教程來看啦~
Dubbo環(huán)境準備
Dubbo需要四大基本組件:Registry、Monitor、Provider、Consumer。
安裝注冊中心(Registry),我用ZooKeeper,具體參考我的ZooKeeper教程博客,安裝好ZooKeeper之后注冊中心就有了,先放著,等會用。
安裝簡單監(jiān)控中心:simple-monitor。網(wǎng)上找
dubbo-monitor-simple-2.8.4-assembly.tar.gz
。
- 解壓,找到conf文件夾下的dubbo.properties文件,下面簡單介紹各個配置參數(shù)的意義:
容器,就是說這個簡單監(jiān)控中心是在jetty和spring環(huán)境下運行的,依賴于注冊中心,日志系統(tǒng)是log4j
dubbo.container=log4j,spring,registry,jetty
監(jiān)控系統(tǒng)對整個Dubbo服務(wù)系統(tǒng)來說也是一個服務(wù),這里指定了這個監(jiān)控服務(wù)的名稱
dubbo.application.name=simple-monitor
服務(wù)的所有者,這是Dubbo的服務(wù)的功能,可以指定服務(wù)的負責(zé)人
dubbo.application.owner=coselding
下面四個是指定注冊中心地址的,分別為廣播、zookeeper、redis、dubbo(自帶)方式的注冊中心,前面說了,我用的是Zookeeper(前面配好了),因此去掉zookeeper前面的#,配置zookeeper的ip和端口號。之后簡單監(jiān)控中心就能通過注冊中心獲取當前可用的服務(wù)列表及其狀態(tài),在頁面向你匯報Dubbo中的服務(wù)運行情況。
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é)議端口號,保持默認即可
dubbo.protocol.port=7070
jetty工作端口號,平時不是習(xí)慣8080嗎?當然,這里為了不影響之后運行的tomcat,就不要占用8080端口啦。
dubbo.jetty.port=8082
一個工作目錄,在這個目錄會保存一些監(jiān)控中心的數(shù)據(jù),比如調(diào)用曲線圖等,這里指定一個存在的空目錄即可
dubbo.jetty.directory=${user.home}/monitor
監(jiān)控中心報表存放的目錄,同上,一般默認即可
dubbo.charts.directory=${dubbo.jetty.directory}/charts
監(jiān)控中心數(shù)據(jù)資料目錄,同上,一般默認即可
dubbo.statistics.directory=${user.home}/monitor/statistics
監(jiān)控中心日志文件路徑
dubbo.log4j.file=logs/dubbo-monitor-simple.log
監(jiān)控中心日志記錄級別
dubbo.log4j.level=WARN
>* 運行bin目錄下的start.sh(unix系下)或start.bat(win下)即可。
>* 瀏覽器訪問:`http://{簡單監(jiān)控中心所在的主機ip}:8082`,端口號是剛才配置文件設(shè)置的8082,即可訪問查看Dubbo服務(wù)集群中的應(yīng)用和服務(wù)的簡單情況。
3. 安裝**Dubbo管理控制臺**:
>* 下載`dubbo-admin-2.8.4.war`,這個是Dubbo的管理控制臺的webapp的war包,將其解壓。
>* WEB-INF目錄下的`dubbo.properties`文件配置Dubbo的信息,如下:
>```bash
# 配置注冊中心地址,和簡單監(jiān)控中心一樣,通過注冊中心才能監(jiān)控當前所有可用的服務(wù)。
dubbo.registry.address=zookeeper://127.0.0.1:2181
# root賬戶的密碼,網(wǎng)頁進入控制臺界面之前需要輸入帳號密碼
dubbo.admin.root.password=root
# guest訪客賬戶的密碼
dubbo.admin.guest.password=guest
- 將修改完配置的dubbo-admin的整個目錄復(fù)制到tomcat的webapps目錄下,重啟tomcat,說白了dubbo-admin就是tomcat的一個webapp的形式存在。
Dubbo注冊中心
上面已經(jīng)安裝完成了zookeeper的注冊中心了,這個注冊中心主要就是負責(zé)dubbo的所有服務(wù)地址列表維護,并且可以通過在ZooKeeper節(jié)點中設(shè)置相應(yīng)的值來實現(xiàn)對這個服務(wù)的權(quán)重、優(yōu)先級、是否可用、路由、權(quán)限等的控制。
你可以先記住,之后在Dubbo的管理控制臺對服務(wù)的一堆治理策略設(shè)置和調(diào)整,實際上就是修改了注冊中心中的服務(wù)對應(yīng)的配置數(shù)據(jù)(即修改了zookeeper中服務(wù)對應(yīng)的節(jié)點的配置數(shù)據(jù))。
之后Consumer
從注冊中心請求到服務(wù)的數(shù)據(jù)時就能根據(jù)這些配置數(shù)據(jù)進行相應(yīng)的治理配置參數(shù)的代碼執(zhí)行生效。
Dubbo樣例服務(wù)開發(fā)
這里我用maven構(gòu)建項目,在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>
-
Provider
:
- 聲明服務(wù)的接口:
public interface IMyDemo {
String sayHello(String name);
}
- 對接口進行實現(xiàn)(這里是Provider,需要真的實現(xiàn),之后在Consumer端調(diào)用接口之后實際就是在這里的實現(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中擴展的配置解析生成對應(yīng)的dubbo實例放到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中層次級別是先分為多個應(yīng)用(可以理解為一個項目),在每個應(yīng)用下有多個服務(wù)(可以理解為項目下具體的某個提供服務(wù)的服務(wù)類) -->
<!-- 這里就是指定一個應(yīng)用的名稱,指定相同的應(yīng)用名的服務(wù)在dubbo中都會被分配在同一個應(yīng)用分支下 -->
<dubbo:application name="hello-world-app" />
<!-- 之前配置好的ZooKeeper服務(wù)器作為注冊中心,這里指定好ZooKeeper的地址,此處的Dubbo才能連接上注冊服務(wù)器,很好理解 -->
<dubbo:registry address="zookeeper://119.29.153.56:2181" id="registry" />
<!-- Dubbo的每個節(jié)點之間通信可以支持rmi、Http、Dubbo等一系列的協(xié)議,這里指定默認的dubbo協(xié)議,以及此處的服務(wù)Provider對外暴露的服務(wù)端口號 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 到這里,這個Provider節(jié)點就已經(jīng)能連上注冊服務(wù)器,并使用指定的協(xié)議進行通信了 -->
<!-- 這里對外暴露剛才編寫的接口,并指定IoC容器中接口的實現(xiàn)來為這個接口提供實際的服務(wù) -->
<dubbo:service interface="com.weidian.dubbo.IMyDemo" ref="myDemo"/>
<!-- 這里是Spring原始的JavaBean聲明方式,并放在IoC容器中 -->
<bean id="myDemo" class="com.weidian.dubbo.MyDemo"/>
</beans>
- 本地測試一下這個服務(wù)是否可用,這里還沒用到Dubbo,只是先測試一下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);
}
運行結(jié)果:
provider.png
Provider內(nèi)部代碼輸出了一遍,返回到測試代碼又輸出了一遍,總共兩遍hello world
-
Consumer
:
- 編寫和Provider服務(wù)的對應(yīng)接口:
public interface IMyDemo {
String sayHello(String name);
}
- Spring配置遠程的服務(wù)為本地的JavaBean(consumer.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!-- 這里添加了dubbo的命名空間,之后Spring通過dubbo中擴展的配置解析生成對應(yīng)的dubbo實例放到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ù)器作為注冊中心,這里指定好ZooKeeper的地址,此處的Dubbo才能連接上注冊服務(wù)器,很好理解 -->
<dubbo:registry address="zookeeper://119.29.153.56:2181" id="registry" />
<!-- Dubbo的每個節(jié)點之間通信可以支持rmi、Http、Dubbo等一系列的協(xié)議,這里指定默認的dubbo協(xié)議,
以及此處的Consumer對外暴露的服務(wù)端口號,因為注冊中心有服務(wù)節(jié)點列表更新是要實時推送到Consumer中的
-->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 到這里,這個Consumer節(jié)點就已經(jīng)能連上注冊服務(wù)器,并使用指定的協(xié)議進行通信了 -->
<!-- 接口指定Consumer端的那個服務(wù)接口,之后它就會通過這個接口的應(yīng)用名和全限定名去注冊中心
查找實際的服務(wù)Provider地址列表,再通過指定的dubbo協(xié)議進行通信,實現(xiàn)RPC,而在Consumer
本機端對Spring的IoC容器指定id,方便之后對這個遠程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>
- 遠程過程調(diào)用測試(前提是先把Provider的服務(wù)先運行起來再來運行這個Consumer(在兩個端的測試代碼尾部都添加了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);
}
運行結(jié)果:
Provider:
remote-provider.png
啟動Provider輸出了兩遍,Consumer調(diào)用時本地實現(xiàn)又輸出了一遍,共三遍。
Consumer:
consumer.png
啟動Consumer,遠程返回輸出了一遍。
Dubbo簡單監(jiān)控中心
簡單介紹,其實用處不大,我覺得管理后臺的功能已經(jīng)把這個監(jiān)控中心的功能覆蓋了,僅僅只是拿來測試使用一下。
主界面:
simple-monitor.png
服務(wù)列表界面,顯示所有服務(wù)以及它的Provider和Consumer情況:
simple-monitor-Service.png
Dubbo管理后臺使用
之前Tomcat中配置好了dubbo-admin的webapp,現(xiàn)在只要打開tomcat,并輸入相應(yīng)的地址即可訪問dubbo-admin的界面,如我的是http://127.0.0.1:8080/dubbo-admin/
。
其實就是一個很常見的管理后臺,可以控制每個服務(wù)、應(yīng)用的狀態(tài)、權(quán)重、路由控制、訪問控制、負載均衡、各個應(yīng)用的服務(wù)情況和消費情況等,不需要教程,直接上手使用即可,至于其中的一些可能有疑問的概念,下面的內(nèi)容將一一說明。
服務(wù)路由
路由,顧名思義,就是通過配置去設(shè)定哪些Consumer節(jié)點的請求由哪些節(jié)點的Provider節(jié)點的服務(wù)來進行響應(yīng),可以在一定程度上控制負載分布。
知道這個概念,那剩下就是配置的問題了,明白怎么回事其實就很簡單啦~
在dubbo-admin主界面
——服務(wù)治理
——路由規(guī)則
,如下:
點擊新增
:
路由名稱
:為你定義的這個路由規(guī)則聲明一個名稱,之后可以根據(jù)這個名稱來找這個路由規(guī)則。
優(yōu)先級
:很明顯,一個int數(shù)值代表這個路由規(guī)則的優(yōu)先級,優(yōu)先級越高這個規(guī)則越先匹配。
服務(wù)名
:列表選擇的,從注冊中心中已有的服務(wù)列表中選擇一個服務(wù),表示這個路由規(guī)則要約束的是哪個服務(wù)。
方法名
:列表選擇的,選擇要約束的這個服務(wù)中的哪個方法。
匹配條件
:填寫匹配
下面的列表就表示匹配了條件才受這個路由規(guī)則約束,否則就是不匹配規(guī)則才受該規(guī)則約束。
消費者IP地址
:要約束的Consumer的IP地址列表,逗號隔開。
消費者應(yīng)用名
:要約束的Consumer的應(yīng)用名列表。
消費者集群
:按照提示上寫的去找,沒找到相應(yīng)的選項,暫時也沒用到,之后再回頭編輯。
過濾規(guī)則
:填寫匹配
下面的列表就表示匹配了條件才受這個路由規(guī)則約束,否則就是不匹配規(guī)則才受該規(guī)則約束。
提供者IP地址
:要約束的Provider的IP地址列表,逗號隔開。
提供者集群
:按照提示上寫的去找,沒找到相應(yīng)的選項,暫時也沒用到,之后再回頭編輯。
提供者協(xié)議
:指定Provider的協(xié)議,不是該協(xié)議的也不約束。
提供者端口
:指定Provider的端口,不是這個端口的也不約束。
測試樣例展示:
這樣配置的路由就能夠生效,效果是:com.weidian.dubbo.IMyDemo
服務(wù)的sayHello
方法下,地址為192.168.31.164
的Consumer的請求由(地址:192.168.31.164
;協(xié)議:dubbo
;端口:20880
)的Provider進行響應(yīng),如果沒有匹配的Provider就會默認返回所有的Provider列表給Consumer,讓Consumer自己選。
點擊保存
,保存新增的路由規(guī)則,并在路由規(guī)則列表中啟用這個規(guī)則,如下:
點擊預(yù)覽
,在消費者地址填寫192.168.31.164,點擊預(yù)覽,如下圖所示:
運行Consumer程序,查看消費者狀態(tài),可知設(shè)定的這個路由規(guī)則對該對應(yīng)地址的消費真生效了,如下圖:
另外,IP地址支持結(jié)尾為匹配所有,如10.0.0.或者10.0.*等。
不匹配的配置規(guī)則和匹配的配置規(guī)則是一致的。
負載均衡
dubbo提供4種負載均衡方式:
Random
:隨機,按權(quán)重配置隨機概率,調(diào)用量越大分布越均勻,默認是這種方式
RoundRobin
:輪詢,按權(quán)重設(shè)置輪詢比例,如果存在比較慢的機器容易在這臺機器的請求阻塞較多
LeastActive
:最少活躍調(diào)用數(shù),不支持權(quán)重,只能根據(jù)自動識別的活躍數(shù)分配,不能靈活調(diào)配
ConsistentHash
:一致性hash,對相同參數(shù)的請求路由到一個服務(wù)提供者上,如果有類似灰度發(fā)布需求可采用
dubbo的負載均衡機制是在客戶端調(diào)用時通過內(nèi)存中的服務(wù)方信息及配置的負責(zé)均衡策略選擇,如果對自己系統(tǒng)沒有一個全面認知,建議先采用random方式。
Dubbo過濾器
有需要自己實現(xiàn)dubbo過濾器的,可關(guān)注如下步驟:
-
dubbo初始化過程加載ClassPath下的
META-INF/dubbo/internal/
,META-INF/dubbo/
,META-INF/services/
三個路徑(classloader resource)下面的com.alibaba.dubbo.rpc.Filter
文件。
文件內(nèi)容:
每行Name
=FullClassName
,這些類必須是實現(xiàn)Filter接口,如下圖:
filter-prop.png 自定義Filter類:
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
//激活這個過濾器的注解,標記這個過濾器在消費者端加入過濾器鏈
@Activate(group = Constants.CONSUMER)
//dubbo過濾器的實現(xiàn)類
public class DubboTestFilter implements Filter {
/**計時器過濾器,記錄這個RPC的整個過程執(zhí)行時間
* @param invoker
* @param invocation
* @return
* @throws RpcException
*/
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
long start = System.currentTimeMillis();
//這個是RPC的實現(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;
}
}
-
consumer.xml配置文件中配置這個過濾器,如下圖:
filter-spring.png -
先來看看配置完成之后的執(zhí)行效果:
filter-run.png
對比上面的過濾器代碼可知,先輸出了RPC過程的運行時間,之后在過濾器中輸出了一遍執(zhí)行結(jié)果
hello world
,之后單元測試本身再把執(zhí)行結(jié)果輸出一遍,因此hello world
輸出了兩遍。
- Dubbo過于這個過濾器的加載過程:
(1) 先加載那三個路徑下的
com.alibaba.dubbo.rpc.Filter
文件里面的鍵值對,key為過濾器的名稱,value為過濾器的類全限定名(這個類必須實現(xiàn)Dubbo中的Filter接口);
(2) 這樣就能找到這個類的class文件了,檢查@Activate
注解加載這個過濾器設(shè)定的一些全局基本屬性;
(3) Spring在加載consumer.xml文件的時候,通過
<dubbo:consumer filter="dubboTestFilter" id="dubboTestFilter" retries="0"/>
指定消費者端要加載的過濾器,通過filter
屬性指定過濾器名稱(就是配置文件中的過濾器key),這樣剛才加載的過濾器類就加入消費者代碼邏輯中的過濾器鏈了。
- 關(guān)于
@Activate
注解: —— 自動激活
group
:(provider|consumer)匹配了對應(yīng)的角色才被加載
value
:標明過濾條件,不寫則所有條件下都會被加載,寫了則只有dubbo URL中包含該參數(shù)名且參數(shù)值不為空才被加載,這個參數(shù)會以dubbo協(xié)議的一個參數(shù)K-V對傳到Provider。
Dubbo Rest風(fēng)格服務(wù)
- 當當Dubbox:https://dangdangdotcom.github.io/dubbox/rest.html
- Dubbo Rest風(fēng)格服務(wù)開發(fā):https://segmentfault.com/a/1190000005170426
----