新聞中心
微服務(wù)架構(gòu)

微服務(wù)的誕生并非偶然,它是在互聯(lián)網(wǎng)高速發(fā)展,技術(shù)日新月異的變化以及傳統(tǒng)架構(gòu)無(wú)法適應(yīng)快速變化等多重因素的推動(dòng)下誕生的產(chǎn)物?;ヂ?lián)網(wǎng)時(shí)代的產(chǎn)品通常有兩類特點(diǎn):需求變化快和用戶群體龐大,在這種情況下,如何從系統(tǒng)架構(gòu)的角度出發(fā),構(gòu)建靈活、易擴(kuò)展的系統(tǒng),快速應(yīng)對(duì)需求的變化;同時(shí),隨著用戶的增加,如何保證系統(tǒng)的可伸縮性、高可用性,成為系統(tǒng)架構(gòu)面臨的挑戰(zhàn)。
如果還按照以前傳統(tǒng)開(kāi)發(fā)模式,開(kāi)發(fā)一個(gè)大型而全的系統(tǒng)已經(jīng)很難滿足市場(chǎng)對(duì)技術(shù)的需求,這時(shí)候分而治之的思想被提了出來(lái),于是我們從單獨(dú)架構(gòu)發(fā)展到分布式架構(gòu),又從分布式架構(gòu)發(fā)展到 SOA 架構(gòu),服務(wù)不斷的被拆分和分解,粒度也越來(lái)越小,直到微服務(wù)架構(gòu)的誕生。
微服務(wù)架構(gòu)是 SOA 架構(gòu)的傳承,但一個(gè)最本質(zhì)的區(qū)別就在于微服務(wù)是真正的分布式的、去中心化的。把所有的“思考”邏輯包括路由、消息解析等放在服務(wù)內(nèi)部,去掉一個(gè)大一統(tǒng)的 ESB,服務(wù)間輕通信,是比 SOA 更徹底的拆分。微服務(wù)架構(gòu)強(qiáng)調(diào)的重點(diǎn)是業(yè)務(wù)系統(tǒng)需要徹底的組件化和服務(wù)化,原有的單個(gè)業(yè)務(wù)系統(tǒng)會(huì)拆分為多個(gè)可以獨(dú)立開(kāi)發(fā),設(shè)計(jì),運(yùn)行和運(yùn)維的小應(yīng)用,這些小應(yīng)用之間通過(guò)服務(wù)完成交互和集成。
大約 2009 年開(kāi)始,Netflix 完全重新定義了它的應(yīng)用程序開(kāi)發(fā)和操作模型,拉開(kāi)了微服務(wù)探索的***步,直到2014年3月 Martin Fowler 寫的一篇文章 Microservices 以更加通俗易懂的形式為大家定義了什么是微服務(wù)架構(gòu)。Martin Fowler 在文中闡述了對(duì)微服務(wù)架構(gòu)的設(shè)想,認(rèn)為微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。
每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)和服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于 HTTP 的 RESTful API)。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立地部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。
微服務(wù)架構(gòu)和數(shù)據(jù)治理
隨著微服務(wù)架構(gòu)的落地,人們發(fā)現(xiàn)微服務(wù)架構(gòu)雖然改進(jìn)了開(kāi)發(fā)模式,但同時(shí)也引入了一些問(wèn)題,在這所有的問(wèn)題中,最重要的也是馬上要面臨的一個(gè)問(wèn)題就是數(shù)據(jù)的問(wèn)題。在微服務(wù)架構(gòu)中我們強(qiáng)調(diào)徹底的組件化和服務(wù)化,每個(gè)微服務(wù)都可以獨(dú)立的部署和投產(chǎn),其實(shí)也就意味著很多的微服務(wù)有自己獨(dú)立的數(shù)據(jù)庫(kù)。
整個(gè)業(yè)務(wù)數(shù)據(jù)被分散在各個(gè)子服務(wù)之后會(huì)帶來(lái)兩個(gè)最明顯的問(wèn)題:1、業(yè)務(wù)管理系統(tǒng)對(duì)數(shù)據(jù)完整的查詢,比如分頁(yè)查詢、多條件查詢等,數(shù)據(jù)被割裂后如何來(lái)整合?2、如何對(duì)數(shù)據(jù)進(jìn)一步的分析挖掘?這些需求可能需要分析全量的數(shù)據(jù),并且在分析時(shí)不能影響到當(dāng)前業(yè)務(wù)。
從技術(shù)方案來(lái)講,我們一般有兩種選擇來(lái)處理這些問(wèn)題,***種是在線處理數(shù)據(jù),第二種是離線處理數(shù)據(jù)。
在線處理數(shù)據(jù)的方案就是按照微服務(wù)的標(biāo)準(zhǔn)接口來(lái)進(jìn)行,后端需要哪個(gè)系統(tǒng)的數(shù)據(jù)就去調(diào)用某個(gè)微服務(wù)提供的接口來(lái)獲取。后端管理平臺(tái)根據(jù)前端的需求去不同的微服務(wù)系統(tǒng)去獲取數(shù)據(jù),然后將返回的數(shù)據(jù)進(jìn)行處理后將數(shù)據(jù)返回。這種方案有兩個(gè)弊端:1)一方面微服務(wù)數(shù)據(jù)方需要提供數(shù)據(jù)接口,一方面數(shù)據(jù)的使用者需要去寫調(diào)用方法,并且調(diào)用者需要編寫大量的代碼進(jìn)行數(shù)據(jù)處理;2)在對(duì)各個(gè)微服務(wù)進(jìn)行調(diào)取數(shù)據(jù)時(shí)會(huì)影響微服務(wù)的正常業(yè)務(wù)處理性能。
離線處理數(shù)據(jù)方案,就是將業(yè)務(wù)數(shù)據(jù)準(zhǔn)實(shí)時(shí)的同步到另外一個(gè)數(shù)據(jù)庫(kù)中,在同步的過(guò)程中進(jìn)行數(shù)據(jù)整合處理,以滿足業(yè)務(wù)方對(duì)數(shù)據(jù)的需求,數(shù)據(jù)同步過(guò)來(lái)后,再提供另外一個(gè)服務(wù)接口專業(yè)負(fù)責(zé)對(duì)外輸出數(shù)據(jù)信息。這種方案有兩個(gè)特點(diǎn):1)數(shù)據(jù)同步方案是關(guān)鍵,技術(shù)選型有很多,如何選擇切合公司業(yè)務(wù)的技術(shù)方案;2)離線數(shù)據(jù)處理對(duì)微服務(wù)正常業(yè)務(wù)處理沒(méi)有影響。
在我以往的工作中兩種方案都實(shí)施過(guò),個(gè)人更傾向于使用第二種方案。
MongoDB 和數(shù)據(jù)分析
MongoDB 稱之為對(duì)開(kāi)發(fā)人員最友好的數(shù)據(jù)庫(kù),不再?gòu)?qiáng)調(diào)傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的行和列,整個(gè)表可以看作一個(gè) Json 文檔,MongoDB 也被認(rèn)為在 Nosql 中最像關(guān)系數(shù)據(jù)庫(kù)的 Nosql 數(shù)據(jù)庫(kù),保留了類似關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)(DataBase)、集合(Collection)、文檔對(duì)象(Document)。
MongoDB 是目前最熱門非關(guān)系數(shù)據(jù)庫(kù)的之一,在***的數(shù)據(jù)庫(kù)排行榜中 MongoDB 排名第五,在所有的非關(guān)系數(shù)據(jù)庫(kù)中排名***,非常廣泛的應(yīng)用于國(guó)內(nèi)外的互聯(lián)網(wǎng)公司。
MongoDB ***的特點(diǎn)是支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。MongoDB 在高可用和讀寫負(fù)載均衡上的實(shí)現(xiàn)非常簡(jiǎn)潔和友好,MongoDB 自帶了副本集的概念,通過(guò)設(shè)計(jì)恰當(dāng)?shù)母北炯万?qū)動(dòng)程序,可以非常便地實(shí)現(xiàn)高可用、讀寫負(fù)載均衡。
MongoDB 的這些特性非常方便對(duì)數(shù)據(jù)進(jìn)行高性能查詢,MongoDB 支持 Aggregate 和 Mapreduce 利用分而治之的理念來(lái)處理大規(guī)模數(shù)據(jù)分析。Spring Boot 對(duì) MongoDB 的支持非常友好,使用 Spring Boot 非常便利的處理對(duì) MongoDB 查詢和操作,Spring Boot 也提供了組件包來(lái)支持對(duì) MongoDB的使用。
MongoDB 4.0 宣布將正式支持 ACID 事務(wù),未來(lái) MongoDB 的想象空間更加巨大!因此 MongDB + Spring Boot 是微服務(wù)架構(gòu)中數(shù)據(jù)分析的理想選擇之一。
再來(lái)聊聊 Spring Boot
Spring Boot 是由 Pivotal 團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新 Spring 應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開(kāi)發(fā)人員不再需要定義樣板化的配置。采用 Spring Boot 可以大大的簡(jiǎn)化開(kāi)發(fā)模式,所有你想集成的常用框架,它都有對(duì)應(yīng)的組件支持。
Spring Boot 基于 Spring 開(kāi)發(fā),Spirng Boot 本身并不提供 Spring 框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開(kāi)發(fā)新一代基于 Spring 框架的應(yīng)用程序。也就是說(shuō),它并不是用來(lái)替代 Spring 的解決方案,而是和 Spring 框架緊密結(jié)合用于提升 Spring 開(kāi)發(fā)者體驗(yàn)的工具。同時(shí)它集成了大量常用的第三方庫(kù)配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 應(yīng)用中這些第三方庫(kù)幾乎可以零配置的開(kāi)箱即用,大部分的 Spring Boot 應(yīng)用都只需要非常少量的配置代碼,開(kāi)發(fā)者能夠更加專注于業(yè)務(wù)邏輯。
Spring Boot 一經(jīng)推出就受到開(kāi)源社區(qū)的追捧,Spring Boot 官方提供了很多 Starters 方便集成第三方產(chǎn)品,很多主流的框架也紛紛進(jìn)行了主動(dòng)的集成,比如 Mybatis。Spring 官方非常重視 Spring Boot 的發(fā)展,在 Spring 官網(wǎng)首頁(yè)進(jìn)行重點(diǎn)推薦介紹,是目前 Spring 官方重點(diǎn)發(fā)展的項(xiàng)目之一。
Spring Boot 本身發(fā)展特別快,自從 2014 年 4 月發(fā)布 Spring Boot 1.0 之后,版本更新非常頻繁,我在 2016 年使用的時(shí)候是 1.3.X,到現(xiàn)在 Spring Boot 已經(jīng)發(fā)布了 Spring Boot 2.0,Spring Boot 2.0 集成了很多***優(yōu)秀的技術(shù)和新特性,并且對(duì) Spring Boot 1.0 的 API 進(jìn)行了大幅優(yōu)化。Spring Boot 一經(jīng)推出就迅速的成為一門熱門的技術(shù),從下圖也可以看出這個(gè)結(jié)論:
上圖為2014年到2018年 Spring Boot 的百度指數(shù),可以看出 Spring Boot 2.0 的推出引發(fā)了搜索高峰。
Spring Boot 和 微服務(wù)架構(gòu)
隨著 Spring 不斷的發(fā)展,涉及的領(lǐng)域越來(lái)越多,項(xiàng)目整合開(kāi)發(fā)需要配合各種各樣的文件,慢慢變得不那么易用簡(jiǎn)單,違背了最初的理念,甚至人稱配置地獄。Spring Boot 正是在這樣的一個(gè)背景下被抽象出來(lái)的開(kāi)發(fā)框架,目的為了讓大家更容易的使用 Spring 、更容易的集成各種常用的中間件、開(kāi)源軟件;另一方面,Spring Boot 誕生時(shí),正處于微服務(wù)概念在慢慢醞釀中,Spring Boot 的研發(fā)融合了微服務(wù)架構(gòu)的理念,實(shí)現(xiàn)了在 Java 領(lǐng)域內(nèi)微服務(wù)架構(gòu)落地的技術(shù)支撐。
Spring Boot 作為一套全新的框架,來(lái)源于 Spring 大家族,因此 Spring 所有具備的功能它都有,而且更容易使用;Spring Boot 以約定大于配置的核心思想,默認(rèn)幫我們進(jìn)行了很多設(shè)置,多數(shù) Spring Boot 應(yīng)用只需要很少的 Spring 配置。Spring Boot 開(kāi)發(fā)了很多的應(yīng)用集成包,支持絕大多數(shù)開(kāi)源軟件,讓我們以很低的成本去集成其他主流開(kāi)源軟件。
Spring Boot 特性:
- 使用 Spring 項(xiàng)目引導(dǎo)頁(yè)面可以在幾秒構(gòu)建一個(gè)項(xiàng)目
- 方便對(duì)外輸出各種形式的服務(wù),如 REST API、WebSocket、Web、Streaming、Tasks
- 非常簡(jiǎn)潔的安全策略集成
- 支持關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)
- 支持運(yùn)行期內(nèi)嵌容器,如 Tomcat、Jetty
- 強(qiáng)大的開(kāi)發(fā)包,支持熱啟動(dòng)
- 自動(dòng)管理依賴
- 自帶應(yīng)用監(jiān)控
- 支持各種 IED,如 IntelliJ IDEA 、NetBeans
Spring Boot 的這些特性非常方便、快速構(gòu)建獨(dú)立的微服務(wù)。所以我們使用 Spring Boot 開(kāi)發(fā)項(xiàng)目,會(huì)給我們傳統(tǒng)開(kāi)發(fā)帶來(lái)非常大的便利度,可以說(shuō)如果你使用過(guò) Spring Boot 開(kāi)發(fā)過(guò)項(xiàng)目,就不會(huì)再愿意以以前的方式去開(kāi)發(fā)項(xiàng)目了。
總結(jié)一下,使用 Spring Boot 至少可以給我們帶來(lái)以下幾方面的改進(jìn):
- Spring Boot 使編碼變簡(jiǎn)單,Spring Boot 提供了豐富的解決方案,快速集成各種解決方案提升開(kāi)發(fā)效率。
- Spring Boot 使配置變簡(jiǎn)單,Spring Boot 提供了豐富的 Starters,集成主流開(kāi)源產(chǎn)品往往只需要簡(jiǎn)單的配置即可。
- Spring Boot 使部署變簡(jiǎn)單,Spring Boot 本身內(nèi)嵌啟動(dòng)容器,僅僅需要一個(gè)命令即可啟動(dòng)項(xiàng)目,結(jié)合 Jenkins 、Docker 自動(dòng)化運(yùn)維非常容易實(shí)現(xiàn)。
- Spring Boot 使監(jiān)控變簡(jiǎn)單,Spring Boot 自帶監(jiān)控組件,使用 Actuator 輕松監(jiān)控服務(wù)各項(xiàng)狀態(tài)。
總結(jié),Spring Boot 是 Java 領(lǐng)域***秀的微服務(wù)架構(gòu)落地技術(shù),沒(méi)有之一。
三者之間的糾葛
了解完微服務(wù)架構(gòu)、Spring Boot、大數(shù)據(jù)治理之后,我們就發(fā)現(xiàn)這樣一個(gè)有趣的事情:微服務(wù)架構(gòu)是一種架構(gòu)思想,是架構(gòu)不斷發(fā)展的必然結(jié)果,具有構(gòu)建靈活、易擴(kuò)展、快速應(yīng)用、可伸縮性、高可用等特點(diǎn);微服務(wù)架構(gòu)思想的推出對(duì)技術(shù)有了更高的要求,在這樣的背景下 Spring Boot 孕育而生,Spring Boot 出生名門,從一開(kāi)始就站在一個(gè)比較高的起點(diǎn),又經(jīng)過(guò)這幾年的發(fā)展,生態(tài)足夠完善,Spring Boot 已經(jīng)當(dāng)之無(wú)愧成為 Java 領(lǐng)域最熱門的技術(shù)。
微服務(wù)架構(gòu)下,數(shù)據(jù)被分隔到 N 個(gè)獨(dú)立的微服務(wù)中,如何應(yīng)對(duì)市場(chǎng)、業(yè)務(wù)對(duì)大量數(shù)據(jù)的查詢、分析就變的非常急迫,利用 Spring Boot 和 MongoDB 可以輕松的解決這個(gè)問(wèn)題,通過(guò)技術(shù)手段將分裂到 N 個(gè)微服務(wù)的數(shù)據(jù)同步到 MongoDB 集群中,在同步的過(guò)程中進(jìn)行數(shù)據(jù)清洗,來(lái)滿足公司的各項(xiàng)業(yè)務(wù)需求。Spring Boot 對(duì) MongoDB 的支持非常友好,一方面 Spring Data 技術(shù)預(yù)生成很多常用方法便于使用,另一方面 Spring Boot 封裝了分布式計(jì)算的相關(guān)函數(shù),可以讓我們以較簡(jiǎn)潔的方式來(lái)實(shí)現(xiàn)統(tǒng)計(jì)查詢。
Spring Boot 是 Java 領(lǐng)域微服務(wù)架構(gòu)***落地技術(shù),Spring Boot+MongoDB 方案是在微服務(wù)架構(gòu)下數(shù)據(jù)治理的***方案之一。
當(dāng)然如果我們對(duì)微服務(wù)架構(gòu)、Spring Boot 、MongoDB 不熟悉的話,可能需要走很多的彎路。錯(cuò)誤的技術(shù)方案會(huì)對(duì)后期的微服務(wù)落地帶來(lái)非常大的困擾,增加額外的開(kāi)發(fā)工作量,我自己深有體會(huì),合適的技術(shù)方案可以節(jié)省60%以上的工作量。
網(wǎng)頁(yè)名稱:一文透析SpringBoot、微服務(wù)架構(gòu)和大數(shù)據(jù)治理三者之間的故事
本文URL:http://m.fisionsoft.com.cn/article/dhdjcdd.html


咨詢
建站咨詢
