dubbox源碼
1. bbo-container源碼怎麼打包
Dubbo的服務的過程,也需要一個像reference的對象來維護service關聯的所有對象及其屬性,這里的reference就是provider。由於ServiceBean實現了
InitializingBean介面,所有在Spring實例化這個bean後會調用介面方法afterPropertiesSet:
[java] view plain
public void afterPropertiesSet() throws Exception {
//如果沒有配置provider
if (getProvider() == null) {
//獲取IOC容器里的所有provider
Map<String, ProviderConfig> providerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProviderConfig.class, false, false);
if (providerConfigMap != null && providerConfigMap.size() > 0) {
Map<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);
if ((protocolConfigMap == null || protocolConfigMap.size() == 0)
&& providerConfigMap.size() > 1) { // 兼容舊版本
List<ProviderConfig> providerConfigs = new ArrayList<ProviderConfig>();
for (ProviderConfig config : providerConfigMap.values()) {
if (config.isDefault() != null && config.isDefault().booleanValue()) {
providerConfigs.add(config);
}
}
//關聯所有providers
if (providerConfigs.size() > 0) {
setProviders(providerConfigs);
}
} else {
ProviderConfig providerConfig = null;
for (ProviderConfig config : providerConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (providerConfig != null) {
throw new IllegalStateException("Duplicate provider configs: " + providerConfig + " and " + config);
}
providerConfig = config;
}
}
if (providerConfig != null) {
setProvider(providerConfig);
}
}
}
}
//如果沒有配置application,且沒有配置provider
if (getApplication() == null
&& (getProvider() == null || getProvider().getApplication() == null)) {
//獲取所有applications
Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false);
if (applicationConfigMap != null && applicationConfigMap.size() > 0) {
ApplicationConfig applicationConfig = null;
for (ApplicationConfig config : applicationConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (applicationConfig != null) {
throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
}
applicationConfig = config;
}
}
//關聯application
if (applicationConfig != null) {
setApplication(applicationConfig);
}
}
}
//如果沒有配置mole,且沒有配置provider
if (getMole() == null
&& (getProvider() == null || getProvider().getMole() == null)) {
Map<String, MoleConfig> moleConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MoleConfig.class, false, false);
if (moleConfigMap != null && moleConfigMap.size() > 0) {
MoleConfig moleConfig = null;
for (MoleConfig config : moleConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (moleConfig != null) {
throw new IllegalStateException("Duplicate mole configs: " + moleConfig + " and " + config);
}
moleConfig = config;
}
}
//關聯mole
if (moleConfig != null) {
setMole(moleConfig);
}
}
}
//如果沒有配置registries,且沒有配置provider
if ((getRegistries() == null || getRegistries().size() == 0)
&& (getProvider() == null || getProvider().getRegistries() == null || getProvider().getRegistries().size() == 0)
&& (getApplication() == null || getApplication().getRegistries() == null || getApplication().getRegistries().size() == 0)) {
Map<String, RegistryConfig> registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false);
if (registryConfigMap != null && registryConfigMap.size() > 0) {
List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
for (RegistryConfig config : registryConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
registryConfigs.add(config);
}
}
//關聯registries
if (registryConfigs != null && registryConfigs.size() > 0) {
super.setRegistries(registryConfigs);
}
}
}
//如果沒有配置monitor,且沒有配置provider
if (getMonitor() == null
&& (getProvider() == null || getProvider().getMonitor() == null)
&& (getApplication() == null || getApplication().getMonitor() == null)) {
Map<String, MonitorConfig> monitorConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MonitorConfig.class, false, false);
if (monitorConfigMap != null && monitorConfigMap.size() > 0) {
MonitorConfig monitorConfig = null;
for (MonitorConfig config : monitorConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (monitorConfig != null) {
throw new IllegalStateException("Duplicate monitor configs: " + monitorConfig + " and " + config);
}
monitorConfig = config;
}
}
//關聯monitor
if (monitorConfig != null) {
setMonitor(monitorConfig);
}
}
}
//如果沒有配置protocol,且沒有配置provider
if ((getProtocols() == null || getProtocols().size() == 0)
&& (getProvider() == null || getProvider().getProtocols() == null || getProvider().getProtocols().size() == 0)) {
Map<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);
if (protocolConfigMap != null && protocolConfigMap.size() > 0) {
List<ProtocolConfig> protocolConfigs = new ArrayList<ProtocolConfig>();
for (ProtocolConfig config : protocolConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
protocolConfigs.add(config);
}
}
//關聯protocol
if (protocolConfigs != null && protocolConfigs.size() > 0) {
super.setProtocols(protocolConfigs);
}
}
}
//如果沒有配置path
if (getPath() == null || getPath().length() == 0) {
if (beanName != null && beanName.length() > 0
&& getInterface() != null && getInterface().length() > 0
&& beanName.startsWith(getInterface())) {
setPath(beanName);
}
}
//暴露provider
if (! isDelay()) {
export();
}
}
2. bbox 和bbo 的區別
bbo和bbox都是流行的服務治理框架,
bbox是當當網的技術團隊對bbo框架的擴展,針對bbo的一些問題進行擴展處理:
主要擴展的功能是支持REST風格遠程調用(HTTP + JSON/XML)和支持基於Kryo和FST的Java高效序列化實現
3. bbox給bbo添加的rest調用是畫蛇添足嗎
古代楚國有個貴族,祭過祖宗以後,把一壺祭酒賞給前來幫忙的門客。門客們互相商量說:「這壺酒大家都喝不夠,一個人喝有富餘。讓咱們各自在地上比賽畫蛇,誰先畫好,誰就喝這壺酒。」 有一個人最先把蛇畫好了。他端起酒壺正要喝,卻得意洋洋地左手拿著酒壺,右手繼續畫蛇,說:「你們看,我還有時間再給蛇添上幾只腳呢!」 可是沒等他把蛇腳畫完,另一個人已經把蛇畫完了。那人把酒壺搶了過去,他說:「蛇本來是沒有腳的,你怎麼能給它添上腳呢!」說罷,便把壺中的酒喝了下去。那個給蛇添腳的人失掉了本應該是他的那壺酒。 這個寓言故事告訴人們,凡做一件事情,必須有具體的要求和明確的目標,要以清醒堅定的意志,追求並完成它,不要被勝利沖昏頭腦,而招致失敗。 (算上標點是308字。不算標點是288字)
4. 求深度解剖bbo源碼的視頻
你可以在CSDN中找到你想要的 框架和資料庫估計你自己能拿下吧 關鍵是核心代碼 在CSDN里你可以找到
5. bbox 是分布式框架嗎
是的
Dubbox是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,bbox就是個服務框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有bbox這樣的分布式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的分布式框架
其核心部分包含:
1. 遠程通訊: 提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及「請求-響應」模式的信息交換方式。
2. 集群容錯: 提供基於介面方法的透明遠程過程調用,包括多協議支持,以及軟負載均衡,失敗容錯,地址路由,動態配置等集群支持。3. 自動發現: 基於注冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
6. 如何更好地學習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表的變更,檢查類型包括:參數覆蓋變更、路由變更、服務消費者變更、權重變更、負載均衡變更。
7. 使用bbox開源技術框架能申請專利嗎
軟體申請專利,重點在於1)解決的技術問題,3)產生的技術效果,2)通過的技術手段,比如據傳輸或處理方法、如何執行命令的方法都可以申請發明類專利,GUI(用戶交互界面)申請外觀類專利。
比如最近我手頭在處理的加速視頻解編碼的技術。
您要重視的是開源的框架保留的權利(如是否在此框架基礎上產生的財產權)。
8. 關於bbo和bbox的問題,希望得到您的回答。
這不是寫了bbo-spring,是bbo啊 。
9. bbox 怎麼部署在tomcat
DUBBO的介紹部分我這里就不介紹了,大家可參考官方文檔。
DUBBO的注冊中心安裝
DUBBO的注冊中心支持好幾種,公司用到zookeeper注冊中心,所以我這邊只說明zookeeper注冊中心如何安裝。
安裝zookeeper注冊中心首先得下載zookeeper。大家可到zookeeper的官網http://zookeeper.apache.org/releases.html上去下載。
我下載了zookeeper-3.4.5.tar.gz版本的包。接下來把zookeeper-3.4.5.tar.gz解壓到文件夾D:\zookeeper-3.4.5\中,
然後將zoo_sample.cfg改名為zoo.cfg。然後將配置文件zoo.cfg改成如下:
[html] view plain
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\zookeeper-3.4.5\\data
dataLogDir=D:\\zookeeper-3.4.5\\log
# the port at which the clients will connect
clientPort=2181
然後就可以啟動了。
DUBBO的管理平台DUBBO-ADMIN的部署
bbo-admin.war可在網上網路去下載,但是我下載了好幾個war包,發布上去服務啟動都報錯,這個時候大概是我們系統的JDK和編譯
bbo-admin.war的JDK版本不同導致的了。所以我之後直接下載了bbo-master的源代碼,然後自己編譯了一個war包,這樣就不會存
在啟動報錯的問題了。
10. bbox maven是多少
Maven子模塊間用依賴來實現調用,實質是一個項目將另一個項目變成jar包引入,你所說的A要調用到B類其實是在一個項目在運行。 Dubbo本質是rpc,服務消費方遠程調用服務提供方,這個時候A和B是在兩個獨立的服務中的。