面試都在問的微服務,一文帶你徹底搞懂!

2021-01-10 51CTO

單體式應用程式

與微服務相對的另一個概念是傳統的「單體式應用程式」( Monolithic application ),單體式應用內部包含了所有需要的服務。而且各個服務功能模塊有很強的耦合性,也就是相互依賴彼此,很難拆分和擴容。

在座的各位都寫過單體程序,給大家舉個慄子,剛開始寫代碼你寫helloworld 程序就是單體程序,一個程序包含所有功能,雖然helloworld 功能很簡單。

單體應用程式的優點

 開發簡潔,功能都在單個程序內部,便於軟體設計和開發規劃。  容易部署,程序單一不存在分布式集群的複雜部署環境,降低了部署難度。  容易測試,沒有各種複雜的服務調用關係,都是內部調用方便測試。

單體應用程式的缺點

單體程序的缺點一開始不是特別明顯,項目剛開始需求少,業務邏輯簡單,寫代碼一時爽,一直爽。噩夢從業務迭代更新,系統日益龐大開始,前期的爽沒有了,取而代之的是軟體維護和迭代更新的無盡痛苦。

單體架構

由於單體式應用程式就像一個大型容器一樣,裡面放置了許多服務,且他們都是密不可分的,這導致應用程式在擴展時必須以「應用程式」為單位。

當裡面有個業務模塊負載過高時,並不能夠單獨擴展該服務,必須擴展整個應用程式(就是這麼霸道),這可能導致額外的資源浪費。

此外,單體式應用程式由於服務之間的緊密度、相依性過高,這將導致測試、升級有所困難,且開發曲線有可能會在後期大幅度地上升,令開發不易。相較之下「微服務架構」能夠解決這個問題。

微服務

微服務 (Microservices) 就是一些協同工作小而自治的服務。

  ❝    2014年,Martin Fowler 與 James Lewis 共同提出了微服務的概念,定義了微服務是由以單一應用程式構成的小服務,自己擁有自己的行程與輕量化處理,服務依業務功能設計,以全自動的方式部署,與其他服務使用 HTTP API 通信。同時服務會使用最小的規模的集中管理 (例如 Docker) 能力,服務可以用不同的程式語言與資料庫等組件實現 。「維基百科」    ❞

舉例

還是拿前面的 helloworld 程序來舉慄子,想像一下你是 helloworld 公司的 CTO(老闆還缺人嗎?會寫代碼的那種),假設你們公司的 helloworld 業務遍布全球,需要編寫不同語種的 helloworld 版本,分別輸出英語、日語、法語、俄語...現在世界有6000多種語言(奇怪的知識又增加了)。

有人會說這還不簡單我用switch case語句就完事了,同學,不要較真我就是舉個例子,現實中的業務比 helloworld 複雜多了。好了,我們姑且認為按語言輸出是個龐大複雜的工作,這時候就可以用微服務架構了,架構圖如下:

微服務架構

微服務與SOA

「面向服務的體系結構」 SOA (Service-Oriented Architecture) 聽起來和微服務很像,但 SOA 早期均使用了總線模式,這種總線模式是與某種技術棧強綁定的,比如:J2EE。這導致很多企業的遺留系統很難對接,切換時間太長,成本太高,新系統穩定性的收斂也需要一些時間,最終 SOA 看起來很美,但卻成為了企業級奢侈品,中小公司都望而生畏。

此外,實施SOA時會遇到很多問題,比如通信協議(例如SOAP)的選擇、第三方中間件如何選擇、服務粒度如何確定等,目前也存在一些關於如何劃分系統的指導性原則,但其中有很多都是錯誤的。SOA並沒有告訴你如何劃分單體應用成微服務,所以在實施SOA時會遇到很多問題。

這些問題在微服務框架中得到很好的解決,你可以認為微服務架構是SOA的一種特定方法。

微服務架構

合久必分,鑑於「單體應用程式」有上述的缺點,單個應用程式被劃分成各種小的、互相連接的微服務,一個微服務完成一個比較單一的功能,相互之間保持獨立和解耦合,這就是微服務架構。

微服務優點

相對於單體服務,微服務有很多優點,這裡列舉幾個主要的好處

技術異構性

不同服務內部的開發技術可以不一致,你可以用java來開發helloworld服務A,用golang來開發helloworld服務B,大家再也不用為哪種語言是世界上最好的語言而爭論不休。

為不同的服務選擇最適合該服務的技術,系統中不同部分也可以使用不同的存儲技術,比如A服務可以選擇redis存儲,B服務你可以選擇用MySQL存儲,這都是允許的,你的服務你做主。

隔離性

一個服務不可用不會導致另一個服務也癱瘓,因為各個服務是相互獨立和自治的系統。這在單體應用程式中是做不到的,單體應用程式中某個模塊癱瘓,必將導致整個系統不可用,當然,單體程序也可以在不同機器上部署同樣的程序來實現備份,不過,同樣存在上面說的資源浪費問題。

可擴展性

龐大的單體服務如果出現性能瓶頸只能對軟體整體進行擴展,可能真正影響性能的只是其中一個很小的模塊,我們也不得不付出升級整個應用的代價。這在微服務架構中得到了改善,你可以只對那些影響性能的服務做擴展升級,這樣對症下藥的效果是很好的。

簡化部署

如果你的服務是一個超大的單體服務,有幾百萬行代碼,即使修改了幾行代碼也要重新編譯整個應用,這顯然是非常繁瑣的,而且軟體變更帶來的不確定性非常高,軟體部署的影響也非常大。在微服務架構中,各個服務的部署是獨立的,如果真出了問題也只是影響單個服務,可以快速回滾版本解決。

易優化

微服務架構中單個服務的代碼量不會很大,這樣當你需要重構或者優化這部分服務的時候,就會容易很多,畢竟,代碼量越少意味著代碼改動帶來的影響越可控。

微服務缺點

我們上面一直在強調微服務的好處,但是,微服務架構不是萬能的,並不能解決所有問題,其實這也是微服務把單體應用拆分成很多小的分布式服務導致的,所謂人多手雜,服務多起來管理的不好各種問題就來了。

為了解決微服務的缺點,前輩們提出了下面這些概念。

服務註冊與發現

微服務之間相互調用完成整體業務功能,如何在眾多微服務中找到正確的目標服務地址,這就是所謂「服務發現」功能。

常用的做法是服務提供方啟動的時候把自己的地址上報給「服務註冊中心」,這就是「服務註冊」。服務調用方「訂閱」服務變更「通知」,動態的接收服務註冊中心推送的服務地址列表,以後想找哪個服務直接發給他就可以。

服務發現

服務監控

單體程序的監控運維還好說,大型微服務架構的服務運維是一大挑戰。服務運維人員需要實時的掌握服務運行中的各種狀態,最好有個控制面板能看到服務的內存使用率、調用次數、健康狀況等信息。

這就需要我們有一套完備的服務監控體系,包括拓撲關係、監控(Metrics)、日誌監控(Logging)、調用追蹤(Trace)、告警通知、健康檢查等,防患於未然。

服務容錯

任何服務都不能保證100%不出問題,生產環境複雜多變,服務運行過程中不可避免的發生各種故障(宕機、過載等等),工程師能夠做的是在故障發生時儘可能降低影響範圍、儘快恢復正常服務。

聰明的程式設計師引入了「熔斷、隔離、限流和降級、超時機制」等「服務容錯」機制來保證服務持續可用性。

服務安全

有些服務的敏感數據存在安全問題,「服務安全」就是對敏感服務採用安全鑑權機制,對服務的訪問需要進行相應的身份驗證和授權,防止數據洩露的風險,安全是一個長久的話題,在微服務中也有很多工作要做。

服務治理

說到「治理」一般都是有問題才需要治理,我們平常說環境治理、汙染治理一個意思,微服務架構中的微服務越來越多,上面說的那些問題就更加顯現,為了解決上面微服務架構缺陷「服務治理」就出現了。

微服務的那些問題都要公司技術團隊自己解決的話,如果不是大型公司有成熟的技術團隊,估計會很頭大。幸好,有巨人的肩膀可以借給我們站上去,通過引入「微服務框架」來幫助我們完成服務治理。

微服務框架

介紹一些業界比較成熟的微服務框架。

Tars

騰訊內部使用的微服務架構 TAF(Total Application Framework)多年的實踐成果總結而成的開源項目。僅支持 C++ 語言,目前在騰訊內部應用也非常廣泛。2017 年對外開源,僅支持 C++ 語言。

源碼:https://github.com/TarsCloud/Tars/

TARS架構圖|來源github.com/TarsCloud

本命鵝廠 TARS 框架詳細介紹 PPT 已下載,不想自己麻煩去找的同學,在我公眾號「後端技術學堂」回復「tars」獲取。

Dubbo

是阿里巴巴公司開源的一個Java高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫集成。Apache Dubbo |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現 。2011 年末對外開源,僅支持 Java 語言。

官網:http://dubbo.apache.org/zh-cn/

Dubbo架構圖|圖片來源dubbo.apache.org

Motan

是新浪微博開源的一個Java 框架。Motan 在微博平臺中已經廣泛應用,每天為數百個服務完成近千億次的調用。於 2016 年對外開源,僅支持 Java 語言。

官方指南:https://github.com/weibocom/motan/wiki/zh_userguide

Motan框架|圖片來源github.com/weibocom/motan

gRPC

是Google開發的高性能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發。本身它不是分布式的,所以要實現上面的框架的功能需要進一步的開發。2015 年對外開源的跨語言 RPC 框架,支持多種語言。

中文教程:https://doc.oschina.net/grpc?t=58008

gRPC架構圖|圖片來源www.grpc.io

thrift

最初是由 Facebook 開發的內部系統跨語言的高性能 RPC 框架,2007 年貢獻給了 Apache 基金,成為 Apache 開源項目之一, 跟 gRPC 一樣,Thrift 也有一套自己的接口定義語言 IDL,可以通過代碼生成器,生成各種程式語言的 Client 端和 Server 端的 SDK 代碼,支持多種語言。

thrift架構 | 圖片來源wikimedia

微服務框架和RPC

很多人對這兩個概念有點混淆,微服務框架上面我們說過了,我們再來看下RPC的概念。

什麼是RPC

RPC (Remote Procedure Call)遠程過程調用是一個計算機通信協議。我們一般的程序調用是本地程序內部的調用,RPC允許你像調用本地函數一樣去調用另一個程序的函數,這中間會涉及網絡通信和進程間通信,但你無需知道實現細節,RPC框架為你屏蔽了底層實現。RPC是一種伺服器-客戶端(Client/Server)模式,經典實現是一個通過「發送請求-接受回應」進行信息交互的系統。

兩者關係

RPC和微服務框架的關係。「微服務框架」一般都包含了RPC的實現和一系列「服務治理」能力,是一套軟體開發框架。我們可以基於這個框架之上實現自己的微服務,方便的利用微服務框架提供的「服務治理」能力和RPC能力,所以微服務框架也被有些人稱作RPC框架。

下一代微服務架構

Service Mesh(服務網格)被認為是下一代微服務架構,Service Mesh並沒有給我們帶來新的功能,它是用於解決其他工具已經解決過的服務網絡調用、限流、熔斷和監控等問題,只不過這次是在Cloud Native 的 kubernetes 環境下的實現。

特點

Service Mesh 有如下幾個特點:

 應用程式間通訊的中間層  輕量級網絡代理  應用程式無感知  解耦應用程式的重試/超時、監控、追蹤和服務發現

目前兩款流行的 Service Mesh 開源軟體 [Istio](https://istio.io/) 和 [Linkerd](https://linkerd.io/)都可以直接在kubernetes 中集成,其中Linkerd已經成為雲原生計算基金會 CNCF (Cloud Native Computing Foundation) 成員。

Why Service Mesh

為什麼現有微服務架構已經解決的問題還要用Service Mesh呢?這個問題問的好。

回答問題之前,先看下istio.io上對service mesh的解釋,我覺得挺好的,摘抄出來:

  ❝    As a service mesh grows in size and complexity, it can become harder to understand and manage. Its requirements can include discovery, load balancing, failure recovery, metrics, and monitoring. A service mesh also often has more complex operational requirements, like A/B testing, canary rollouts, rate limiting, access control, and end-to-end authentication.

  makes it easy to create a network of deployed services with load balancing, service-to-service authentication, monitoring, and more, **with few or no code changes in service code.  **    ❞

試著總結一下:隨著微服務的增多複雜程度也增加,管理變得更加困難,微服務架構雖然解決了「網絡調用、限流、熔斷和監控」等問題,但大多數框架和開源軟體對原有業務是侵入式的,也就是需要在業務服務程序中集成相關的「服務治理」組件。

Service Mesh之於微服務,就像TCP/IP之於網際網路,TCP/IP為網絡通信提供了面向連接的、可靠的、基於字節流的基礎通信功能,你不再需要關心底層的重傳、校驗、流量控制、擁塞控制。

用了Service Mesh你也不必去操心「服務治理」的細節,不需要對服務做特殊的改造,所有業務之外的功能都由Service Mesh幫你去做了。它就像一個輕量級網絡代理 對應用程式來說是透明,所有應用程式間的流量都會通過它,所以對應用程式流量的控制都可以在 serivce mesh 中實現 。

Service Mesh架構|圖片來自:Pattern: Service Mesh

寫在最後

在IT世界沒有什麼技術是永不過時的,微服務架構的演進就是一個例子,從單體程序到微服務架構,再到service mesh架構,我不知道下一個技術迭代點是什麼時候,但可以肯定微服務架構還會演進,IT人更應該建立終身學習的習慣。

當然更重要的是擁有對技術的熱情,熱於擁抱變化、接受新技術,當看到新技術我是興奮的,內心os是厲害了,還能這麼玩!,希望你也有這樣的熱情,而不僅僅是面向工資編程,這樣生活會更有樂趣。

老規矩。感謝各位的閱讀,文章的目的是分享對知識的理解,技術類文章我都會反覆求證以求最大程度保證準確性,若文中出現明顯紕漏也歡迎指出,我們一起在探討中學習。

【責任編輯:

龐桂玉

TEL:(010)68476606】

點讚 0

相關焦點

  • 20道你必須要背會的微服務面試題,面試一定會被問到
    寫在前面:在學習springcloud之前大家一定要先了解下,常見的面試題有那塊,然後我們帶著問題去學習這個微服務技術,那麼就會更加理解springcloud技術。如果你已經學了springcloud,那麼在準備面試的時候,一定要看看看這些面試題。
  • 一文帶你認識超級壽星
    一文帶你認識超級壽星時間:2020-12-25 16:59   來源:今日頭條   責任編輯:沫朵 川北在線核心提示:原標題:超級壽星的植物是什麼? 一文帶你認識超級壽星 超級壽星的植物是什麼 關於這些你知道嗎?超級壽星的植物是什麼,具體詳情如下: 1、超級壽星的植物是百歲蘭。 2、百歲蘭是百歲蘭科百歲蘭屬植物。
  • 頭條面試官:一文徹底搞懂 JSONP
    從環繞山峰的小徑最高點看到的拉瓦萊多三峰山,義大利(© AWL Images/Danita Delimont)本題摘自於我 github 上的面試每日一題:https://github.com/shfshanyue/Daily-Question,並有大廠面經及內推信息,可在左下角打開本題原文連結
  • 7家公司拿了5個offer,無非就是問源碼、分布式微服務這些
    JVM相關面試題  1.Java中你怎樣喚醒一個阻塞的線程?  2.在 Java中CycliBarriar和CountdownLatch有什麼區別?  3.為什麼我們調用start()方法時會執行 run()方法,為什麼我們不能直接調用 run()方法?
  • java學習:徹底搞懂HashMap(上)
    一、徹底搞懂HashMap(上)文章概述:相信很多朋友對於HashMap,開發中我們幾乎每天都要使用它,但是每當問到map的一些原理時,很多朋友就不知道如何去回答,甚至一問三不知,從而離我們心儀的offer越來越遠,那麼今天借著咱們IT 巡遊屋這個平臺,和大家分享一下關於map的原理,讓大家讀完這篇文章後,再也不會因為map而倒在面試的路上
  • 面試官:你還有什麼要問我的嗎?這樣回答讓你脫穎而出!
    當我們在平時參加面試的時候,在面試過程當中,面試官總會對我們說一句,你還有什麼問題要問呢?其實就是這麼一個簡單的問題,面試官就可以問出很多的東西,同時這個問題也暗藏很多的玄機。之所以聊這個問題,是因為我們公司HR前幾天面試了幾個新人,在面試的過程中,發現新人有一個共性問題,最後面試官問「還沒有問題問他」時,他們一致的回答是:「沒有了」或是「公司包一日三餐嗎?」這等無關痛癢的回答。而這樣的人第二天收到通知基本都是不合適,在面試的時候沉默,或者回答「沒有」的面試者。在面試時,通常處於下風。
  • 微服務是什麼?十分鐘了解微服務架構
    微服務倡導儘量避免這種模型,反而更傾向於另一個理念:一個團隊應該在一個產品的整個生命周期都擁有它。與之相同的靈感來自於亞馬遜的「你創造它,你運維它」的理念,在那裡一個開發團隊對產品中的軟體是完全負責的。這給開發者們帶來了日常聯繫,讓他們知道他們的軟體在產品中表現如何,同時由於他們必須要承擔一些支持負擔,也增加了他們與用戶的聯繫。
  • 高清圖解:我們的肺原來長這樣的,一文帶你看清肺部結構
    高清圖解:我們的肺原來長這樣的,一文帶你看清肺部結構 2020-05-12 08:03 來源:澎湃新聞·澎湃號·湃客
  • 華為自爆宇宙級:基於SpringBoot+Cloud微服務分布式架構實戰手冊
    Spring Boot以及Spring Cloud作為現在最火的技術,同時也是面試過程中必然會被問到的點,小編今天開源的這份手冊就是以分布式架構結合微服務實例的方式,介紹Spring Boot+Spring Cloud的基礎知識、架構順序和操作方法。
  • 阿里94 年 P7 員工曬出工資,網友:搞好「微服務」 = 百萬年薪?
    都2021年了,還沒用過微服務嗎?面試的時候高並發回答的總是不能讓面試官滿意?一個網際網路項目究竟有多少細節?網上搜了一堆秒殺系統方案,究竟真實的線上電商該怎麼做?那麼你缺乏這兩個字實 戰消除痛點、解決面試、積累實戰經驗歡迎你參加馬士兵教育微服務與高並發 訓練營本號粉絲:免 費限前200個!
  • 面試套路:問你職業規劃是什麼,別實話實說,格局要大!
    在面對面試官的此類問題時,一定要表現出自己的野心,什麼一年帶領一個團隊,兩年成為主管,三年變成總經理,面試官看到此人如此回答,肯定會問為什麼,自己反問「既然我能力足夠,為什麼當總經理的人不是我?」,這樣的回答,能讓面試官看到你的自信,還能讓他再次仔細端詳審視一下你的為人,重新評估你的潛力。
  • 刪繁就簡三秋木,虛擬語氣不用怵:一文帶你搞定虛擬語氣那些事
    虛擬語氣並不難,小夥伴們不用懼怕它,下面看學姐一文帶你搞定虛擬語氣那些事!
  • 面試官靈魂一問: 為什麼 SQL 語句不要過多的 join?
    我:有的呀面試官:我想查看內存的使用情況該用什麼命令我:free 或者 top面試官:那你說一下用free命令都可以看到啥信息我:那,如下圖所示 可以看到內存以及緩存的使用情況...., 回去等通知吧再談SQL Join面試官:換個話題,談談你對join的理解我:好的(再答錯就徹底完了,把握住機會)回顧SQL中的join可以根據某些條件把指定的表給結合起來並將數據返回給客戶端join的方式有:5 種
  • 微服務架構設計實踐總結和思考
    一旦微服務註冊接入後,消費端通過註冊中心查找到可用的微服務後,那麼該微服務通過聲明式方式暴露的所有API接口都處於可用狀態。在微服務架構開發下,團隊實際應該有更加明確的邊界,更加粗粒度的接口暴露和交互,而不是簡單的團隊A在發現團隊B的微服務後,裡面所有的API接口都可以隨意調用,這樣反而是導致了更多的內部規則外協,也加強了兩個微服務模塊之間的耦合性。
  • 厲害了,教你用 Spring Cloud 實現微服務
    因為網上流傳的多數資料是官網翻譯而來,很多描述的重點也都偏向於作者自身碰到的問題,這樣就很容易讓你理解和操作出現偏差,最開始我就進入了這樣誤區。官網的技術導讀真的描述的很詳細,雖然對於我們看英文很費勁,但如果英文不是很差,請選擇沉下心去讀,你一定能收穫好多。
  • 一文帶你徹底了解,什麼是收納整理師?
    最近很多人都在問,收納整理師到底是做什麼的?大家似乎都對這個詞感到新奇與一絲絲的疑惑,今天我就帶大家一起來徹底了解一下,什麼是收納整理師。說起收納整理師,或許很多人沒有聽過,但是提起《斷舍離》相信很多人都曾有所耳聞,收納整理師走入公眾視野,很大一部分原因便是這本書,山下英子在書中寫道「斷絕不需要的東西,捨棄多餘的廢物,脫離對物品的執念」,如今這一理念被很多人所追捧,並運用到生活的方方面面,而最開始,其實這句話便是指的生活中的收納整理。
  • 面試官說我的簡歷像包裝的,面試後面試官向我道歉了
    都2021年了,你的工資漲了嗎?
  • 這才是Java微服務劃分的正確姿勢,學會了嗎?
    如果粒度太大了,分和不分似乎都差不多;如果粒度太小了,聚合、發布、調用鏈、調試等都是坑。以下談到的拆分是前人經驗的總結,我羅列了三種行家的拆分姿勢,每個的的經驗和視野不同,各有偏頗,我在這裡更多的是談共鳴和感受,希望對你有所啟發。
  • soa和微服務的區別
    雖然在這一領域中具有實際工作經驗的開發者基本上都已經很好地理解了這些問題,但針對他們的報導與討論卻相對很少: 通過這種方式對大問題進行分解也增加了整個解決方案的複雜度,尤其是在那些使用不同技術或方式創建各種服務的系統中體現得更為明顯。這種架構將系統的整合點推移到了服務之間的接口,因此這些服務的接口需要進行良好的定義,在系統中也要對服務級別達成一致,並且還需要定義其他的非功能性需求。
  • 2021升級版微服務教程—為什麼會有微服務?什麼是SpringCloud?
    以上就是分布式的架構5.服務化於是公司進入轟轟烈烈的服務化時代,但是有幾個問題需要被解決,如下image-20200317151634243 每一個模塊都是一個獨立的項目 都可以獨立啟動 這樣的做法 就叫做服務化 模塊變成項目之後我們稱之為服務 首頁模塊---》首頁服務這就是服務化 這就是微服務,微服務是:特殊的分布式架構【服務化