0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

微服務(wù)有哪些要點呢?

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-08-15 15:47 ? 次閱讀

微服務(wù)生態(tài)

微服務(wù)有哪些要點呢?先看下圖是 SpringCloud 的整個生態(tài)。

設(shè)計要點一:API 網(wǎng)關(guān)。

在實施微服務(wù)的過程中,不免要面臨服務(wù)的聚合與拆分,當(dāng)后端服務(wù)的拆分相對比較頻繁的時候,作為手機 App 來講,往往需要一個統(tǒng)一的入口,將不同的請求路由到不同的服務(wù),無論后面如何拆分與聚合,對于手機端來講都是透明的。

有了 API 網(wǎng)關(guān)以后,簡單的數(shù)據(jù)聚合可以在網(wǎng)關(guān)層完成,這樣就不用在手機 App 端完成,從而手機 App 耗電量較小,用戶體驗較好。

有了統(tǒng)一的 API 網(wǎng)關(guān),還可以進行統(tǒng)一的認(rèn)證和鑒權(quán),盡管服務(wù)之間的相互調(diào)用比較復(fù)雜,接口也會比較多,API 網(wǎng)關(guān)往往只暴露必須的對外接口,并且對接口進行統(tǒng)一的認(rèn)證和鑒權(quán),使得內(nèi)部的服務(wù)相互訪問的時候,不用再進行認(rèn)證和鑒權(quán),效率會比較高。

有了統(tǒng)一的 API 網(wǎng)關(guān),可以在這一層設(shè)定一定的策略,進行 A/B 測試,藍(lán)綠發(fā)布,預(yù)發(fā)環(huán)境導(dǎo)流等等。API 網(wǎng)關(guān)往往是無狀態(tài)的,可以橫向擴展,從而不會成為性能瓶頸。

設(shè)計要點二:無狀態(tài)化,區(qū)分有狀態(tài)的和無狀態(tài)的應(yīng)用。

影響應(yīng)用遷移和橫向擴展的重要因素就是應(yīng)用的狀態(tài),無狀態(tài)服務(wù),是要把這個狀態(tài)往外移,將 Session 數(shù)據(jù),文件數(shù)據(jù),結(jié)構(gòu)化數(shù)據(jù)保存在后端統(tǒng)一的存儲中,從而應(yīng)用僅僅包含商務(wù)邏輯。

狀態(tài)是不可避免的,例如 ZooKeeper, DB,Cache 等,把這些所有有狀態(tài)的東西收斂在一個非常集中的集群里面。

整個業(yè)務(wù)就分兩部分,一個是無狀態(tài)的部分,一個是有狀態(tài)的部分。

無狀態(tài)的部分能實現(xiàn)兩點,一是跨機房隨意地部署,也即遷移性,一是彈性伸縮,很容易地進行擴容。

有狀態(tài)的部分,如 DB,Cache,ZooKeeper 有自己的高可用機制,要利用到他們自己高可用的機制來實現(xiàn)這個狀態(tài)的集群。

雖說無狀態(tài)化,但是當(dāng)前處理的數(shù)據(jù),還是會在內(nèi)存里面的,當(dāng)前的進程掛掉數(shù)據(jù),肯定也是有一部分丟失的,為了實現(xiàn)這一點,服務(wù)要有重試的機制,接口要有冪等的機制,通過服務(wù)發(fā)現(xiàn)機制,重新調(diào)用一次后端服務(wù)的另一個實例就可以了。

設(shè)計要點三:數(shù)據(jù)庫的橫向擴展。

數(shù)據(jù)庫是保存狀態(tài),是最重要的也是最容易出現(xiàn)瓶頸的。有了分布式數(shù)據(jù)庫可以使數(shù)據(jù)庫的性能可以隨著節(jié)點增加線性地增加。

分布式數(shù)據(jù)庫最最下面是 RDS,是主備的,通過 MySql 的內(nèi)核開發(fā)能力,我們能夠?qū)崿F(xiàn)主備切換數(shù)據(jù)零丟失,所以數(shù)據(jù)落在這個 RDS 里面,是非常放心的,哪怕是掛了一個節(jié)點,切換完了以后,你的數(shù)據(jù)也是不會丟的。

再往上就是橫向怎么承載大的吞吐量的問題,上面有一個負(fù)載均衡 NLB,用 LVS,HAProxy, Keepalived,下面接了一層 Query Server。Query Server 是可以根據(jù)監(jiān)控數(shù)據(jù)進行橫向擴展的,如果出現(xiàn)了故障,可以隨時進行替換的修復(fù),對于業(yè)務(wù)層是沒有任何感知的。

另外一個就是雙機房的部署,DDB 開發(fā)了一個數(shù)據(jù)運河 NDC 的組件,可以使得不同的 DDB 之間在不同的機房里面進行同步,這時候不但在一個數(shù)據(jù)中心里面是分布式的,在多個數(shù)據(jù)中心里面也會有一個類似雙活的一個備份,高可用性有非常好的保證。

設(shè)計要點四:緩存

在高并發(fā)場景下緩存是非常重要的。要有層次的緩存,使得數(shù)據(jù)盡量靠近用戶。數(shù)據(jù)越靠近用戶能承載的并發(fā)量也越大,響應(yīng)時間越短。

在手機客戶端 App 上就應(yīng)該有一層緩存,不是所有的數(shù)據(jù)都每時每刻從后端拿,而是只拿重要的,關(guān)鍵的,時常變化的數(shù)據(jù)。

尤其對于靜態(tài)數(shù)據(jù),可以過一段時間去取一次,而且也沒必要到數(shù)據(jù)中心去取,可以通過 CDN,將數(shù)據(jù)緩存在距離客戶端最近的節(jié)點上,進行就近下載。

有時候 CDN 里面沒有,還是要回到數(shù)據(jù)中心去下載,稱為回源,在數(shù)據(jù)中心的最外層,我們稱為接入層,可以設(shè)置一層緩存,將大部分的請求攔截,從而不會對后臺的數(shù)據(jù)庫造成壓力。

如果是動態(tài)數(shù)據(jù),還是需要訪問應(yīng)用,通過應(yīng)用中的商務(wù)邏輯生成,或者去數(shù)據(jù)庫讀取,為了減輕數(shù)據(jù)庫的壓力,應(yīng)用可以使用本地的緩存,也可以使用分布式緩存,如 Memcached 或者 Redis,使得大部分請求讀取緩存即可,不必訪問數(shù)據(jù)庫。

當(dāng)然動態(tài)數(shù)據(jù)還可以做一定的靜態(tài)化,也即降級成靜態(tài)數(shù)據(jù),從而減少后端的壓力。

設(shè)計要點五:服務(wù)拆分和服務(wù)發(fā)現(xiàn)

當(dāng)系統(tǒng)扛不住,應(yīng)用變化快的時候,往往要考慮將比較大的服務(wù)拆分為一系列小的服務(wù)。

這樣第一個好處就是開發(fā)比較獨立,當(dāng)非常多的人在維護同一個代碼倉庫的時候,往往對代碼的修改就會相互影響,常常會出現(xiàn)我沒改什么測試就不通過了,而且代碼提交的時候,經(jīng)常會出現(xiàn)沖突,需要進行代碼合并,大大降低了開發(fā)的效率。

另一個好處就是上線獨立,物流模塊對接了一家新的快遞公司,需要連同下單一起上線,這是非常不合理的行為,我沒改還要我重啟,我沒改還讓我發(fā)布,我沒改還要我開會,都是應(yīng)該拆分的時機。

另外再就是高并發(fā)時段的擴容,往往只有最關(guān)鍵的下單和支付流程是核心,只要將關(guān)鍵的交易鏈路進行擴容即可,如果這時候附帶很多其他的服務(wù),擴容即是不經(jīng)濟的,也是很有風(fēng)險的。

再就是容災(zāi)和降級,在大促的時候,可能需要犧牲一部分的邊角功能,但是如果所有的代碼耦合在一起,很難將邊角的部分功能進行降級。

當(dāng)然拆分完畢以后,應(yīng)用之間的關(guān)系就更加復(fù)雜了,因而需要服務(wù)發(fā)現(xiàn)的機制,來管理應(yīng)用相互的關(guān)系,實現(xiàn)自動的修復(fù),自動的關(guān)聯(lián),自動的負(fù)載均衡,自動的容錯切換。

設(shè)計要點六:服務(wù)編排與彈性伸縮

當(dāng)服務(wù)拆分了,進程就會非常的多,因而需要服務(wù)編排來管理服務(wù)之間的依賴關(guān)系,以及將服務(wù)的部署代碼化,也就是我們常說的基礎(chǔ)設(shè)施即代碼。這樣對于服務(wù)的發(fā)布,更新,回滾,擴容,縮容,都可以通過修改編排文件來實現(xiàn),從而增加了可追溯性,易管理性,和自動化的能力。

既然編排文件也可以用代碼倉庫進行管理,就可以實現(xiàn)一百個服務(wù)中,更新其中五個服務(wù),只要修改編排文件中的五個服務(wù)的配置就可以,當(dāng)編排文件提交的時候,代碼倉庫自動觸發(fā)自動部署升級腳本,從而更新線上的環(huán)境,當(dāng)發(fā)現(xiàn)新的環(huán)境有問題時,當(dāng)然希望將這五個服務(wù)原子性地回滾,如果沒有編排文件,需要人工記錄這次升級了哪五個服務(wù)。有了編排文件,只要在代碼倉庫里面 revert,就回滾到上一個版本了。所有的操作在代碼倉庫里都是可以看到的。

設(shè)計要點七:統(tǒng)一配置中心

服務(wù)拆分以后,服務(wù)的數(shù)量非常多,如果所有的配置都以配置文件的方式放在應(yīng)用本地的話,非常難以管理,可以想象當(dāng)有幾百上千個進程中有一個配置出現(xiàn)了問題,是很難將它找出來的,因而需要有統(tǒng)一的配置中心,來管理所有的配置,進行統(tǒng)一的配置下發(fā)。

在微服務(wù)中,配置往往分為幾類,一類是幾乎不變的配置,這種配置可以直接打在容器鏡像里面,第二類是啟動時就會確定的配置,這種配置往往通過環(huán)境變量,在容器啟動的時候傳進去,第三類就是統(tǒng)一的配置,需要通過配置中心進行下發(fā),例如在大促的情況下,有些功能需要降級,哪些功能可以降級,哪些功能不能降級,都可以在配置文件中統(tǒng)一配置。

設(shè)計要點八:統(tǒng)一的日志中心

同樣是進程數(shù)目非常多的時候,很難對成千上百個容器,一個一個登錄進去查看日志,所以需要統(tǒng)一的日志中心來收集日志,為了使收集到的日志容易分析,對于日志的規(guī)范,需要有一定的要求,當(dāng)所有的服務(wù)都遵守統(tǒng)一的日志規(guī)范的時候,在日志中心就可以對一個交易流程進行統(tǒng)一的追溯。例如在最后的日志搜索引擎中,搜索交易號,就能夠看到在哪個過程出現(xiàn)了錯誤或者異常。

設(shè)計要點九:熔斷,限流,降級

服務(wù)要有熔斷,限流,降級的能力,當(dāng)一個服務(wù)調(diào)用另一個服務(wù),出現(xiàn)超時的時候,應(yīng)及時返回,而非阻塞在那個地方,從而影響其他用戶的交易,可以返回默認(rèn)的托底數(shù)據(jù)。

當(dāng)一個服務(wù)發(fā)現(xiàn)被調(diào)用的服務(wù),因為過于繁忙,線程池滿,連接池滿,或者總是出錯,則應(yīng)該及時熔斷,防止因為下一個服務(wù)的錯誤或繁忙,導(dǎo)致本服務(wù)的不正常,從而逐漸往前傳導(dǎo),導(dǎo)致整個應(yīng)用的雪崩。

當(dāng)發(fā)現(xiàn)整個系統(tǒng)的確負(fù)載過高的時候,可以選擇降級某些功能或某些調(diào)用,保證最重要的交易流程的通過,以及最重要的資源全部用于保證最核心的流程。

還有一種手段就是限流,當(dāng)既設(shè)置了熔斷策略,又設(shè)置了降級策略,通過全鏈路的壓力測試,應(yīng)該能夠知道整個系統(tǒng)的支撐能力,因而就需要制定限流策略,保證系統(tǒng)在測試過的支撐能力范圍內(nèi)進行服務(wù),超出支撐能力范圍的,可拒絕服務(wù)。當(dāng)你下單的時候,系統(tǒng)彈出對話框說 “系統(tǒng)忙,請重試”,并不代表系統(tǒng)掛了,而是說明系統(tǒng)是正常工作的,只不過限流策略起到了作用。

設(shè)計要點十:全方位的監(jiān)控

當(dāng)系統(tǒng)非常復(fù)雜的時候,要有統(tǒng)一的監(jiān)控,主要有兩個方面,一個是是否健康,一個是性能瓶頸在哪里。當(dāng)系統(tǒng)出現(xiàn)異常的時候,監(jiān)控系統(tǒng)可以配合告警系統(tǒng),及時地發(fā)現(xiàn),通知,干預(yù),從而保障系統(tǒng)的順利運行。

當(dāng)壓力測試的時候,往往會遭遇瓶頸,也需要有全方位的監(jiān)控來找出瓶頸點,同時能夠保留現(xiàn)場,從而可以追溯和分析,進行全方位的優(yōu)化。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 網(wǎng)關(guān)
    +關(guān)注

    關(guān)注

    9

    文章

    4506

    瀏覽量

    51171
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3816

    瀏覽量

    64458
  • 微服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    137

    瀏覽量

    7363

原文標(biāo)題:微服務(wù)化的十個設(shè)計要點

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    微服務(wù)架構(gòu)和CQRS架構(gòu)基本概念介紹

    微服務(wù)架構(gòu)現(xiàn)在很熱,到處可以看到各大互聯(lián)網(wǎng)公司的微服務(wù)實踐的分享總結(jié)。但是,我今天的分享和微服務(wù)沒有關(guān)系,希望可以帶給大家一些新的東西。如果一定要說微服務(wù)和CQRS架構(gòu)的關(guān)系,那我覺得
    發(fā)表于 05-22 09:03

    微服務(wù)網(wǎng)關(guān)gateway的相關(guān)資料推薦

    目錄微服務(wù)網(wǎng)關(guān) gateway 概述[路由器網(wǎng)關(guān) Zuul 概述]嵌入式 Zuul 反向代理微服務(wù)網(wǎng)關(guān) gateway 概述1、想象一下一個購物應(yīng)用程序的產(chǎn)品詳情頁面展示了指定商品的信息:2、若是
    發(fā)表于 12-23 08:19

    運維是如何看待微服務(wù)和容器的

    微服務(wù)在帶來良好的設(shè)計和架構(gòu)理念的同時,也帶來了運維上的額外復(fù)雜性,尤其是在服務(wù)部署和服務(wù)監(jiān)控上。那么,運維是如何看待微服務(wù)和容器的?傳統(tǒng)
    發(fā)表于 09-30 17:24 ?0次下載
    運維是如何看待<b class='flag-5'>微服務(wù)</b>和容器的

    soa和微服務(wù)的區(qū)別

    微服務(wù)究竟是壓垮SOA的最后一根稻草,還是能夠拯救整個軟件工程行業(yè)的萬能藥?人們對于微服務(wù)的概念進行了大量的討論,其中有許多討論是關(guān)于微服務(wù)與SOA之間的關(guān)聯(lián)。本文將對soa和微服務(wù)
    的頭像 發(fā)表于 02-07 14:11 ?1.4w次閱讀
    soa和<b class='flag-5'>微服務(wù)</b>的區(qū)別

    什么是微服務(wù)_微服務(wù)知識點全面總結(jié)

    微服務(wù)是一個新興的軟件架構(gòu),就是把一個大型的單個應(yīng)用程序和服務(wù)拆分為數(shù)十個的支持微服務(wù)。一個微服務(wù)的策略可以讓工作變得更為簡便,它可擴展單個組件而不是整個的應(yīng)用程序堆棧,從而滿足
    的頭像 發(fā)表于 02-07 16:06 ?1.5w次閱讀

    微服務(wù)是如何演變的

    微服務(wù)的概念產(chǎn)生是順應(yīng)這樣的需求:為了開發(fā)出速度更快、更有彈性且用戶體驗更佳的應(yīng)用。這個概念等同于具有可擴展性的自動化系統(tǒng),在簡單的商業(yè)化架構(gòu)上運行軟件。應(yīng)用快速開發(fā)的需求影響到了全部公司,以及如何看待歷來業(yè)務(wù)安排的方式。那么微服務(wù)是如何演變的
    的頭像 發(fā)表于 02-07 16:25 ?3676次閱讀

    java微服務(wù)架構(gòu)哪些

    本文首先簡單介紹了微服務(wù)的概念以及使用微服務(wù)所能帶來的優(yōu)勢,然后結(jié)合實例介紹了幾個常見的Java微服務(wù)框架。微服務(wù)在開發(fā)領(lǐng)域的應(yīng)用越來越廣泛,因為開發(fā)人員致力于創(chuàng)建更大、更復(fù)雜的應(yīng)用程
    的頭像 發(fā)表于 02-09 10:34 ?8675次閱讀
    java<b class='flag-5'>微服務(wù)</b>架構(gòu)<b class='flag-5'>有</b>哪些

    微服務(wù)優(yōu)勢_微服務(wù)架構(gòu)的好處與不足

    是相互獨立的,所以不同的服務(wù)可以使用不同的語言來開發(fā),或者根據(jù)業(yè)務(wù)的需求使用不同類型的數(shù)據(jù)庫??偠灾?,微服務(wù)架構(gòu)很多吸引人的地方,不過在擁抱微服務(wù)之前要認(rèn)清它所帶來的挑戰(zhàn)。而每一種
    發(fā)表于 02-23 11:24 ?4397次閱讀

    什么是微服務(wù)和容器?微服務(wù)和容器的作用是什么

    微服務(wù)是將應(yīng)用程序拆分為多個服務(wù)的一種架構(gòu)類型,這些服務(wù)具備構(gòu)成整個應(yīng)用程序的細(xì)粒度功能。每個微服務(wù)將具備針對您的應(yīng)用程序的不同邏輯功能。與應(yīng)用程序的所有組件和功能都在單個實例中的單體
    的頭像 發(fā)表于 01-13 10:54 ?3.2w次閱讀
    什么是<b class='flag-5'>微服務(wù)</b>和容器?<b class='flag-5'>微服務(wù)</b>和容器的作用是什么

    微服務(wù)和容器之間的何關(guān)系?

    現(xiàn)在一提到微服務(wù),很多人會想到容器技術(shù)(這里說到的容器技術(shù)是指docker)。那么微服務(wù)和容器之間到底什么關(guān)系,我來簡要和大家探討下。
    的頭像 發(fā)表于 02-01 01:58 ?6155次閱讀

    微服務(wù)架構(gòu)哪些_微服務(wù)架構(gòu)設(shè)計模式

    小伙伴們知道常用的微服務(wù)架構(gòu)框架有哪些嗎?上回我們介紹了一些常用的微服務(wù)架構(gòu)設(shè)計模式,這次我們就來了解一下一些常用的微服務(wù)架構(gòu)框架吧。
    的頭像 發(fā)表于 05-17 17:06 ?2.9w次閱讀
    <b class='flag-5'>微服務(wù)</b>架構(gòu)<b class='flag-5'>有</b>哪些_<b class='flag-5'>微服務(wù)</b>架構(gòu)設(shè)計模式

    微服務(wù)架構(gòu)中的服務(wù)之間如何互相調(diào)用

    微服務(wù)架構(gòu)中,需要調(diào)用很多服務(wù)才能完成一項功能。服務(wù)之間如何互相調(diào)用就變成微服務(wù)架構(gòu)中的一個關(guān)鍵問題。
    的頭像 發(fā)表于 01-31 09:46 ?2217次閱讀

    微服務(wù)之間涉及到的數(shù)據(jù)依賴問題應(yīng)該怎么處理?

    微服務(wù),顧名思義,就是將我們程序拆分為最小化單元來提供服務(wù)。在一體化系統(tǒng)中,各個微服務(wù)也是不可能獨立存在的,那么微服務(wù)之間涉及到的數(shù)據(jù)依賴問題,應(yīng)該怎么處理
    的頭像 發(fā)表于 06-15 10:05 ?783次閱讀
    <b class='flag-5'>微服務(wù)</b>之間涉及到的數(shù)據(jù)依賴問題應(yīng)該怎么處理<b class='flag-5'>呢</b>?

    設(shè)計微服務(wù)架構(gòu)的原則

    微服務(wù)是一種軟件架構(gòu)策略,有利于改善整體性能和可擴展性。你可能會想,我的團隊需不需要采用微服務(wù),設(shè)計微服務(wù)架構(gòu)哪些原則?本文會給你一些靈感。文章速覽:
    的頭像 發(fā)表于 11-26 08:05 ?605次閱讀
    設(shè)計<b class='flag-5'>微服務(wù)</b>架構(gòu)的原則

    如何構(gòu)建彈性、高可用的微服務(wù)?

    基于微服務(wù)的應(yīng)用程序可實現(xiàn)戰(zhàn)略性數(shù)字轉(zhuǎn)型和云遷移計劃,對于開發(fā)團隊來說,這種架構(gòu)十分重要。那么,如何來構(gòu)建彈性、高可用的微服務(wù)?RedisEnterprise給出了一個完美的方案。文況速覽
    的頭像 發(fā)表于 11-26 08:06 ?481次閱讀
    如何構(gòu)建彈性、高可用的<b class='flag-5'>微服務(wù)</b>?