<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分布式與微服務(wù)

          共 3249字,需瀏覽 7分鐘

           ·

          2021-06-11 21:19

          點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

          重磅干貨,第一時(shí)間送達(dá)

          0x01:分布式

          • CAP

          C:consistency 一致性 分布式系統(tǒng)能夠同時(shí)訪(fǎng)問(wèn)同一份數(shù)據(jù)副本

          A:availability 可用性 非故障節(jié)點(diǎn)能夠在合理時(shí)間內(nèi)獲得合理的結(jié)果

          P:Partition Tolerance 分區(qū)容錯(cuò)性 分布式系統(tǒng)當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)時(shí),服務(wù)仍然可用

          網(wǎng)絡(luò)分區(qū):分布式網(wǎng)絡(luò)中,由于某些節(jié)點(diǎn)故障,導(dǎo)致系統(tǒng)分成了幾個(gè)區(qū)域。比如調(diào)用鏈A->B->C,其中B節(jié)點(diǎn)故障,那么A,B分成了兩個(gè)分區(qū)。

          而是在P為條件下,只能實(shí)現(xiàn)A或者C。也就是說(shuō),在發(fā)生網(wǎng)絡(luò)分區(qū)后,我們只能保證一致性或者可用性。

          當(dāng)沒(méi)有發(fā)生網(wǎng)絡(luò)分區(qū)時(shí),也就是沒(méi)有P為條件,那么自然可以同時(shí)滿(mǎn)足A和C。

          • zookeeper:保證CP,zookeeper有l(wèi)eader節(jié)點(diǎn),寫(xiě)操作只能由leader來(lái)做,F(xiàn)ollower只能處理讀操作,這樣就保證數(shù)據(jù)的一致性。

          • Eureka:保證AP,Eureka各個(gè)服務(wù)器節(jié)點(diǎn)都是平等的,只要有至少一個(gè)節(jié)點(diǎn),就能夠保證可用。

          • Nacos:保證AP和CP,默認(rèn)支持AP,通過(guò)命令進(jìn)行切換為CP。


          0x02:BASE理論

          基本可用(Basically Available)

          當(dāng)系統(tǒng)發(fā)生不可預(yù)知的故障時(shí),允許損失部分可用性。

          • 響應(yīng)時(shí)間的損失:原先0.5s就能返回的結(jié)果,允許2s內(nèi)返回

          • 系統(tǒng)功能的損失:可以損失非核心功能,而保證核心功能的可用

          軟狀態(tài)(Soft State)

          允許存在中間狀態(tài),允許在多個(gè)節(jié)點(diǎn)的數(shù)據(jù)副本存在時(shí)延

          最終一致性(Eventually Consistent)

          在一個(gè)時(shí)間期限后,要保證數(shù)據(jù)的最終一致性


          0x03:分布式ID

          對(duì)于單個(gè)數(shù)據(jù)庫(kù)我們使用id自增就能保證,id不重復(fù)。

          對(duì)于兩個(gè)數(shù)據(jù)庫(kù),我們分別設(shè)置起始值和步長(zhǎng)就能避免id重復(fù),但是這時(shí)在添加一個(gè)數(shù)據(jù)庫(kù),則要重新修改初始值和步長(zhǎng)。

          • 號(hào)段模式:我們可以先從數(shù)據(jù)庫(kù)中取出一段數(shù)據(jù),比如id為100到200,當(dāng)需要使用時(shí),在本地直接提取使用,使用完這100個(gè)id后,再?gòu)臄?shù)據(jù)庫(kù)中取200到300的id。

          • redis:通過(guò)redis,在redis中使用incr自增,也能夠保證id的不重復(fù)。

          • 雪花算法:對(duì)分布式id的bit進(jìn)行分配,比如64bit的一個(gè)id,從左到右,第一位符號(hào)位,接下來(lái)41bit為時(shí)間戳,接下來(lái)10bit為工作機(jī)器id,接下來(lái)12bit為序列號(hào)。這樣就能夠保證id的不重復(fù)。


          0x04:限流算法

          • 固定窗口計(jì)數(shù)機(jī)算法

          規(guī)定一分鐘之內(nèi)只能有100個(gè)請(qǐng)求,如果多了則丟棄該請(qǐng)求。該方法無(wú)法防止突增的請(qǐng)求,比如前30秒只有1個(gè)請(qǐng)求,后30秒突然進(jìn)來(lái)99個(gè)請(qǐng)求,無(wú)法保證限流的速率。

          • 滑動(dòng)窗口計(jì)數(shù)機(jī)算法

          將一分鐘劃分成60個(gè)格子,大小為30的窗口不斷移動(dòng),每秒的請(qǐng)求放到格子中,如果窗口中的請(qǐng)求超過(guò)閾值,就不再處理其他請(qǐng)求。

          • 漏桶算法

          輸出的水流是一定的,這樣就能保證輸出速率穩(wěn)定。把請(qǐng)求比作水,當(dāng)請(qǐng)求來(lái)時(shí),則將水輸入到水桶上方,即使上方的水是突然激增的,那輸出也仍然是穩(wěn)定的。如果木桶大小固定,上方水滿(mǎn)了,則水將溢出,也就是說(shuō)請(qǐng)求丟棄。

          缺點(diǎn)是,我們總是以固定的速率流出,我們希望當(dāng)請(qǐng)求少時(shí),固定速率流出自然沒(méi)問(wèn)題,但是當(dāng)請(qǐng)求到峰值,我們希望流出速率大一些。

          • 令牌桶算法

          仍然是一個(gè)固定大小的桶,我們以固定速率生產(chǎn)令牌,當(dāng)請(qǐng)求來(lái)時(shí),對(duì)于大的請(qǐng)求,消耗多點(diǎn)的令牌,小請(qǐng)求就少點(diǎn)令牌。如果桶內(nèi)令牌沒(méi)有了,則丟棄請(qǐng)求。這個(gè)算法就能解決動(dòng)態(tài)去做“流出速率”,峰值時(shí)流出速度快,平時(shí)呢流出速率平穩(wěn)。


          0x05:RPC

          做為遠(yuǎn)程調(diào)用框架,目的是希望調(diào)用遠(yuǎn)程方法就像本地方法一樣簡(jiǎn)單。

          • 客戶(hù)端:通過(guò)簡(jiǎn)單注解或者使用類(lèi)調(diào)用遠(yuǎn)程方法

          • 客戶(hù)端代理類(lèi):通過(guò)動(dòng)態(tài)代理,讓客戶(hù)端執(zhí)行的方法最終讓代理類(lèi)來(lái)執(zhí)行。代理類(lèi)拿到服務(wù)名/方法名,參數(shù)等信息封裝到request中,然后通過(guò)網(wǎng)絡(luò)調(diào)用發(fā)送給服務(wù)端

          • 網(wǎng)絡(luò)調(diào)用:最簡(jiǎn)單的可以用socket,當(dāng)然netty更流行,編寫(xiě)Netty的客戶(hù)端與服務(wù)端

          • 服務(wù)端:Netty中拿到request,知道了方法名,可以通過(guò)反射創(chuàng)建實(shí)現(xiàn)了該方法的類(lèi),然后調(diào)用之,得到結(jié)果后,再通過(guò)Netty服務(wù)端傳送給客戶(hù)端

          • 注冊(cè)中心:我們可以用zk,創(chuàng)建節(jié)點(diǎn),節(jié)點(diǎn)為服務(wù)名,節(jié)點(diǎn)下數(shù)據(jù)為機(jī)器ip地址。服務(wù)端啟動(dòng)時(shí),首先將自己能夠提供的服務(wù)注冊(cè)到zk上。客戶(hù)端根據(jù)服務(wù)名從zk中找到具體的ip地址,然后根據(jù)ip地址發(fā)送訪(fǎng)問(wèn)。


          0x06:網(wǎng)關(guān)

          微服務(wù)下多個(gè)服務(wù),對(duì)于權(quán)限管理,流量控制,日志,監(jiān)控等和業(yè)務(wù)無(wú)關(guān)的東西提取出來(lái),統(tǒng)一管理,因此就有網(wǎng)關(guān)。

          網(wǎng)關(guān)可以做:鑒權(quán),限流,請(qǐng)求路由,日志,監(jiān)控。


          0x07:微服務(wù)

          • 服務(wù)注冊(cè)與發(fā)現(xiàn):Eureka,nacos

          微服務(wù)有很多消費(fèi)者,提供者,我們不希望將他們之間的調(diào)用寫(xiě)死,因?yàn)獒槍?duì)某個(gè)服務(wù),可能有多個(gè)機(jī)器去運(yùn)行他,那么我們希望有一個(gè)人能夠統(tǒng)一管理,那么注冊(cè)中心可以解決我們的問(wèn)題。服務(wù)提供者將自己的服務(wù)注冊(cè)到注冊(cè)中心,消費(fèi)者只需根據(jù)服務(wù)名從注冊(cè)中心拿到提供者地址。并且對(duì)于網(wǎng)關(guān),負(fù)載均衡,熔斷降級(jí),消息隊(duì)列等等組件,他們都希望自己能夠獲得注冊(cè)在注冊(cè)中心的某些信息,從而進(jìn)行操作。

          比如監(jiān)控功能,就需要拿到注冊(cè)中心的所有提供者消費(fèi)者信息,來(lái)判斷他們的健康情況。

          總之,注冊(cè)中心統(tǒng)一對(duì)服務(wù)的管理,當(dāng)我們需要使用或者查看這些服務(wù)狀態(tài)時(shí),只需訪(fǎng)問(wèn)注冊(cè)中心即可。

          • 負(fù)載均衡:Ribbon

          nacos自己集成了Ribbon,要使用負(fù)載均衡,首先我們要講restTemplate通過(guò)@Bean注解注冊(cè)到spring中,然后或者使用注解,或者通過(guò)代碼指定負(fù)載均衡策略即可,然后調(diào)用restTemplate.getForObject或者restTemplate.postForObject即可調(diào)用另一個(gè)服務(wù)的方法。

          Openfeign:有人覺(jué)得直接寫(xiě)restTemplate.postForObject,這樣不美觀,我就是想調(diào)用另一個(gè)服務(wù)就跟調(diào)用本地方法一樣,那么這個(gè)Openfeign就可以幫助我們。我們寫(xiě)一個(gè)接口,接口中方法指明另一個(gè)服務(wù)的接口,然后我們?cè)赾ontroller調(diào)用的時(shí)候,加個(gè)注解,直接調(diào)用接口的方法,看起來(lái)多像在本地調(diào)用方法啊!

          • 熔斷和降級(jí):Hystrix,sentinel

          當(dāng)服務(wù)調(diào)用鏈路A->B->C,其中服務(wù)C發(fā)生故障,導(dǎo)致B有大量請(qǐng)求堆積,最終耗盡B的所有資源,B掛掉,然后A也堆積大量請(qǐng)求,A也掛掉,這就是服務(wù)雪崩。

          為了防止服務(wù)雪崩,我們需要熔斷器,當(dāng)某個(gè)服務(wù)故障時(shí),切斷調(diào)用鏈路,告知上一個(gè)服務(wù),當(dāng)前服務(wù)已經(jīng)故障了。

          服務(wù)降級(jí),比如某服務(wù)訪(fǎng)問(wèn)量過(guò)大,我們一次處理不了那么多請(qǐng)求,我們可以做服務(wù)降級(jí)。比如突然有1000訂單,我們一下子處理不了,那么我們可以讓一部分請(qǐng)求走降級(jí),返回稍后重試的提示信息。

          sentinel不僅僅有熔斷降級(jí)等功能,他還提供了多種其他功能,如限流,負(fù)載保護(hù),實(shí)時(shí)監(jiān)控,調(diào)用鏈路等。

          • 網(wǎng)關(guān):gateway,zuul

          網(wǎng)關(guān)可以做路由映射,過(guò)濾器。

          • 鏈路跟蹤:zipkin

          每個(gè)服務(wù)是一個(gè)圓點(diǎn),服務(wù)調(diào)用之間有連線(xiàn),做出了像蜘蛛網(wǎng)狀。

          source:https://www.cnblogs.com/keboom/p/14842578.html


          國(guó)產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(wàn)(后續(xù))

          年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了

          中國(guó)聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶(hù)推廣色情APP

          張一鳴:每個(gè)逆襲的年輕人,都具備的底層能力


          關(guān)


          學(xué)西學(xué)學(xué)運(yùn)營(yíng)護(hù)號(hào)樂(lè)質(zhì)結(jié)識(shí)關(guān)[]學(xué)習(xí)進(jìn)


          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲娱乐在线 | 婷婷乱伦视频 | 亚洲www啪成人一区二区麻豆 | 国产精品久久夜色 | 婷婷五月天天爽 |