我終於知道什麼是Dubbo了

2020-10-13 木禾子笑笑

職場打拼那些事?

作為程式設計師,當然是不斷學習,才能使自己慢慢變強大!

在無數個「撐不下去」的時候,我的「治癒系」當然也是學習了!

之前有人問我,你用過dubbo嗎?嗯,額,我說,沒了解過。

那你知道SpringCloud嗎?嗯,額,我說,我聽說過,好像是微服務用到的一種技術框架。

哎,為了下次有人跟我聊起dubbo,我能不再像便秘一樣,嗯……額……於是,我決定學習dubbo!先去B站看了視頻,然後網上找來資料,終於把dubbo是什麼以及怎麼用了解清楚了。今天就把新學的dubbo的那些事和大家一起探討一下。

Dubbo是什麼

Dubbo是一個分布式、高性能、透明化的RPC服務框架,提供服務自動註冊、自動發現等高效服務治理方案,可以和Spring框架無縫集成。

這句話有5個點要掌握:

  1. 分布式:即應用場景是系統拆分,A系統和B系統需要通訊的情況下,需要一個RPC框架;
  2. 高性能:要支持集群、負載均衡及容錯機制;
  3. 透明化:即遠程方法調用,就像調用本地方法一樣,只需簡單配置,沒有任何API侵入;
  4. 自動註冊:默認使用zookeeper,提供:配置維護、域名服務、分布式同步、組服務等;
  5. 服務治理:這個原理有些抽象,我還沒了解透,先不說了。

Dubbo的主要應用場景

透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。

軟負載均衡及容錯機制,可在內網替代F5等硬體負載均衡器,降低成本,減少單點。(F5負載均衡器我也是百度來的)。

服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP位址,並且能夠平滑添加或刪除服務提供者。

Dubbo服務註冊與發現的流程

這張圖是在dubbo官網上下載的:

流程說明:

0.Provider(提供者)綁定指定埠並啟動服務;

1.提供者連接註冊中心,並發送本機IP、埠、應用信息和提供服務信息至註冊中心存儲;

2.Consumer(消費者),訂閱註冊中心 ,並發送應用信息、所求服務信息至註冊中心;

3.註冊中心根據消費者所求服務信息匹配對應的提供者列表發送至Consumer應用緩存。

4.Consumer在發起遠程調用時基於緩存的提供者列表擇其一發起調用;

5.消費者調用服務次數count等信息,定時發送到監控中心用於監控。

注意兩點:

第3步,Provider狀態變更會實時通知註冊中心、註冊中心是基於長連接推送變更給Consumer。

註冊中心始終不代替調用者發送請求到服務提供者,它只是告訴調用者服務方地址,調用方根據具體地址請求服務,即第4步的invoke。

思考:Dubbo的註冊中心集群掛掉,發布者和訂閱者之間還能通信麼?

答案是:可以的。

因為啟動dubbo時,消費者會從zookeeper拉取註冊的生產者的地址接口等數據,緩存在本地。實際上每次調用時,都是按照本地緩存中存儲的地址進行調用,此時並沒有用到註冊中心。

所以說註冊中心集群全部掛掉是不要緊的,但前提是服務提供者沒有增加新的服務,如果要調用新的服務,本地緩存是辦不到的。

Dubbo有些哪些註冊中心?

  • Multicast註冊中心: Multicast註冊中心不需要任何中心節點,只要廣播地址,就能進行服務註冊和發現。基於網絡中組播傳輸實現。
  • Zookeeper註冊中心: 基於分布式協調系統Zookeeper實現,採用Zookeeper的watch機制實現數據變更。這種也是dubbo默認採用的註冊中心
  • redis註冊中心: 基於redis實現,採用key/Map存儲,住key存儲服務名和類型,Map中key存儲服務URL,value服務過期時間。基於redis的發布/訂閱模式通知數據變更。
  • Simple註冊中心。

Dubbo的集群容錯方案有哪些?

在集群調用失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試

  • Failover Cluster:失敗自動切換,當出現失敗,在地址列表中重試其它伺服器。通常用於讀操作,但重試會帶來更長延遲。
  • Failfast Cluster:快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。
  • Failsafe Cluster:失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作
  • Failback Cluster:失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於消息通知操作。
  • Forking Cluster:並行調用多個伺服器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。
  • Broadcast Cluster:廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 。通常用於通知所有提供者更新緩存或日誌等本地資源信息。

Dubbo和Spring Cloud的區別?

提到Dubbo,一般都會和Spring Cloud作比較,因為他們兩個都能解決RPC問題。Dubbo是一個分布式服務框架,而SpringCloud是一個分布式的整體解決方案。兩者區別如下:


Dubbo和SpringCloud最大的區別:Dubbo底層是使用Netty這樣的NIO框架,是基於TCP協議傳輸的,配合以Hession序列化完成RPC通信。

而SpringCloud是基於Http協議+Rest接口調用遠程過程的通信,相對來說,Http請求會有更大的報文,佔的帶寬也會更多。但是REST相比RPC更為靈活,服務提供方和調用方的依賴只依靠一紙契約,不存在代碼級別的強依賴

SpringBoot整合Dubbo和Zookeeper如何開發

1)、服務提供者:

1.創建一個服務提供者provider

2.引入dubbo和zookeeper依賴

<!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.7</version> </dependency><!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --><dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version></dependency>

3.在application.yml中配置dubbo的掃描包和註冊中心地址(zookeeper我用的是公司服務,具體安裝啟用這裡不做介紹):

Dubbo.application.name=ticket#地址寫zookeeper服務地址,我用的公司的服務,這裡隨便寫一下Dubbo.registery.address=zookeeper://127.0.0.1:2181Dubbo.scan.base.package=com.bill99.ticket.service

4.將provider註冊到註冊中心zookeeper中,provider的服務提供者添加dubbo的@service註解

public interface TicketService{ public String getTicket();}@Component//註冊到Spring容器中@Service//注意是dubbo的Service,不是Spring的Servicepublic class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "《八佰》"; }}

2)、調用方:

1.創建一個客戶端consumer,和provider一樣,引入dubbo和zookeeper依賴

2.consumer引用服務,添加@Reference註解

@Servicepublic class UserService{@Reference private TicketService ticketService;//注意:前面說dubbo對代碼有強依賴,就是指這裡 //實際應用中provider和consumer是在兩個工程,那麼兩邊都必須有相同類路徑的TicketService接口 public void hello(){ System.out.println("買到票了,"+ticketService.getTicket()); }}

3.在application.yml中配置註冊中心地址

Dubbo.application.name=userDubbo.registery.address=zookeeper://127.0.0.1:2181

3)、編寫測試類,調用UserService.hello()方法。

完結撒花!!!

相關焦點

  • dubbo如何處理業務異常,這個一定要知道哦!
    的filter重寫,dubbo的異常處理。9、為什麼會出現Lambda表達式,你知道嗎?10、不說「分布式事務」理論,直接上大廠阿里的解決方案,絕對實用11、女程式設計師問到這個問題,讓我思考了半天,Mysql的「三高」架構12、大廠二面:CAP原則為什麼只能滿足其中兩項?
  • Dubbo 一些你不一定知道但是很好用的功能
    對編程感興趣的可以私信我獲取資料,或者點擊編程技術交流學習來與我面對面交流dubbo功能非常完善,很多時候我們不需要重複造輪子,下面列舉一些你不一定知道,但是很好用的功能;直連Provider在開發及測試環境下,可能需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連
  • dubbo實戰之四:管理控制臺dubbo-admin
    歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內容:所有原創文章分類和匯總,及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;
  • Dubbo 中超簡單實用的功能 你知道幾個?
    dubbo功能非常完善,很多時候我們不需要重複造輪子,下面列舉一些你不一定知道,但是很好用的功能;直連Provider在開發及測試環境下,可能需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直連模式,將以服務接口為單位,忽略註冊中心的提供者列表,A 接口配置點對點
  • 大廠面試系列(五):Dubbo和Spring Cloud
    dubbo的spi思想dubbo進行的服務治理、服務降級、失敗以及重試。服務端怎麼知道客戶端要調用的算法的?闡述下dubbo的架構dubbo支持的註冊中心有哪些,分別的優缺點dubbo執行流程?dubbo和springclond的架構區別和優劣?說一下dubbo的實現過程?註冊中心掛了可以繼續通信嗎?
  • 技術分享——一路踩坑構建Dubbo源碼
    解決完資源依賴問題,再次輸入mvn idea:idea命令,終於迎來勝利的曙光,構建成功啦!,終於要準備開啟dubbo的大門啦,一探究竟~事實高興的太早了,坑啊~,繼續踩坑。(DynamicConfiguration.java:224) at org.apache.dubbo.config.
  • Dubbo源碼:跟著Demo學習基本使用
    下面我將從示例來簡單介紹 Dubbo 的基本使用。、需要接收什麼參數、需要返回什麼響應Consumer ,如何使用服務、使用的服務名稱是什麼、需要傳入什麼參數、會得到什麼響應模塊下的 dubbo-demo-xml 模塊,提供了基於 Spring XML 的 Provider 和 Consumer。
  • 看看Dubbo是如何實現的
    大家好,我是java吳彥祖!logger.error("Failsafe ignore exception: " + var5.getMessage(), var5); return AsyncRpcResult.newDefaultAsyncResult((Object)null, (Throwable)null, invocation); } }}既然知道了容錯的實現流程和邏輯
  • 本地調試dubbo服務的幾種方法
    從2.0.8版本開始增加了協議註冊開關(register="false") 例如:<dubbo:registry address="xxxxxx" register="false"/> 可以關掉,不註冊到配置中心,啟動本地服務,使用telnet2、使用telnet登錄dubbo
  • 那些年,踩過dubbo的坑。僅此記錄
    解決完資源依賴問題,再次輸入mvn idea:idea命令,終於迎來勝利的曙光,構建成功啦!,終於要準備開啟dubbo的大門啦,一探究竟~事實告訴高興的太早了,坑啊~,繼續踩坑。:registry接下來就是修改dubbo源碼中的配置文件:將dubbo-provider.xml\dubbo-consumer.xml中均添加超時時間: <dubbo:registry address=&34; timeout=&34;/>1解決完這些問題,心裡已經不敢期望成功運行原始碼了,心裡擔憂~
  • 使用 Dubbo 框架,你應該知道的 4 個問題
    進行各種配置的;第三層:proxy 層,服務代理層,無論是 consumer 還是 provider,dubbo 都會給你生成代理,代理之間進行網絡通信;第四層:registry 層,服務註冊層,默認緩存文件目錄:/aking/.dubbo/dubbo-registry-*.*.*.*.cache,其中星號代表 ip 地址
  • dubbo系列之Filter
    項目中,我們可以自定義一個Filter來實現我們的業務需求,比如記錄入參出參,規範返回參數,並發控制,隱式傳輸數據等都可以基於Filter機制實現Dubbo默認的Filter在META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Filter文件中定義如何自定義一個Dubbo Filter1、我們先需要定義一個類來實現
  • 由Dubbo直連引出的new File()路徑問題
    自己研究了好久,實在找不到原因了於是尋求身為 Dubbo committer 的同事的幫助才知道原來是在啟動類中沒有配置 @EnableDubboConfiguration 註解啟用 Dubbo 導致的,慚愧慚愧。
  • dubbo學習之源碼創建屬於自己的dubbo-demo
    ><beans xmlns:xsi=&34; xmlns:dubbo=&34; xmlns=&34; xmlns:context=&34; xsi:schemaLocation=&34;> <dubbo:application metadata-type=&34; name=&34;/><!
  • 反正我收藏了!Apache Dubbo介紹以及擴展機制SPI
    Apache Dubbo 介紹首先我們先問一句,Apahce Dubbo 是什麼?這個問題恐怕我不會給太多答案給你,因為 Dubbo 的官網其實描述非常清楚明了,而且具備了非常全面的架構解析以及源碼解析。所以,學習 Dubbo 非常有必要去 官網傳送門。
  • Dubbo簡介
    模塊)2.2 Spring方式Spring方式調用模式如下:dubbo-provider:<beans xmlns:xsi=&34; xmlns:dubbo=&34; xmlns=&34; xsi:schemaLocation
  • 朋友國企幹了5年java,居然不知道Dubbo是做什麼呢?我真信了
    ,能解決什麼痛點,核心的模塊是什麼,大致運轉流程是怎樣的。不僅如此我還會帶著大家過一遍如果要讓你設計一個 RPC 框架你看看都需要什麼功能?這波操作之後你會發現嘿嘿 Dubbo 怎麼設計的和我想的一樣呢?真是英雄所見略同啊!而且我還會寫一個簡單版 RPC 框架實現,讓大家明白 RPC 到底是如何工作的。如果看了這篇文章你要還是不知道 Dubbo 是啥,我可以要勸退了。
  • Dubbo SPI中AOP實現原理
    官網:http://dubbo.apache.org/zh-cn/docs/2.7/source_code_guide/dubbo-spi/從官網說明中我們可以看到,dubbo spi是java spi的一種增強實現,也就是這種spi機制確保了dubbo高擴展的能力。
  • 分布式-zookeeper+dubbo入門demo
    完成這個demo的搭建,先簡單說一下dubbo常識的概念1.什麼是SOA架構SOA 是Service-Oriented Architecture的首字母簡稱,它是一個面向服務的架構模式(俗稱:分布式;面服務的分布式)為什麼網際網路項目會採用SOA架構呢?
  • Dubbo—SPI及自適應擴展原理
    什麼意思呢?舉個例子就清楚了,Java原生就提供SPI機制,比如資料庫連接驅動的實現就是SPI很好的一個應用,在Java sql下提供了Driver接口,而具體的驅動程序是由各個資料庫廠商實現的,平時我們要連接哪個資料庫只需要引入對應的驅動jar包就可以了,非常方便,即使資料庫變更也一樣,我們不需要改變代碼。