1. bbo privider與consumer同時配置retry以哪個為主
bbo配置優先順序:
方法級>介面級>全局級
消費方配置優先於提供方配置
所以,retry如果都配了,以消費方為主。
2. 如何更好地學習bbo源代碼
1、Dubbo與Spring的整合 Dubbo在使用上可以做到非常簡單,不管是Provider還是Consumer都可以通過Spring的配置文件進行配置,配置完之後,就可以像使用 spring bean一樣進行服務暴露和調用了,完全看不到bbo api的存在。這是因為bbo使用了spring提供的可擴展Schema自定義配置支持。在spring配置文件中,可以像、這樣進行配置。 META-INF下的spring.handlers文件中指定了bbo的xml解析類:DubboNamespaceHandler。像前面的被解 析成ServiceConfig,被解析成ReferenceConfig等等。 2、jdk spi擴展 由於Dubbo是開源框架,必須要提供很多的可擴展點。Dubbo是通過擴展jdk spi機制來實現可擴展的。具體來說,就是在META-INF目錄下,放置文件名為介面全稱,文件中為key、value鍵值對,value為具體實現類 的全類名,key為標志值。由於bbo使用了url匯流排的設計,即很多參數通過URL對象來傳遞,在實際中,具體要用到哪個值,可以通過url中的參 數值來指定。 Dubbo對spi的擴展是通過ExtensionLoader來實現的,查看ExtensionLoader的源碼,可以看到Dubbo對jdk spi做了三個方面的擴展:
(1)jdk spi僅僅通過介面類名獲取所有實現,而ExtensionLoader則通過介面類名和key值獲取一個實現;
(2)Adaptive實現,就是生成一個代理類,這樣就可以根據實際調用時的一些參數動態決定要調用的類了。
(3)自動包裝實現,這種實現的類一般是自動激活的,常用於包裝類,比如Protocol的兩個實現類:ProtocolFilterWrapper、ProtocolListenerWrapper。 3、url匯流排設計 Dubbo為了使得各層解耦,採用了url匯流排的設計。我們通常的設計會把層與層之間的交互參數做成Model,這樣層與層之間溝通成本比較大,擴展起來也比較麻煩。因此,Dubbo把各層之間的通信都採用url的形式。比如,注冊中心啟動時,參數的url為: registry://0.0.0.0:9090?codec=registry&transporter=netty 這就表示當前是注冊中心,綁定到所有ip,埠是9090,解析器類型是registry,使用的底層網路通信框架是netty。
二、Dubbo啟動過程
Dubbo分為注冊中心、服務提供者(provider)、服務消費者(consumer)三個部分。 1、注冊中心啟動過程 注冊中心的啟動過程,主要看兩個類:RegistrySynchronizer、RegistryReceiver,兩個類的初始化方法都是start。 RegistrySynchronizer的start方法:
(1)把所有配置信息load到內存;
(2)把當前注冊中心信息保存到資料庫;
(3)啟動5個定時器。 5個定時器的功能是: (1)AutoRedirectTask,自動重定向定時器。默認1小時運行1次。如果當前注冊中心的連接數高於平均值的1.2倍,則將多出來的連接數重定向到其他注冊中心上,以達到注冊中心集群的連接數均衡。 (2)DirtyCheckTask,臟數據檢查定時器。作用是:分別檢查緩存provider、資料庫provider、緩存consumer、資料庫 consumer的數據,清除臟數據;清理不存活的provider和consumer數據;對於緩存中的存在的provider或consumer而數 據庫不存在,重新注冊和訂閱。 (3)ChangedClearTask,changes變更表的定時清理任務。作用是讀取changes表,清除過期數據。 (4)AlivedCheckTask,注冊中心存活狀態定時檢查,會定時更新registries表的expire欄位,用以判斷注冊中心的存活狀態。如果有新的注冊中心,發送同步消息,將當前所有注冊中心的地址通知到所有客戶端。 (5)ChangedCheckTask,變更檢查定時器。檢查changes表的變更,檢查類型包括:參數覆蓋變更、路由變更、服務消費者變更、權重變更、負載均衡變更。
3. 我從github上下載了bbo的最新的源代碼,可是import到myeclipse中有錯誤,找不到bbo的jar包
這是個maven管理的吧,導入要用maven的方式去倒入,會互相依賴的。
4. 怎麼用註解的方式發布bbo服務
使用 @com.alibaba.bbo.config.annotation.Service 發布bbo服務的時候,當服務類沒有加入@Transactional的時候沒有問題.
但是當加入事務後【@Transactional】, bbo的 AnnotationBean 掃描 類執行下面的代碼的時候就獲取不到對應的註解,也就發布不了服務。
究其原因,是因為Dubbo提供的註解沒有@Inherited元註解。
我們通過@Transactional標注過的Service產生一個代理類,這個代理類有兩種生成方式。一種是jdk動態代理,一種是CGLib動態代理。
jdk動態代理生成的代理類與當前類共同實現相同的介面,所以與當前類也只是間接調用的關心,不在此次討論范圍。
CGLib生成的代理類為當前Service的子類,可以集成到當前Service的註解。
根據需求,我們需要更改Dubbo的源碼
在Dubbo的Service註解上加上@Inherited,使這個註解變成可繼承的。
然後再當前項目的spring的主配置文件中強制所有bean使用CGLib代理
這樣服務即可正常發布。
5. bbo實際應用是需要配置消費者嗎
1. Dubbo是什麼?
Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,bbo就是個服務框架,如
果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有bbo這樣的分布式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架(告別Web Service模式中的WSdl,以服務者與消費者的方式在bbo上注冊)
其核心部分包含:
1. 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及「請求-響應」模式的信息交換方式。
2. 集群容錯: 提供基於介面方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
3. 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
2. Dubbo能做什麼?
1.透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
2.軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。
3. 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring載入Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行載入。
之
前使用Web
Service,我想測試介面可以通過模擬消息的方式通過soapui或LR進行功能測試或性能測試。但現在使用Dubbo,介面之間不能直接交互,我嘗
試通過模擬消費者地址測試,結果不堪入目,再而使用jmeter通過junit進行測試,但還是需要往bbo上去注冊,如果再不給提供源代碼的前提
下,這個測試用例不好寫啊....
3. bbo的架構
bbo架構圖如下所示:
節點角色說明:
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務注冊與發現的注冊中心。
Monitor: 統計服務的調用次調和調用時間的監控中心。
Container: 服務運行容器。
這點我覺得非常好,角色分明,可以根據每個節點角色的狀態來確定該服務是否正常。
調用關系說明:
0 服務容器負責啟動,載入,運行服務提供者。
1. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
2. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
3. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
bbo的容錯性顯而易見,性能方面還沒有還得及測,我們系統某頁面需要掉5次介面,本來想建議做個緩存,但業務關系不能採納,還需要研究下bbo的性能調優問題...
4. bbo使用方法。
Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring載入Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行載入。如果不想使用Spring配置,而希望通過API的方式進行調用(不推薦)
下面我們就來看看spring配置方式的寫法:
服務提供者:
1. 下載zookeeper注冊中心,下載地址: 下載後解壓即可,進入D:apach-zookeeper-3.4.5bin,
雙擊zkServer.cmd啟動注冊中心服務。
2. 定義服務介面: (該介面需單獨打包,在服務提供方和消費方共享)
下面這個例子不錯,寫的很詳細可以做個model.
package com.unj.bbotest.provider;
import java.util.List;
public interface DemoService {
String sayHello(String name);
public List getUsers();
}
在服務提供方實現介面:(對服務消費方隱藏實現)
package com.unj.bbotest.provider;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class DemoServiceImpl implements DemoService{
public String sayHello(String name) {
return "Hello " + name;
}
public List getUsers() {
List list = new ArrayList();
User u1 = new User();
u1.setName("jack");
u1.setAge(20);
u1.setSex("男");
User u2 = new User();
u2.setName("tom");
u2.setAge(21);
u2.setSex("女");
User u3 = new User();
u3.setName("rose");
u3.setAge(19);
u3.setSex("女");
list.add(u1);
list.add(u2);
list.add(u3);
return list;
}
}
用Spring配置聲明暴露服務:
<beans xmlns=""
xmlns:xsi=""
xmlns:bbo=""
xsi:schemaLocation="
/spring-beans.xsd
/bbo.xsd
">
<!-- 使用multicast廣播注冊中心暴露服務地址
-->
載入Spring配置,啟動服務:
package com.unj.bbotest.provider;
import org.springframework.context.support.;
public class Provider {
public static void main(String[] args) throws Exception {
context = new (new String[] {"applicationContext.xml"});
context.start();
System.in.read(); // 為保證服務一直開著,利用輸入流的阻塞來模擬
}
}
服務消費者:
applicationContext-bbo.xml 中注冊自己需要調用的介面,我剛開始測試的時候需要的介面很多,所以把這個文件寫的滿滿的,後來熟悉了把介面按業務類型分開,寫了N多個 applicationContext-bbo-***.xml 簡練多了 》。
1.通過Spring配置引用遠程服務:
<beans xmlns=""
xmlns:xsi="" xmlns:bbo=""
xsi:schemaLocation="
/spring-beans.xsd
/bbo.xsd
">
<!-- -->
<bbo:reference id="demoService"
interface="com.unj.bbotest.provider.DemoService" />
2.載入Spring配置,並調用遠程服務:
package com.alibaba.bbo.demo.pp;
import java.util.List;
import org.springframework.context.support.;
import com.unj.bbotest.provider.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
context = new (
new String[] { "applicationContext.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); //
String hello = demoService.sayHello("tom"); // ?
System.out.println(hello); //
//
List list = demoService.getUsers();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
// System.out.println(demoService.hehe());
System.in.read();
}
}
/
6. android 可以使用bbo嗎
可以的
DUBBO配置規則詳解
研究DUBBO也已經大半年了,對它的大部分源碼進行了分析,以及對它的內部機制有了比較深入的了解,以及各個模塊的實現。DUBBO包含很多內容,如果想了解DUBBO第一步就是啟動它,從而可以很好的使用它,那麼如何更好的使用呢?就需要知道DUBBO的各個配置項,以及它可以通過哪些途徑進行配置。個人對配置的理解,就好比時對動物的馴服,如何很好的馴服一頭猛獸,那就需要知道它各種因子,從而調整,已達到自己期望的結果。這篇不對DUBBO有哪些配置項可以配置,但是通過這篇文章,你應該能夠知道DUBBO可以進行哪些配置。本文會通過分析DUBBO載入配置源碼的分析,來使得大家對DUBBO的配置一塊有更加深入的了解。從而達到「馴服」DUBBO,以使得它成為你們自己的DUBBO。
DUBBO在配置這一塊做的確實很完美,提供很很多參數,以及提供了多種渠道。下面進入正題,看看DUBBO怎麼載入配置的。在講這些之前,先給大家介紹一下在DUBBO源碼層面定義了哪些類來存儲各個模塊的配置項,從而了解DUBBO可以對哪些模塊進行配置。
哪些東西可以配置
由於大部分項目都會使用Spring,而且DUBBO也提供了通過Spring來進行配置,那麼先從這里進行著手。DUBBO載入Spring的集成時在bbo-config下面的bbo-config-spring模塊下面,其中有一個類DubboNamespaceHandler,它實現了Spring提供的介面NamespaceHandlerSupport。那麼Spring怎麼發現整個實現類的呢?在該模塊的META-INF文件夾下有兩個文件: spring.handlers和spring.schemas,這兩個文件裡面制定了bbo的namespace的XSD文件的位置以及bbo的namespace由DubboNamespaceHandler來處理解析。說了這么多廢話,只是想說明Spring是怎麼解析<bbo:.../>配置的。
知道了DUBBO和Spring關於配置一塊時怎麼整合的之後,那麼你應該就不會詫異Spring怎麼那麼聰明,能夠解析bbo的namespace。接下來看看DubboNamespaceHandler類裡面有什麼東西。
7. bbo怎樣調用其他模塊的pojo
Nodejs 通過 tether 調用 Java Dubbo 服務。請求類的某個參數對象 EsCondition 有 fieldName, op, value 三個欄位,value 的參數值正確解析, fieldName, op 的參數值解析為 null 。 深入到 Dubbo 源碼進行單步調試定位到,發現欄位 field
8. 求深度解剖bbo源碼的視頻
你可以在CSDN中找到你想要的 框架和資料庫估計你自己能拿下吧 關鍵是核心代碼 在CSDN里你可以找到
9. bbo是什麼
Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。
10. 如何開發基於Dubbo RPC的分布式服務
什麼是Dubbo?
Dubbo[]是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。
其核心部分包含:
遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及「請求-響應」模式的信息交換方式。
集群容錯: 提供基於介面方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。
自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo能做什麼?
透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。
服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於介面名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
想了解跟多關於Dubbo的信息,請查看:http://alibaba.github.io/bbo-doc-static/Home-zh.htm
在Crystal框架下,如何開發基於Dubbo RPC的服務?
第一步:定義介面
創建介面Jar項目,如:test-bbo-service-api;
創建介面類和介面方法,和通常的介面定義沒有什麼區別,如:
public interface TestService {
/**
*
* @param a
* @return
*/
public String test(String a);
}
第二步:實現並發布服務
創建服務實現項目,如:test-bbo-service-impl;
引入介面項目(test-bbo-service-api)、Crystal框架bbo服務支持包(crystal-remote-server-bbo),如:
<dependency>
<groupId>com.gsoft.test</groupId>
<artifactId>test-bbo-service-api</artifactId>
</dependency>
<dependency>
<groupId>com.gsoft.crystal</groupId>
<artifactId>crystal-remote-server-bbo</artifactId>
</dependency>
實現服務介面,如:
@Service
public class TestServiceImpl implements TestService {
@Value("${crystal.application.name}")
private String name;
/*
* (non-Javadoc)
*
* @see com.gsoft.test.bbo.TestService#test(java.lang.String)
*/
@Override
public String test(String a) {
return "Hello, " + a + "! " + " I'm " + name + " " + System.getenv("LOGONSERVER") + ".";
}
}
在實現類上添加註解@Service,此處Service為bbo服務的聲明註解com.alibaba.bbo.config.annotation.Service,到此,基於Dubbo發布的服務已經開發並發布完成。