關于dubbo是用的什么協(xié)議呢灶?
在使用dubbo的時候會配置<dubbo:protocolname="dubbo"port="20880"/>所以在回答面試官的時候就隨口說的是dubbo協(xié)議,其實面試官問的此協(xié)議非彼協(xié)議守问,而是問的是http協(xié)議還是Tcp協(xié)議米丘,因為dubbo的核心就是用的單一長連接進行異步通信九孩。
Tcp協(xié)議就是所謂的長連接搅荞,長連接的好處:
減少來回握手的頻率躏惋,當操作頻繁幽污,點對點的通訊時,可以同時發(fā)送多個數(shù)據(jù)包簿姨,以不至于服務者被消費者壓死
為什么要用dubbo進行數(shù)據(jù)傳輸距误?
一般服務端服務器比較少,消費端有可能會有很多項目或者工程會調(diào)用dubbo的接口扁位,而且數(shù)據(jù)量傳輸較小且并發(fā)量比較高的情況下用dubbo效率會很高准潭。
Dubbo中zookeeper做注冊中心,如果注冊中心集群都掛掉域仇,發(fā)布者和訂閱者之間還能通信么压储? 可以
1.啟動dubbo時,消費者會從zk拉取注冊的生產(chǎn)者的地址接口等數(shù)據(jù)惠奸,緩存在本地。每次調(diào)用時沽讹,按照本地存儲的地址進行調(diào)用。
2.注冊中心對等集群武鲁,任意一臺宕掉后爽雄,會自動切換到另一臺 。
3.注冊中心全部宕掉沐鼠,服務提供者和消費者仍可以通過本地緩存通訊 挚瘟。
4.服務提供者無狀態(tài),任一臺 宕機后饲梭,不影響使用 乘盖。
5.服務提供者全部宕機,服務消費者會無法使用憔涉,并無限次重連等待服務者恢復 订框。
dubbo連接注冊中心和直連的區(qū)別 ?
在開發(fā)及測試環(huán)境下兜叨,經(jīng)常需要繞過注冊中心穿扳,只測試指定服務提供者,這時候可能需要點對點直連国旷, 點對點直聯(lián)方式矛物,將以服務接口為單位,忽略注冊中心的提供者列表跪但,服務注冊中心履羞,動態(tài)的注冊和發(fā)現(xiàn)服務,使服務的位置透明屡久,并通過在消費方獲取服務提供方地址列表忆首,實現(xiàn)軟負載均衡和Failover, 注冊中心返回服務提供者地址列表給消費者涂身,如果有變更雄卷,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
服務消費者蛤售,從提供者地址列表中丁鹉,基于軟負載均衡算法,選一臺提供者進行調(diào)用悴能,如果調(diào)用失敗揣钦,再選另一臺調(diào)用。注冊中心負責服務地址的注冊與查找漠酿,相當于目錄服務冯凹,服務提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉(zhuǎn)發(fā)請求,服務消費者向注冊中心獲取服務提供者地址列表宇姚,并根據(jù)負載算法直接調(diào)用提供者匈庭,注冊中心,服務提供者浑劳,服務消費者三者之間均為長連接阱持,監(jiān)控中心除外,注冊中心通過長連接感知服務提供者的存在魔熏,服務提供者宕機衷咽,注冊中心將立即推送事件通知消費者,注冊中心和監(jiān)控中心全部宕機蒜绽,不影響已運行的提供者和消費者镶骗,消費者在本地緩存了提供者列表,注冊中心和監(jiān)控中心都是可選的躲雅,服務消費者可以直連服務提供者
Dubbo在安全機制方面是如何解決的 鼎姊?
Dubbo通過Token令牌防止用戶繞過注冊中心直連,然后在注冊中心上管理授權(quán)相赁。Dubbo還提供服務黑白名單此蜈,來控制服務所允許的調(diào)用方。
Dubbo常見的異常 噪生?
TimeoutException
RemotingException
RpcException
Dubbo啟動時如果依賴的服務不可用會怎樣?
Dubbo 缺省會在啟動時檢查依賴的服務是否可用东囚,不可用時會拋出異常跺嗽,阻止 Spring 初始化完成,默認 check="true"页藻,可以通過 check="false" 關閉檢查桨嫁。
當一個服務接口有多種實現(xiàn)時怎么做?
當一個接口有多種實現(xiàn)時份帐,可以用 group 屬性來分組璃吧,服務提供方和消費方都指定同一個 group 即可。
服務上線怎么兼容舊版本废境?
可以用版本號(version)過渡畜挨,多個不同版本的服務注冊到注冊中心,版本號不同的服務相互間不引用噩凹。這個和服務分組的概念有一點類似巴元。
服務讀寫推薦的容錯策略是怎樣的?
讀操作建議使用 Failover 失敗自動切換驮宴,默認重試兩次其他服務器逮刨。
寫操作建議使用 Failfast 快速失敗,發(fā)一次調(diào)用失敗就立即報錯堵泽。
Dubbo的管理控制臺能做什么修己?
管理控制臺主要包含:路由規(guī)則恢总,動態(tài)配置,服務降級睬愤,訪問控制片仿,權(quán)重調(diào)整,負載均衡戴涝,等管理功能滋戳。
服務提供者能實現(xiàn)失效踢出是什么原理?
基于zookeeper的臨時節(jié)點原理
持久節(jié)點
所謂持久節(jié)點,是指在節(jié)點創(chuàng)建后,就一直存在,直到有刪除操作來主動清除這個節(jié)點,也就是說不會因為創(chuàng)建該節(jié)點的客戶端會話失效而消失
臨時節(jié)點
臨時節(jié)點的生命周期和客戶端會話綁定,也就是說,如果客戶端會話失效,那么這個節(jié)點就會自動被清除掉
創(chuàng)建的臨時節(jié)點什么時候會被刪除啥刻,是連接一斷就刪除嗎奸鸯?延時是多少?
連接斷了之后可帽,ZK不會馬上移除臨時數(shù)據(jù)娄涩,只有當SESSIONEXPIRED之后,才會把這個會話建立的臨時數(shù)據(jù)移除映跟。因此蓄拣,用戶需要謹慎設置Session_TimeOut
說說核心的配置有哪些?
dubbo:service/ 服務提供者暴露服務配置
dubbo:reference/ 服務消費者引用服務配置
dubbo:protocol/ 服務提供者協(xié)議配置
dubbo:registry/ 注冊中心配置
dubbo:application/ 應用信息配置
dubbo:provider/ 服務提供者缺省值配置
dubbo:consumer/ 服務消費者缺省值配置
dubbo:method/ 方法級配置
集群容錯
1.Failover Cluster
失敗自動切換努隙,當出現(xiàn)失敗球恤,重試其它服務器,通常用于讀操作,但重試會帶來更長延遲荸镊⊙矢可通過 retries="2" 來設置重試次數(shù)(不含第一次)。
重試次數(shù)配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
2.Failfast Cluster
快速失敗躬存,只發(fā)起一次調(diào)用张惹,失敗立即報錯。通常用于非冪等性的寫操作岭洲,比如新增記錄宛逗。
3.Failsafe Cluster
失敗安全,出現(xiàn)異常時盾剩,直接忽略雷激。通常用于寫入審計日志等操作。
4.Failback Cluster
失敗自動恢復告私,后臺記錄失敗請求侥锦,定時重發(fā)。通常用于消息通知操作德挣。
5.Forking Cluster
并行調(diào)用多個服務器恭垦,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源番挺∵氲郏可通過 forks="2" 來設置最大并行數(shù)。
6.Broadcast Cluster
廣播調(diào)用所有提供者玄柏,逐個調(diào)用襟衰,任意一臺報錯則報錯,通常用于通知所有提供者更新緩存或日志等本地資源信息。
配置
服務提供方配置:
<!-- 提供方應用信息粪摘,用于計算依賴關系 -->
<dubbo:application name="hello-world-app" />
<!-- 使用zookeeper注冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://224.5.6.7:1234" />
<!-- 用dubbo協(xié)議在20880端口暴露服務 這個端口可用于點對點調(diào)試-->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
<!-- 和本地bean一樣實現(xiàn)服務 -->
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
服務消費方配置:
<!-- 消費方應用名瀑晒,用于計算依賴關系,不是匹配條件徘意,不要與提供方一樣 -->
<dubbo:application name="consumer-of-helloworld-app" />
<!-- 使用zookeeper注冊中心暴露發(fā)現(xiàn)服務地址 -->
<dubbo:registry address="zookeeper://224.5.6.7:1234" />
<!-- 生成遠程服務代理苔悦,可以和本地bean一樣使用demoService -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
<!-- 服務啟動關閉對該服務提供者的接口是否正常的監(jiān)測,也就是BarService是否可以正常調(diào)用不影響本應用的啟動椎咧,當為true的時候如果該接口掛了玖详,本應用就起不起來了-->
<dubbo:reference interface="com.foo.BarService" check="false" />
<!-- 關閉所有服務的啟動時檢查 -->
<dubbo:consumer check="false" />
<!-- 配置重試次數(shù),最好只用于讀的重試勤讽,寫操作可能會引起多次寫入 下面三個任意一個配置就行 默認retries="0"-->
<dubbo:service retries="2" />
<dubbo:reference retries="2" />
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
<!-- 掃描注解包路徑蟋座,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->
<dubbo:annotation package="com.foo.bar.service" />
dubbo調(diào)用服務的負載均衡脚牍,最后一種比較適合短時間內(nèi)大量參數(shù)一樣的請求
Random LoadBalance
隨機向臀,按權(quán)重設置隨機概率。
在一個截面上碰撞的概率高诸狭,但調(diào)用量越大分布越均勻飒硅,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重作谚。
RoundRobin LoadBalance
輪循,按公約后的權(quán)重設置輪循比率庵芭。
存在慢的提供者累積請求問題妹懒,比如:第二臺機器很慢,但沒掛双吆,當請求調(diào)到第二臺時就卡在那眨唬,久而久之,所有請求都卡在調(diào)到第二臺上好乐。
LeastActive LoadBalance
最少活躍調(diào)用數(shù)匾竿,相同活躍數(shù)的隨機,活躍數(shù)指調(diào)用前后計數(shù)差蔚万。
使慢的提供者收到更少請求岭妖,因為越慢的提供者的調(diào)用前后計數(shù)差會越大。
ConsistentHash LoadBalance
一致性Hash,相同參數(shù)的請求總是發(fā)到同一提供者昵慌。
當某一臺提供者掛時假夺,原本發(fā)往該提供者的請求,基于虛擬節(jié)點斋攀,平攤到其它提供者已卷,不會引起劇烈變動。
算法參見:http://en.wikipedia.org/wiki/Consistent_hashing淳蔼。
缺省只對第一個參數(shù)Hash侧蘸,如果要修改,請配置<dubbo:parameter key="hash.arguments" value="0,1" />
缺省用160份虛擬節(jié)點鹉梨,如果要修改讳癌,請配置<dubbo:parameter key="hash.nodes" value="320" />
配置如:
<dubbo:service interface="..." loadbalance="roundrobin" />
或:
<dubbo:reference interface="..." loadbalance="roundrobin" />
或:
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
或:
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
當一個接口有多種實現(xiàn)時,可以用group區(qū)分俯画。
<dubbo:service group="feedback" interface="com.xxx.IndexService" />
<dubbo:service group="member" interface="com.xxx.IndexService" />
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
任意組:(2.2.0以上版本支持析桥,總是只調(diào)一個可用組的實現(xiàn))
<dubbo:reference id="barService" interface="com.foo.BarService" group="*" />
當一個接口實現(xiàn),出現(xiàn)不兼容升級時艰垂,可以用版本號過渡泡仗,版本號不同的服務相互間不引用。
在低壓力時間段猜憎,先升級一半提供者為新版本
再將所有消費者升級為新版本
然后將剩下的一半提供者升級為新版本
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
不區(qū)分版本:(2.2.0以上版本支持)
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />
按組合并返回結(jié)果娩怎,比如菜單服務,接口一樣胰柑,但有多種實現(xiàn)截亦,用group區(qū)分,現(xiàn)在消費方需從每種group中調(diào)用一次返回結(jié)果柬讨,合并結(jié)果返回崩瓤,這樣就可以實現(xiàn)聚合菜單項。比較雞肋踩官,小點的項目應該都用不到
配置如:(搜索所有分組)
<dubbo:reference interface="com.xxx.MenuService" group="*" merger="true" />
(合并指定分組)
<dubbo:reference interface="com.xxx.MenuService" group="aaa,bbb" merger="true" />
(指定方法合并結(jié)果却桶,其它未指定的方法,將只調(diào)用一個Group)
<dubbo:reference interface="com.xxx.MenuService" group="*">
<dubbo:method name="getMenuItems" merger="true" />
</dubbo:service>
(某個方法不合并結(jié)果蔗牡,其它都合并結(jié)果)
<dubbo:reference interface="com.xxx.MenuService" group="*" merger="true">
<dubbo:method name="getMenuItems" merger="false" />
</dubbo:service>
(指定合并策略颖系,缺省根據(jù)返回值類型自動匹配,如果同一類型有兩個合并器時辩越,需指定合并器的名稱)
<dubbo:reference interface="com.xxx.MenuService" group="*">
<dubbo:method name="getMenuItems" merger="mymerge" />
</dubbo:service>
(指定合并方法嘁扼,將調(diào)用返回結(jié)果的指定方法進行合并,合并方法的參數(shù)類型必須是返回結(jié)果類型本身)
<dubbo:reference interface="com.xxx.MenuService" group="*">
<dubbo:method name="getMenuItems" merger=".addAll" />
</dubbo:service>
dubbo的令牌驗證
防止消費者繞過注冊中心訪問提供者
在注冊中心控制權(quán)限黔攒,以決定要不要下發(fā)令牌給消費者
注冊中心可靈活改變授權(quán)方式趁啸,而不需修改或升級提供者
可以全局設置開啟令牌驗證:
<!--隨機token令牌强缘,使用UUID生成-->
<dubbo:provider interface="com.foo.BarService" token="true" />
<!--固定token令牌,相當于密碼-->
<dubbo:provider interface="com.foo.BarService" token="123456" />
也可在服務級別設置:
<!--隨機token令牌莲绰,使用UUID生成-->
<dubbo:service interface="com.foo.BarService" token="true" />
<!--固定token令牌欺旧,相當于密碼-->
<dubbo:service interface="com.foo.BarService" token="123456" />
https://blog.csdn.net/abcde474524573/article/details/53026110