1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Dubbo 的設(shè)計(jì)思想,真優(yōu)秀!

        共 4191字,需瀏覽 9分鐘

         ·

        2021-07-04 10:50

        點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

        作者:叁滴水
        博客:https://blog.csdn.net/qq_30285985/

        本文來(lái)自作者「叁滴水」投稿,謝謝分享,也歡迎愛好技術(shù)分享的各位技術(shù)朋友向「Java技術(shù)棧」投稿,讓更多人看到,投稿方式:關(guān)注公眾號(hào)「Java技術(shù)?!乖诤笈_(tái)回復(fù):投稿。

        起源

        如果在一個(gè)項(xiàng)目中有兩個(gè)service。userServiceorderService。我們想要其中一個(gè)service調(diào)用另一個(gè)。

        我們大概會(huì)有如下寫法:

        public class userService{
            
            private orderService orderService;
            
            public User getOrder(Long orderId){
                return orderService.getOrder(orderId);
            }
        }

        隨著業(yè)務(wù)的逐漸復(fù)雜,在開發(fā)中肯定會(huì)有業(yè)務(wù)拆分。初步是通過(guò)maven進(jìn)行模塊的拆分。

        不管maven如何拆分,都始終是在一個(gè)jvm中運(yùn)行, 這樣只是在代碼開發(fā)時(shí)會(huì)清楚方便一點(diǎn)。但是,某一個(gè)service在有較大壓力的情況下,沒有辦法單單對(duì)此service做出調(diào)整。最終,我們是想要userServiceorderService在不同的jvm中運(yùn)行,如果orderService訪問(wèn)較多,我們可以只對(duì)它進(jìn)行擴(kuò)容。

        如下圖,才是我們最終想要的方案,對(duì)于這種方案,orderService端,我們稱之為服務(wù)提供者,調(diào)用orderService的端,我們稱之為服務(wù)消費(fèi)者。這種思想,也為dubbo的出現(xiàn)埋下了伏筆。

        jvm的userService如何調(diào)用orderService呢?

        在java遠(yuǎn)程調(diào)用多年的沉淀,一個(gè)接著一個(gè)框架的出現(xiàn),在一點(diǎn)點(diǎn)的優(yōu)化這個(gè)調(diào)用的過(guò)程。Java 核心技術(shù)教程和源碼已上傳:https://github.com/javastacks/javastack

        首先是socket調(diào)用。在orderService中開放socket服務(wù),在userService中進(jìn)行遠(yuǎn)程調(diào)用。

        • 優(yōu)點(diǎn):解決了單機(jī)調(diào)用的問(wèn)題。
        • 缺點(diǎn):代碼復(fù)雜,不易于擴(kuò)展。

        這可能是最初的一個(gè)遠(yuǎn)程調(diào)用解決方案,筆者不曾遇到過(guò)純socket調(diào)用的框架。另外,Dubbo 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺(tái)發(fā)送:面試,可以在線閱讀。

        如何跨語(yǔ)言調(diào)用?

        我們發(fā)現(xiàn),在java的對(duì)象是不可以直接通過(guò)socket進(jìn)行傳輸?shù)?,需要有一個(gè)序列化的過(guò)程。而且java的默認(rèn)的序列化,是無(wú)法被其他語(yǔ)言解析的。這樣導(dǎo)致如果有其他語(yǔ)言提供的服務(wù),是無(wú)法通過(guò)java調(diào)用。因此對(duì)于socket進(jìn)行了升級(jí),通過(guò)http+xml進(jìn)行信息的傳輸。這就出現(xiàn)了webservice。

        Web Service技術(shù), 能使得運(yùn)行在不同機(jī)器上的不同應(yīng)用無(wú)須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范實(shí)施的應(yīng)用之間, 無(wú)論它們所使用的語(yǔ)言、 平臺(tái)或內(nèi)部協(xié)議是什么, 都可以相互交換數(shù)據(jù)。

        Web Service雖然早期很多人使用,但是到現(xiàn)在看來(lái),這是一種過(guò)時(shí)的框架。因?yàn)椋瑯拥囊恍?shù)據(jù),通過(guò)json會(huì)比xml少很多。通過(guò)json會(huì)更少的占用帶寬。如下面數(shù)據(jù)。

        {
            "id"12312,
            "userName""12312"
        }
        <id type="number">12312</id>
        <userName type="string">12312</userName>

        內(nèi)部調(diào)用協(xié)議

        http協(xié)議是應(yīng)用層的一種協(xié)議,對(duì)于開放給外部系統(tǒng)時(shí),是一個(gè)很好的選擇,它可以實(shí)現(xiàn)跨語(yǔ)言調(diào)用。如果是自己的java服務(wù)內(nèi)部調(diào)用時(shí),使用http協(xié)議,就有點(diǎn)浪費(fèi)資源。

        如上圖,http協(xié)議在交互之前需要進(jìn)行tcp三次握手,握手成功之后進(jìn)行數(shù)據(jù)傳輸。一個(gè)http交互下來(lái),有請(qǐng)求頭、請(qǐng)求體、響應(yīng)頭、響應(yīng)體。這些數(shù)據(jù),在內(nèi)部調(diào)用時(shí),很多無(wú)關(guān)緊要的數(shù)據(jù)。也許可以自定義協(xié)議,簡(jiǎn)化傳輸數(shù)據(jù)。這就出現(xiàn)了dubbo協(xié)議,一種內(nèi)部調(diào)用的協(xié)議。

        dubbo協(xié)議追求的是數(shù)據(jù)量小,小則快,協(xié)議的設(shè)計(jì)也符合dubbo框框架的理念,適用與內(nèi)部服務(wù)之間的數(shù)據(jù)交互。安全性就沒有https做的那么好,但是也不需要,畢竟dubbo協(xié)議設(shè)計(jì)的初衷就是內(nèi)部使用的。

        spring cloud的feign組件內(nèi)部使用http協(xié)議,內(nèi)部調(diào)用可能有一些資源的浪費(fèi),但是http協(xié)議可以實(shí)現(xiàn)跨語(yǔ)言調(diào)用。

        RPC框架

        對(duì)于一個(gè)RPC框架來(lái)說(shuō),只是能完成遠(yuǎn)程調(diào)用,并不算完美。

        一般開發(fā)一個(gè)服務(wù)需要多個(gè)機(jī)器進(jìn)行部署,為了防止出現(xiàn)單點(diǎn)故障。對(duì)于一個(gè)較為完善的RPC框架來(lái)說(shuō),在多個(gè)機(jī)器提供同樣的一個(gè)服務(wù)的時(shí)候,需要自動(dòng)做出選擇。好比上圖,userServuce在調(diào)用orderService的時(shí)候,需要自動(dòng)識(shí)別集群信息,并且自動(dòng)選擇機(jī)器進(jìn)行調(diào)用。

        目前,orderService只有一個(gè)服務(wù),三臺(tái)機(jī)器,也許可以在userServuce中配置三個(gè)ip,然后自行編寫路由規(guī)則即可。但是隨著業(yè)務(wù)的復(fù)雜,機(jī)器的變化,也許,我們起初無(wú)法得知機(jī)器的ip信息。

        為了實(shí)現(xiàn)動(dòng)態(tài)的機(jī)器添加與移除。最終,添加了一個(gè)機(jī)器的協(xié)調(diào)者,所有開放服務(wù)的機(jī)器在這個(gè)協(xié)調(diào)者中添加自己的開放服務(wù)的信息,這個(gè)協(xié)調(diào)者中會(huì)有哪些機(jī)器開放了哪些服務(wù)。這樣看來(lái)這個(gè)協(xié)調(diào)者類似一個(gè)"通訊錄"。我們稱這個(gè)"通訊錄"為注冊(cè)中心。

        這樣一個(gè)較為完善的RPC框架,就有了雛形。

        1. 服務(wù)提供者啟動(dòng)之后向注冊(cè)中心,提交自己提供服務(wù)的信息。
        2. 服務(wù)消費(fèi)者,在消費(fèi)時(shí),去注冊(cè)中心查詢是否有機(jī)器提供對(duì)應(yīng)的服務(wù)。例如調(diào)用orderService時(shí),可以發(fā)現(xiàn)有192.168.1.1192.168.1.2機(jī)器有提供對(duì)應(yīng)的服務(wù)。消費(fèi)者可以根據(jù)隨機(jī)、輪訓(xùn)等規(guī)則選擇調(diào)用哪個(gè)服務(wù)。
        3. 在有服務(wù)上線或者下線時(shí),注冊(cè)中心可以對(duì)修改的信息進(jìn)行通知。

        這樣一套流程下來(lái),就完美的實(shí)現(xiàn)的服務(wù)的動(dòng)態(tài)部署,可以任意部署服務(wù)。

        注冊(cè)中心的選擇

        作為協(xié)調(diào)者的注冊(cè)中心,占據(jù)著一個(gè)重要地位。這樣來(lái)看,注冊(cè)中心主要實(shí)現(xiàn)了臨時(shí)數(shù)據(jù)存儲(chǔ)的功能??梢杂卸喾N選擇數(shù)據(jù)庫(kù)、redis、zookeeper、eureka、nacos、或者自己實(shí)現(xiàn)。

        期初dubbo框架官方推薦使用zookeeper為注冊(cè)中心,出現(xiàn)nacos之后,逐漸從zookeeper轉(zhuǎn)為nacos。

        其中的原因有很多,有興趣的小伙伴可以微信搜索Java技術(shù)棧在歷史文章中搜索閱讀。

        為什么zookeeper轉(zhuǎn)為nacos?結(jié)論為:zookeeper在大數(shù)據(jù)計(jì)算時(shí)做注冊(cè)中心是一個(gè)好的選擇,但是在服務(wù)調(diào)用時(shí),也許數(shù)據(jù)不需要超強(qiáng)的一致性。nacos是目前來(lái)說(shuō)很友好的一個(gè)注冊(cè)中心,他提供了CP+AP。還有可視化界面,還有配置中心等功能。功能相當(dāng)完善。

        springcloud與dubbo的歷史

        筆者不才,在17年時(shí),這兩個(gè)詞才進(jìn)入我的視線。當(dāng)時(shí)還有一個(gè)超級(jí)火的springboot。那個(gè)時(shí)候招聘,幾乎每個(gè)崗位都要求會(huì)springboot。分享:Spring Boot 學(xué)習(xí)筆記。一時(shí)間,成為了一個(gè)java開發(fā)的必備功底。

        Spring Boot 基礎(chǔ)教程可以看這個(gè),教程和源碼非常全:https://github.com/javastacks/spring-boot-best-practice

        由于springboot在大大開發(fā)了開發(fā)的速度,而且springcloud的各個(gè)組件都比較完善,feign、網(wǎng)關(guān)、配置中心、熔斷等等。spring、springcloud和springboot明顯是一家人。這讓一個(gè)孤身的dubbo有點(diǎn)不好立足,一些公司從dubbo框架轉(zhuǎn)為springcloud全家桶。

        2018年7月份,eureka停止更新。就目前來(lái)說(shuō)eureka的功能單單作為注冊(cè)中心,已經(jīng)足夠優(yōu)秀了。但是對(duì)于節(jié)奏如此快的互聯(lián)網(wǎng)時(shí)代,停止更新,就意味著會(huì)慢慢的消失。

        2019 年 7 月 24 日晚,Spring Cloud 官方發(fā)布公告Spring Cloud Alibaba 即將畢業(yè)。提供了很多組件,對(duì)于大部分開發(fā)者而言,nacos、dubbo、seata應(yīng)該是較為常用的組件。

        • nacos:注冊(cè)中心。
        • dubbo:一個(gè)基于Java的高性能開源RPC框架。
        • seata:一種高性能且易于使用的分布式事務(wù)解決方案,可用于微服務(wù)架構(gòu)。

        nacos是一個(gè)新推出的注冊(cè)中心,其中最亮眼的功能是提供了可視化界面,而且還附帶配置中心。瞬間dubbo就找到了家人。這些組件的出現(xiàn)讓dubbo又崛起了起來(lái)。而且dubbo本來(lái)擴(kuò)展性就很好??梢赃M(jìn)行協(xié)議擴(kuò)展、調(diào)用攔截?cái)U(kuò)展、引用監(jiān)聽擴(kuò)展、集群擴(kuò)展等等。

        另外dubbo3.0主力使用Triple 協(xié)議。完整兼容 gRPC over HTTP/2。推薦使用 protobuf 作為默認(rèn)序列化,在性能和跨語(yǔ)言上的效果都會(huì)更好。

        結(jié)束語(yǔ)

        就目前來(lái)看,dubbo框架是一個(gè)目前位置非常優(yōu)秀的RPC框架, 一個(gè)必須要學(xué)的一個(gè)框架。也許以后它會(huì)更加優(yōu)秀,也許會(huì)落寞。但是其設(shè)計(jì)思想,非常值得開發(fā)者去學(xué)習(xí)。

        最后,關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):面試,可以獲取我整理的 Java/ Dubbo 系列面試題和答案,非常齊全。






        關(guān)注Java技術(shù)??锤喔韶?/strong>



        獲取 Spring Boot 實(shí)戰(zhàn)筆記!
        瀏覽 43
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产性爱一区二区 | 日韩一级免费视频 | 成人无码三区 | 欧美日韩国产不卡 | 中国人粉嫩bbw18 | 色综合中文字幕 | www.操操操.com | 国产精品毛片久久蜜 | 日韩特黄一级 | 亚洲老少妇 |