微服務(wù)的趨勢(shì)已經(jīng)讓人無法忽視胖替。有些人可能會(huì)說它只不過是又一個(gè)故弄玄虛的流行詞燃箭,而另一些人可能會(huì)列舉出分解單體應(yīng)用的優(yōu)勢(shì),或者反其道而行营勤,專注于其不足之處。
在本文中霞幅,我們將專注于Java生態(tài)系統(tǒng),從務(wù)實(shí)角度看待我們所掌握的實(shí)際用于實(shí)現(xiàn)微服務(wù)的框架,來看看它們到底是什么比藻。讓我們開始吧拍谐。
這個(gè)畫餅是個(gè)謊言
我們要問的第一個(gè)問題是,我們真的需要一個(gè)專門的框架用于構(gòu)建微服務(wù)么元咙?答案是否定的赶掖。你能用微服務(wù)框架構(gòu)建一個(gè)單體應(yīng)用么咱士?是的弛房。那么,如果真的由你來決定怎么做的話,微服務(wù)框架相比Java EE或Spring有什么好處?是什么讓它值得采用?它們是否同時(shí)解決了內(nèi)部架構(gòu)和外部架構(gòu)的問題依啰?
在接下來的幾節(jié)中,我們將進(jìn)一步了解Java EE及其新的微型化方案:Spring及Spring Boot逾柿、使用Lagom的Lightbend棧,以及其他的開源解決方案帘饶,例如Spotify的Apollo。
在我們繼續(xù)之前丢氢,有必要說明一下,關(guān)于什么是微服務(wù)架構(gòu)并沒有一個(gè)清晰的定義弦撩。ThoughtWorks首席科學(xué)家Martin Fowler在他第一篇講述微服務(wù)的文章中曾嘗試這么定義它:
“微服務(wù)架構(gòu)風(fēng)格是將一個(gè)單一應(yīng)用程序作為一系列小服務(wù)來開發(fā)的一種方式,每個(gè)服務(wù)都運(yùn)行在自己的進(jìn)程中猾漫,并使用輕量級(jí)的機(jī)制進(jìn)行通信禽翼,通常是HTTP資源API桐绒。這些服務(wù)圍繞業(yè)務(wù)能力進(jìn)行構(gòu)建乙墙,并可通過全自動(dòng)部署裝置進(jìn)行獨(dú)立部署”垫卤。
本文不討論微服務(wù)的優(yōu)勢(shì)和劣勢(shì),并假定你只是簡單地對(duì)支撐它的底層技術(shù)感興趣鱼响。另外一篇涵蓋調(diào)試微服務(wù)的主要挑戰(zhàn)的問題文章值得一看,這是很多人在考慮微服務(wù)架構(gòu)時(shí)沒考慮的常見錯(cuò)誤筐骇。
我們將對(duì)下列技術(shù)/平臺(tái)/框架進(jìn)行逐一分析江滨。
1. Java Enterprise Edition
構(gòu)建應(yīng)用程序的傳統(tǒng)Java EE方法是針對(duì)單體應(yīng)用的,后者隨著時(shí)間推移往往會(huì)變成……意式代碼怪獸唬滑。傳統(tǒng)上,一個(gè)企業(yè)應(yīng)用程序?qū)⒈淮虬梢粋€(gè)單一的EAR(Enterprise Archive)部署單元晶密,這包括了WAR(Web Archive)文件和JAR(Java Archive)文件。
是的稻艰,“老態(tài)龍鐘”的Java EE也可以用于微服務(wù)架構(gòu)。想深入了解將Java EE單體應(yīng)用重構(gòu)為微服務(wù)框架的示例尊勿,可參考Arun Gupta的這篇文章(http://blog.arungupta.me/monolithic-microservices-refactoring-javaee-applications/),他通過一個(gè)購物車的示例應(yīng)用程序講解了這個(gè)過程所需的步驟元扔。
雖然Java EE 8的開發(fā)有所放緩,其背后的“非官方”社區(qū)依然活力十足途事。來自Java EE Microprofile的成員針對(duì)微服務(wù)架構(gòu)提出了優(yōu)化企業(yè)Java的一個(gè)新方案验懊。你可以在此加入討論(https://groups.google.com/forum/#!forum/microprofile)尸变。
在思考Java EE微服務(wù)時(shí)可以考慮的另一個(gè)有趣的項(xiàng)目是Kumuluz。這個(gè)框架利用你現(xiàn)有的Java EE知識(shí)振惰,提供了一個(gè)無痛的方式供你手工挑選應(yīng)用程序所需的組件,而無須在配置上浪費(fèi)過多時(shí)間骑晶。
綜述:Java EE及它周邊的項(xiàng)目完全適合微服務(wù),但未解決運(yùn)維方面的問題匙头,并且其使用與最佳實(shí)踐留給你個(gè)人解讀。
2. Lightbend:Play蹂析、Akka、ConductR及Lagom
Lightbend(此前為Typesafe)提供了更多選項(xiàng)电抚。與Kumuluz相比普通Java EE的優(yōu)勢(shì)類似竖共,Lagom用其引擎中的Play、Akka和ConductR包裝了Lightbend棧公给,提供了構(gòu)建微服務(wù)的一種更簡單的方法。它的底層組件還包括了Cassandra淌铐、Guice、Jackson腿准、slf4j、Logback及傳統(tǒng)的Lightbend組件释涛。
Lagom(瑞典語“恰到好處”的意思)還處在起步階段倦沧,不過它看起來像是Lightbend棧的一個(gè)可靠方向。在一次與InfoQ的訪談中展融,Lightbend的CTO Jonas Boner說道:“市面上多數(shù)的微服務(wù)框架致力于簡化單個(gè)微服務(wù)的構(gòu)建——這是比較容易的部分。Lagom將其擴(kuò)展到微服務(wù)的系統(tǒng)上,大型系統(tǒng)——這是比較困難的部分烧给,因?yàn)槲覀兠鎸?duì)的是分布式系統(tǒng)的復(fù)雜性喝噪〈〉眨”
綜述:Lagom將Lightbend的功能包裹在一個(gè)框架中酝惧,包括了ConductR提供的運(yùn)維功能。它不僅關(guān)注單一的微服務(wù)晚唇,還關(guān)注作為一個(gè)整體的系統(tǒng)。
3. Spring哩陕、Spring Boot及Spring Cloud
雖然Spring及Spring Boot未稱呼它們自己為微服務(wù)框架,Spring網(wǎng)站在其首頁也未提及微服務(wù)闽瓢,但這不代表它們被排除在外。似乎他們是有意不叫它為微服務(wù)以遠(yuǎn)離流行詞炒作鸳粉。
在Spring Cloud中园担,Spring棧利用Netflix的Eureka和Ribbon來支持分布式系統(tǒng)(經(jīng)常與“微服務(wù)”重疊的術(shù)語)的開發(fā)届谈。這些功能包括配置管理弯汰、服務(wù)發(fā)現(xiàn)、智能路由咏闪、控制總線、領(lǐng)導(dǎo)者選舉鸽嫂、分布式會(huì)話等等。
要深入了解如何使用Spring及幾個(gè)額外的Netflix和其他開源項(xiàng)目來構(gòu)建微服務(wù)据某,可閱讀InfoQ的這篇文章(https://www.infoq.com/articles/spring-cloud-service-wiring)。
綜述:Spring在微服務(wù)開發(fā)中處于有利位置挽唉,并且提供了解決運(yùn)維角度問題的外部開源項(xiàng)目的方案滤祖。
4. Dropwizard
與Spring類似瓶籽,Dropwizard也未過多地談?wù)撐⒎?wù)。它是一個(gè)Java框架汤求,用于開發(fā)對(duì)運(yùn)維友好的、高性能的首昔、REST化的Web服務(wù)。它具有一套固有的Java庫勒奇,能讓構(gòu)建適用生產(chǎn)環(huán)境的Java應(yīng)用程序變得更簡單。
此前我們已經(jīng)對(duì)Dropwizard和Spring Boot進(jìn)行過一對(duì)一的比較赊颠,對(duì)彼此的功能進(jìn)行考查劈彪。
綜述:與Spring和Privotal竣蹦、Java EE和Oracle沧奴、Lagom和Lightbend不同的是,由于Dropwizard是一個(gè)社區(qū)項(xiàng)目滔吠,沒有大公司的支持,它的開發(fā)進(jìn)度可能會(huì)比較慢疮绷,不過它背后具有一個(gè)強(qiáng)大的社區(qū),不論是對(duì)大型公司或是小一點(diǎn)的項(xiàng)目來說椅贱,都是一個(gè)不錯(cuò)的框架。
5. Spotify Apollo庇麦、VertX及其他“微框架”
除了我們這里說的四個(gè)重量級(jí)選手喜德,還有很多項(xiàng)目值得一提山橄,也可用于編寫微服務(wù):
Vertx:用于在JVM上構(gòu)建響應(yīng)式應(yīng)用程序的工具包住诸。有人認(rèn)為它應(yīng)該在四巨頭中占有一席之位。
Spotify Apollo:Spotify在編寫Java微服務(wù)時(shí)使用的一組Java庫贱呐。Apollo包括了類似HTTP服務(wù)器、URI路由系統(tǒng)的功能奄薇,可輕松實(shí)現(xiàn)REST化服務(wù)。
其他框架包括Spark呵晚、Ninja、Jodd饵隙、Restlet及Bootique.io沮脖。
綜述:Java微服務(wù)的舞臺(tái)如此巨大金矛,那些輕量級(jí)選手也值得關(guān)注勺届。
6. 微服務(wù)的必備條件
正如Martin Fowler在他的微服務(wù)的必備條件(http://martinfowler.com/bliki/MicroservicePrerequisites.html)文章中所說,“當(dāng)你的監(jiān)控指出一個(gè)問題時(shí)免姿,確保你能快速響應(yīng)就顯得至關(guān)重要。特別是需要開發(fā)團(tuán)隊(duì)和運(yùn)維參與的故障管理胚膊,既要修復(fù)直接的問題,又要進(jìn)行根源分析以確保修復(fù)底層的問題”购披。與此類似的,Hackernews上的這個(gè)主題和文章分享了更多在你還沒為微服務(wù)構(gòu)架做好準(zhǔn)備時(shí)可能碰到的問題刚陡。
在OverOps株汉,我們正在構(gòu)建一個(gè)工具來解決這個(gè)痛苦筐乳,它可顯示生產(chǎn)環(huán)境中代碼崩潰的時(shí)間乔妈、位置及原因。這是一個(gè)絕無僅有的工具路召,可展示完整的源代碼波材,以及針對(duì)每個(gè)異常身隐、記錄的警告和錯(cuò)誤跨越整個(gè)調(diào)用棧的變量狀態(tài)廷区。點(diǎn)這去瞧瞧(http://land.overops.com/why-overops/)贾铝。
綜述:微服務(wù)是有代價(jià)的,并不適合每個(gè)系統(tǒng)垢揩。如果你正在選擇微服務(wù)架構(gòu),在深入之前你應(yīng)該要了解其代價(jià)叁巨,并確定你需要改進(jìn)的流程。
結(jié)語
你正在使用的是哪個(gè)框架或平臺(tái)并不重要秤标,構(gòu)建微服務(wù)與它們的耦合并不緊密宙刘。它只是一種思維及一種架構(gòu)手段苍姜,你應(yīng)該選擇那些對(duì)你而言生產(chǎn)力更高的方案悬包。
除此之外,成功實(shí)現(xiàn)一個(gè)微服務(wù)框架并不止于應(yīng)用程序本身布近。圍繞它的多數(shù)成本來自于所謂的DevOps過程、監(jiān)控撑瞧、CI/CD、日志變更预伺、服務(wù)器配備等等。我們將在未來的文章中對(duì)這些方面進(jìn)行闡述酬诀,我們樂于聽取你的想法,并在未來的文章對(duì)其進(jìn)行討論
大家可以點(diǎn)擊加入群:656039503【JAVA大牛學(xué)習(xí)交流】
里面有Java高級(jí)大牛直播講解知識(shí)點(diǎn) 走的就是高端路線
(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了
瓶頸 我這里有一個(gè)JAVA的免費(fèi)直播課程 講的是高端的知識(shí)點(diǎn)
基礎(chǔ)不好的誤入喲 只要你有1-5年的開發(fā)經(jīng)驗(yàn)
可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦