微服务中远程调用Dubbo与Feign对比
實(shí)現(xiàn)遠(yuǎn)程調(diào)用的方式
Http接口(web接口、RestTemplate+Okhttp)、Feign、RPC調(diào)用(Dubbo、Socket編程)、Webservice。
什么是Feign?
Feign是Spring Cloud提供的一個(gè)聲明式的偽Http客戶端,它使得調(diào)用遠(yuǎn)程服務(wù)就像調(diào)用本地服務(wù)一樣簡(jiǎn)單,只需要?jiǎng)?chuàng)建一個(gè)接口并添加一個(gè)注解即可。
Nacos注冊(cè)中心很好的兼容了Feign,Feign默認(rèn)集成了Ribbon,所以在Nacos下使用Fegin默認(rèn)就實(shí)現(xiàn)了負(fù)載均衡的效果。
什么是Dubbo?
Dubbo是阿里巴巴開(kāi)源的基于Java的高性能RPC分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。
Spring-cloud-alibaba-dubbo是基于SpringCloudAlibaba技術(shù)棧對(duì)dubbo技術(shù)的一種封裝,目的在于實(shí)現(xiàn)基于RPC的服務(wù)調(diào)用。
Feign與Dubbo的對(duì)比
Feign與Dubbo功能上有很多類似的地方,因?yàn)槎际菍W⒂谶h(yuǎn)程調(diào)用這個(gè)動(dòng)作。比如注冊(cè)中心解耦、負(fù)載均衡、失敗重試熔斷、鏈路監(jiān)控等。
Dubbo除了注冊(cè)中心需要進(jìn)行整合,其它功能都自己實(shí)現(xiàn)了,而Feign大部分功能都是依賴全家桶的組件來(lái)實(shí)現(xiàn)的。Dubbo小而專一,專注于遠(yuǎn)程調(diào)用。而Spring全家桶而言,遠(yuǎn)程調(diào)用只是一個(gè)重要的功能而已。
協(xié)議支持方面:
Feign更加優(yōu)雅簡(jiǎn)單。Feign是通過(guò)REST API實(shí)現(xiàn)的遠(yuǎn)程調(diào)用,基于Http傳輸協(xié)議,服務(wù)提供者需要對(duì)外暴露Http接口供消費(fèi)者調(diào)用,服務(wù)粒度是http接口級(jí)的。通過(guò)短連接的方式進(jìn)行通信,不適合高并發(fā)的訪問(wèn)。Feign追求的是簡(jiǎn)潔,少侵入(因?yàn)榫头?wù)端而言,在SpringCloud環(huán)境下,不需要做任何額外的操作,而Dubbo的服務(wù)端需要配置開(kāi)放的Dubbo接口)。
Dubbo方式更靈活。Dubbo是通過(guò)RPC調(diào)用實(shí)現(xiàn)的遠(yuǎn)程調(diào)用,支持多傳輸協(xié)議(Dubbo、Rmi、http、redis等等),可以根據(jù)業(yè)務(wù)場(chǎng)景選擇最佳的方式,非常靈活。默認(rèn)的Dubbo協(xié)議:利用Netty,TCP傳輸,單一、異步、長(zhǎng)連接,適合數(shù)據(jù)量小、高并發(fā)和服務(wù)提供者遠(yuǎn)遠(yuǎn)少于消費(fèi)者的場(chǎng)景。Dubbo通過(guò)TCP長(zhǎng)連接的方式進(jìn)行通信,服務(wù)粒度是方法級(jí)的。
從協(xié)議層選擇看,Dubbo是配置化的,更加靈活。Dubbo協(xié)議更適合小數(shù)據(jù)高并發(fā)場(chǎng)景。
通信性能方面:
從通信的性能上來(lái)分析,SpringCloud的通信采用Openfeign(feign)組件。
Feign基于Http傳輸協(xié)議,底層實(shí)現(xiàn)是rest。從OSI 7層模型上來(lái)看rest屬于應(yīng)用層。
在高并發(fā)場(chǎng)景下性能不夠理想,成為性能瓶頸(雖然他是基于Ribbon以及帶有熔斷機(jī)制可以防止雪崩),需要改造。具體需要改造的內(nèi)容需要時(shí)再研究。
Dubbo框架的通信協(xié)議采用RPC協(xié)議,屬于傳輸層協(xié)議,性能上自然比rest高。提升了交互的性能,保持了長(zhǎng)連接,高性能。
Dubbo性能更好,比如支持異步調(diào)用、Netty性能更好。Dubbo主要是配置而無(wú)需改造。
| RPC | ?REST | |
| 耦合性 | 強(qiáng)耦合 | 松耦合 |
| 消息協(xié)議 | 二進(jìn)制 thrift/protobuf | 文本 xml、jason |
| 通信協(xié)議 | TCP | HTTP |
| 接口契約IDL | thrift/protobuf | swagger |
| 開(kāi)發(fā)調(diào)試 | 消息不可讀 | 可讀,可調(diào)試 |
| 對(duì)外開(kāi)放 | 一般作為內(nèi)部各個(gè)系統(tǒng)的通信框架 | 對(duì)接外部系統(tǒng) |
使用SpringCloud整合Dubbo,正所謂是強(qiáng)強(qiáng)聯(lián)合。
負(fù)載均衡方面:
Feign默認(rèn)使用Ribbon作為負(fù)載均衡的組件。
Dubbo和Ribbon(Feign默認(rèn)集成Ribbon)都支持負(fù)載均衡策略,但是Dubbo支持的更靈活。
Dubbo和Ribbon對(duì)比:
Ribbon的負(fù)載均衡策略:隨機(jī)、規(guī)則輪詢、空閑策略、響應(yīng)時(shí)間策略。
Dubbo的負(fù)載均衡策略:Dubbo支持4種算法,隨機(jī)、權(quán)重輪詢、最少活躍調(diào)用數(shù)、一致性Hash策略。而且算法里面引入權(quán)重的概念。
Dubbo可以使用路由策略,然后再進(jìn)行負(fù)載均衡。
Dubbo配置的形式不僅支持代碼配置,還支持Dubbo控制臺(tái)靈活動(dòng)態(tài)配置。
Dubbo負(fù)載均衡的算法可以精準(zhǔn)到某個(gè)服務(wù)接口的某個(gè)方法,而Ribbon的算法是Client級(jí)別的。Ribbon需要進(jìn)行全局配置,個(gè)性化配置比較麻煩。
容錯(cuò)機(jī)制方面:
Feign默認(rèn)使用Hystix作為服務(wù)熔斷的組件。Hystix提供了服務(wù)降級(jí),服務(wù)熔斷,依賴隔離,監(jiān)控(Hystrix Dashboard)等功能。Feign是利用熔斷機(jī)制來(lái)實(shí)現(xiàn)容錯(cuò)的,與Dubbo處理的方式不一樣。
Dubbo支持多種容錯(cuò)策略,FailOver、FailFast、Failsafe、FailBack、Aviailable、Broadcast、Forking策略等,以及Mock。也引入了retry次數(shù),timeout等配置參數(shù)。Dubbo自帶了失敗重試的功能。
其他方面(以下方便并未進(jìn)行詳細(xì)整理僅做參考):
Dubbo附帶了白名單功能、結(jié)果緩存、同步和異步調(diào)用的功能。
Dubbo支持更多更靈活的并發(fā)控制:
客戶端配置actives參數(shù),配置單個(gè)Cunsumer最大并發(fā)請(qǐng)求數(shù),超出則線程阻塞等待,超時(shí)報(bào)錯(cuò)。
Provider可以配置executes參數(shù)來(lái)限制最大的并發(fā)線程數(shù),超出報(bào)錯(cuò)。
Provider可以配置accepts參數(shù)來(lái)限制最大長(zhǎng)連接數(shù)來(lái)限制最大的連接數(shù)。
Provider的通過(guò)配置任務(wù)線程池的類型和最大線程數(shù)來(lái)控制并發(fā)量,超負(fù)載直接丟棄。
路由、流量調(diào)度、ABtest方面:
Ribbon需自己實(shí)現(xiàn),應(yīng)用不靈活。
Ribbon主要通過(guò)擴(kuò)展AbstractLoadBalancerRule負(fù)載均衡的方法來(lái)實(shí)現(xiàn),在負(fù)載均衡的部分還要進(jìn)行改造升級(jí)。
Dubbo更加靈活方便。
Dubbo通過(guò)界面化、校本化配置路由規(guī)則,可以實(shí)現(xiàn)灰度發(fā)布、動(dòng)態(tài)流量調(diào)度、容量計(jì)算等,方案成熟。
另外,Dubbo 還支持多版本調(diào)用。
Dubbo支持更完善的監(jiān)控和管理界面,SC也有Actuator等工具進(jìn)行監(jiān)控,但是并不是針對(duì)遠(yuǎn)程調(diào)用這一塊的
Dubbo支持客戶端設(shè)置調(diào)用結(jié)果緩存,支持配置3種策略的結(jié)果緩存(LRU、LFU、FIO),但是要自己實(shí)現(xiàn)超時(shí)管理。
?
總結(jié)
Dubbo支持更多功能、更靈活、支持高并發(fā)的RPC框架。
SpringCloud全家桶里面(Feign、Ribbon、Hystrix),特點(diǎn)是非常方便。Ribbon、Hystrix、Feign在服務(wù)治理中,配合Spring Cloud做微服務(wù),使用上有很多優(yōu)勢(shì),社區(qū)也比較活躍,看將來(lái)更新發(fā)展。
業(yè)務(wù)發(fā)展影響著架構(gòu)的選型,當(dāng)服務(wù)數(shù)量不是很大時(shí),使用普通的分布式RPC架構(gòu)即可,當(dāng)服務(wù)數(shù)量增長(zhǎng)到一定數(shù)據(jù),需要進(jìn)行服務(wù)治理時(shí),就需要考慮使用流式計(jì)算架構(gòu)。Dubbo可以方便的做更精細(xì)化的流量調(diào)度,服務(wù)結(jié)構(gòu)治理的方案成熟,適合生產(chǎn)上使用,雖然Dubbo是塵封后重新開(kāi)啟,但這并不影響其技術(shù)價(jià)值。
如果項(xiàng)目對(duì)性能要求不是很嚴(yán)格,可以選擇使用Feign,它使用起來(lái)更方便。
如果需要提高性能,避開(kāi)基于Http方式的性能瓶頸,可以使用Dubbo。
Dubbo Spring Cloud的出現(xiàn),使得Dubbo既能夠完全整合到Spring Cloud的技術(shù)棧中,享受Spring Cloud生態(tài)中的技術(shù)支持和標(biāo)準(zhǔn)化輸出,又能夠彌補(bǔ)Spring Cloud中服務(wù)治理這方面的短板。
來(lái)源:https://www.cnblogs.com/ying-z/p/14781757.html
總結(jié)
以上是生活随笔為你收集整理的微服务中远程调用Dubbo与Feign对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 茭白家常做法?
- 下一篇: 吃什么水果最不会发胖?