摘要:當(dāng)提供程序線程池耗盡時,不能發(fā)送到使用者端。一些錯誤修正動態(tài)配置不能刪除,支持參數(shù),監(jiān)控統(tǒng)計問題等新功能支持手冊線程池耗盡時自動堆棧轉(zhuǎn)儲。在注冊表無法連接時被阻止。正常關(guān)機(jī),在注冊表取消注冊和線程池關(guān)閉之間增加額外的等待時間。
dubbo分析
原因比較簡單,首先就是spring在開發(fā)環(huán)境的成熟以及使用的易用都是好評,spring本身的擴(kuò)展成本也不高
關(guān)于xsd:schema的各個屬性具體含義就不作過多陳述,大家可以參見
http://www.w3school.com.cn/sc...
DubboBeanDefinitionParser和DubboNamespaceHandler的完成了對schemas的實現(xiàn)。源碼暫且另說,
ExtensionLoader dubbo核心類。
dubbo擴(kuò)展性好主要在于它的插件形式,針對業(yè)務(wù)什么技術(shù)好就用什么(只針對在rpc架構(gòu)的要點方面)
通過插件機(jī)制解耦依賴來實現(xiàn)框架設(shè)計原則中的針對接口編程而不針對實現(xiàn)。 如果屬性ExtensionLoader就屬性了dubbo的擴(kuò)展。
提到擴(kuò)展,我們看看jdk的service provider interface,后文用SPI簡寫,主要解耦機(jī)制比較強(qiáng)勢體現(xiàn)。經(jīng)常看源碼的同學(xué)應(yīng)該很熟了吧,于dubbo的SPI對比。
jdk-spi:當(dāng)服務(wù)的提供者,提供了服務(wù)接口的一種實現(xiàn)之后,在jar包的META-INF/services/目錄里同時創(chuàng)建一個以服務(wù)接口命名的文件。該文件里就是實現(xiàn)該服務(wù)接口的具體實現(xiàn)類。而當(dāng)外部程序裝配這個模塊的時候,就能通過該jar包META-INF/services/里的配置文件找到具體的實現(xiàn)類名,并裝載實例化,完成模塊的注入。
各種jdbc驅(qū)動,log4j,spring對servlet3.0規(guī)范對ServletContainerInitializer的實現(xiàn)等。JDK的SPI是加載所有的實現(xiàn),這里好像又得說到類加載器,可以自己去看看相關(guān)的文章。而dubbo只加載自己所想要的。
dubbo的SPI是對jdk的封裝,來滿足自己的特性。
dubbo-spi:dubbo的加載是單例模式,可以延遲加載
ExtensionLoader | +-getAdativeExtension #獲取擴(kuò)展的適配器類# | +-createAdativeExtension #緩存中沒有就創(chuàng)建一個# | +-getAdativeExtensionClasses #獲取適配器類# | +-getExtensionClass #加載所有擴(kuò)展點實現(xiàn)類# | -createAdativeExtansionClass #dubbo幫我們動態(tài)創(chuàng)建一個適配器類
大致的流程如此,源碼暫時先不詳解了。
簡而言之,dubbo的特性
dubbo自己實現(xiàn)了一套代理機(jī)制
/*com.alibaba.dubbo.common.bytecode.Proxy*/ public abstract class Proxy { private static final AtomicLong PROXY_CLASS_COUNTER = new AtomicLong(0); private static final String PACKAGE_NAME = Proxy.class.getPackage().getName(); public static final InvocationHandler RETURN_NULL_INVOKER = new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args){ return null; } }; public static final InvocationHandler THROW_UNSUPPORTED_INVOKER = new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args){ throw new UnsupportedOperationException("Method [" + ReflectUtils.getName(method) + "] unimplemented."); } }; private static final Map> ProxyCacheMap = new WeakHashMap >(); private static final Object PendingGenerationMarker = new Object();
根據(jù)申明的這些final static對象我們可以大概知道dubbo自己的需求
緩存機(jī)制: 遍歷所有入?yún)⒔涌?";"作為Key
/** * get method desc. * int do(int arg1) => "do(I)I" * void do(String arg1,boolean arg2) => "do(Ljava/lang/String;Z)V" * /
版本機(jī)制: 通過 PROXY_CLASS_COUNTER 作為單個版本號,規(guī)則大概為 pkg + ".poxy"+id,保證了沒有沖突
// create ProxyInstance class. String pcn = pkg + ".proxy" + id; ccp.setClassName(pcn); ccp.addField("public static java.lang.reflect.Method[] methods;"); ccp.addField("private " + InvocationHandler.class.getName() + " handler;"); ccp.addConstructor(Modifier.PUBLIC, new Class>[]{ InvocationHandler.class }, new Class>[0], "handler=$1;"); ccp.addDefaultConstructor(); Class> clazz = ccp.toClass(); clazz.getField("methods").set(null, methods.toArray(new Method[0])); // create Proxy class. String fcn = Proxy.class.getName() + id; ccm = ClassGenerator.newInstance(cl); ccm.setClassName(fcn); ccm.addDefaultConstructor(); ccm.setSuperClass(Proxy.class); ccm.addMethod("public Object newInstance(" + InvocationHandler.class.getName() + " h){ return new " + pcn + "($1); }"); Class> pc = ccm.toClass(); proxy = (Proxy)pc.newInstance();dubbo的新版維護(hù) 2.5.4 解決問題和新功能
優(yōu)雅的關(guān)機(jī)
MonitorFilter阻止RPC進(jìn)程
動態(tài)配置:不能指定消費(fèi)者IP,提供者端的配置不能被刪除。
路由規(guī)則解析問題
異步會影響下游的RPC調(diào)用。
供應(yīng)商方面的流量控制優(yōu)化。
社區(qū)報告的一些錯誤修正。
修復(fù)了PojoUtils問題:枚舉類型,私有文件。
當(dāng)提供程序線程池耗盡時,RejectException不能發(fā)送到使用者端。
當(dāng)負(fù)載過載時避免不必要的響應(yīng)傳輸。
Slf4jLogger可以反映實際的行號。
使用延遲導(dǎo)出時,并發(fā)會導(dǎo)致意外的多端口綁定
當(dāng)沒有提供者時,模擬不會工作。
一些優(yōu)化:OverrideListener,在提供程序上停止不必要的心跳,Main Bootstrap進(jìn)程等。
一些錯誤修正:動態(tài)配置不能刪除,telnet invoke支持json參數(shù),監(jiān)控統(tǒng)計問題等
新功能
支持Netty4 手冊
線程池耗盡時自動堆棧轉(zhuǎn)儲。手冊
Jdk 1.8新的日期時間類型支持hessian2序列化。
全新的注釋配置實現(xiàn),修復(fù)了舊注釋版本報告的所有缺陷。(dubbo-spring-boot-starter將在稍后發(fā)布)
*更多詳情請參閱Dubbo Annotation-Driven
支持讀取IP和端口以注冊和綁定環(huán)境變量。
例
調(diào)整一些XML配置項目:dump.directory等。
Bootstrap在注冊表無法連接時被阻止。
MonitorService在第一次調(diào)用MonitorService時無法連接ZK時阻止RPC進(jìn)程。
標(biāo)記內(nèi)部的JSON序列化已棄用,請改用fastjson。
RMI協(xié)議支持附件傳遞。
EnumSet類型支持hessian2序列化。
修復(fù)了一些錯誤和優(yōu)化。
Dubbo編程模型增強(qiáng)。
修復(fù)了2.5.7中報告的一些錯誤。
更多細(xì)節(jié)請參閱Dubbo注解驅(qū)動
外部配置EnableDubbo,EnableDubboBindings也為Spring-Boot-Starter做準(zhǔn)備。
更多細(xì)節(jié)請參閱Dubbo外部化配置
通過telnet和更強(qiáng)大的OPShttp:僅支持online,offline在此版本中,將在以下版本中提供更多功能
路由規(guī)則不應(yīng)該每次都默認(rèn)運(yùn)行
優(yōu)化春季活動表現(xiàn)
修復(fù)了使用策展人時的NPE路徑問題
修復(fù)了使用dubbo-admin報告的一些錯誤
Redis注冊表支持認(rèn)證
bug
向后兼容RMI協(xié)議
Hessian序列化:
為java.util.Time類型添加空檢查
恢復(fù)hessian的覆蓋序列,子類的字段應(yīng)該覆蓋父類的字段,而不是其他方式
Redis和多播注冊表不能脫機(jī)。
增加功能
注釋增強(qiáng)。基于這個版本的dubbo-spring-boot-starter也已經(jīng)發(fā)布。
為qos添加開關(guān):dubbo.application.qos.enable=true/false。例如,注意我們配置qos的新方法,dubbo.qos.port已被更改為dubbo.application.qos.port。
正常關(guān)機(jī),在注冊表取消注冊和線程池關(guān)閉之間增加額外的等待時間。
通過避免使用低效率來提高黑森序列化的性能synchronized。
參數(shù)驗證失敗時避免重試。
條件路由器還應(yīng)檢查默認(rèn)值。
解決漏洞
在這個版本中,我們將檢查從網(wǎng)絡(luò)接收到的序列化標(biāo)識(只有當(dāng)標(biāo)識JDK序列化時)與當(dāng)前實例中的標(biāo)識匹配。如果無法匹配,則反序列化過程將被拒絕。由于原來的JDK反序列化有安全問題,我們這樣做是為了防止序列化類型,例如從意外篡改hessian2來java。
2.5.10解決問題和新功能bug
FutureUnapter中的TimeUnit轉(zhuǎn)換錯誤。
在Docker中部署時,提供者端無法調(diào)用服務(wù)
Hessian序列化問題類型:short和byte。
刪除isdestrory()在注冊表中檢查,確保在關(guān)閉時取消注冊
引用注釋支持注釋類型上的注釋
在本次發(fā)布中,我們主要合并了當(dāng)當(dāng)網(wǎng)貢獻(xiàn)的dubbox分支,突出了以下功能:
REST支持(通過整合resteasy)
高性能的序列化框架:kryo,F(xiàn)ST
嵌入式tomcat支持
我們試圖保留原來的分支,同時進(jìn)行以下小調(diào)整:
升級了一些依賴的版本:kryo,F(xiàn)ST和tomcat
刪除了對核心RPC協(xié)議的更改以避免兼容性問題
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71102.html
摘要:大揭秘目標(biāo)了解的新特性,以及版本升級的引導(dǎo)。四元數(shù)據(jù)改造我們知道以前的版本只有注冊中心,注冊中心的有數(shù)十個的鍵值對,包含了一個服務(wù)所有的元數(shù)據(jù)。 DUBBO——2.7大揭秘 目標(biāo):了解2.7的新特性,以及版本升級的引導(dǎo)。 前言 我們知道Dubbo在2011年開源,停止更新了一段時間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發(fā)布了 2.5.4 版本。隨后,版本...
摘要:我沒有能力去控制那些自媒體發(fā)布這些不實的內(nèi)容,但是在我了解的范圍內(nèi),還是盡力輸出一些我的理解。 之前我發(fā)過一篇《說說我為什么看好Spring Cloud Alibaba》,然后這兩天有網(wǎng)友給我轉(zhuǎn)了這篇文章《坑爹項目spring-cloud-alibaba,我們也來一個》,問我的看法是怎么樣的,聊天時候簡單說了一下。今天在家休息,抽空整理一下內(nèi)容,逐點說一下我的看法,主要還是覺得這篇文章...
摘要:為了降低現(xiàn)在代碼改動量,基于做了自定義,只要使用自定義的注解并設(shè)置響應(yīng)的參數(shù)即可完成線程池的隔離。 摘要: 融之家技術(shù)團(tuán)隊從2015年截止到目前累計經(jīng)歷了4次演進(jìn)(單體應(yīng)用、多實例部署、半微服務(wù)、微服務(wù)),讓平臺能更懂用戶,更理解用戶的需求,把合適的人匹配到合適的產(chǎn)品。 前言本文章是根據(jù)潘志偉老師在上海Dubbo沙龍的演講稿進(jìn)行整理,意在為大家展示最真實、最一手的沙龍技術(shù)干貨。 1、作...
摘要:一該類繼承了類,該類里面封裝了一個重連機(jī)制,而注冊中心核心的功能注冊訂閱取消注冊取消訂閱,查詢注冊列表都是調(diào)用了我上一篇文章源碼解析三注冊中心開篇中講到的實現(xiàn)方法,畢竟這種實現(xiàn)注冊中心的方式是默認(rèn)的方式,不過推薦使用,這個后續(xù)講解。 注冊中心——dubbo 目標(biāo):解釋以為dubbo實現(xiàn)的注冊中心原理,解讀duubo-registry-default源碼 dubbo內(nèi)置的注冊中心實現(xiàn)方式...
摘要:二注解該注解為了保證在內(nèi)部調(diào)用具體實現(xiàn)的時候不是硬編碼來指定引用哪個實現(xiàn),也就是為了適配一個接口的多種實現(xiàn),這樣做符合模塊接口設(shè)計的可插拔原則,也增加了整個框架的靈活性,該注解也實現(xiàn)了擴(kuò)展點自動裝配的特性。 Dubbo擴(kuò)展機(jī)制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對dubbo整個項目大體的介紹,而從這篇文章開始,我將會從源碼來解讀dubbo再各個模塊的實...
閱讀 1626·2021-10-25 09:46
閱讀 3209·2021-10-08 10:04
閱讀 2354·2021-09-06 15:00
閱讀 2768·2021-08-19 10:57
閱讀 2077·2019-08-30 11:03
閱讀 970·2019-08-30 11:00
閱讀 2370·2019-08-26 17:10
閱讀 3545·2019-08-26 13:36