|
作為本系列文章的第二篇(第一篇:淺談服務(wù)治理、微服務(wù)與Service Mesh(一)Dubbo的前世今生),本文主要為大家介紹下微服務(wù)概念中非常火熱的Spring Cloud開(kāi)發(fā)框架。由于網(wǎng)上關(guān)于Spring Cloud的文章多如牛毛,為了讓大家閱讀后能有不一樣的收獲,因此本文將用一個(gè)相對(duì)輕松的敘述方式來(lái)為大家講解一下Spring Cloud框架和微服務(wù)。雖然不可能通過(guò)一篇文章讓大家對(duì)Spring Cloud做到從“入門到精通到放棄”,但是希望大家通過(guò)閱讀本文能對(duì)Spring Cloud和微服務(wù)有一個(gè)更加清晰的認(rèn)識(shí)和了解,為后面學(xué)習(xí)Service Mesh做好一個(gè)鋪墊。 Spring Cloud 之“出身名門望族”作為當(dāng)下最火熱的微服務(wù)框架,Spring Cloud的名字可以說(shuō)是無(wú)人不知、無(wú)人不曉,憑借之前Spring Framework的良好群眾基礎(chǔ)和Cloud這個(gè)具有時(shí)代感的名字,Spring Cloud一出現(xiàn)便被大家認(rèn)知。 提到Spring Cloud,便會(huì)讓人想起剛剛發(fā)布了2.0版本的Spring Boot。Spring Boot和Spring Cloud都是出自Pivotal公司,Spring Boot和Spring Cloud雖然火熱,但是了解Pivotal公司的人在國(guó)內(nèi)卻是不多。實(shí)際上Pivotal公司在云計(jì)算、大數(shù)據(jù)、虛擬化等領(lǐng)域都有所建樹,這里先給大家簡(jiǎn)單八卦下Pivotal的情況。 Pivotal公司是由EMC和VMware聯(lián)合成立的一家公司,GE(通用電氣)也對(duì)Pivotal進(jìn)行了股權(quán)收購(gòu),同時(shí)GE也是Pivotal的一個(gè)重要大客戶。除了Spring Framework、Spring Boot和Spring Cloud之外,我們?nèi)粘i_(kāi)發(fā)中經(jīng)常使用的Reids、RabbitMQ、Greenplum、Gemfire、Cloud Foundry等,目前都是歸屬于Pivotal公司的產(chǎn)品。其中Gemfire也是被中國(guó)鐵路總公司12306使用的分布式內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)你過(guò)年回家買不到火車票,這個(gè)鍋Pivotal的Gemfire也會(huì)跟著一起背(開(kāi)個(gè)小玩笑,哈哈)。 Spring Cloud 之“入門”Spring Cloud作為一個(gè)微服務(wù)的開(kāi)發(fā)框架,其包括了很多的組件,包括:Spring Cloud Netflix(Eureka、Hystrix、Zuul、Archaius)、Spring Cloud Config、Spring Cloud Bus、Spring Cloud Cluster、Spring Cloud Consul、Spring Cloud Security、Spring Cloud Sleuth、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Zookeeper、Spring Cloud Connectors、Spring Cloud Starters、Spring Cloud CLI等。 在上述組件中,Spring Cloud Netflix是一套微服務(wù)的核心框架,由互聯(lián)網(wǎng)流媒體播放商N(yùn)etflix開(kāi)源后并入Spring Cloud大家庭,它提供了的微服務(wù)最基礎(chǔ)的功能:服務(wù)發(fā)現(xiàn)(Service Discovery)、動(dòng)態(tài)路由(Dynamic Routing)、負(fù)載均衡(Load Balancing),和邊緣服務(wù)器(Edge Server)等。 Spring Boot是Spring的一套快速配置腳手架,可以基于Spring Boot快速開(kāi)發(fā)單個(gè)微服務(wù)。Spring Boot簡(jiǎn)化了基于Spring的應(yīng)用開(kāi)發(fā),通過(guò)少量的代碼就能創(chuàng)建一個(gè)獨(dú)立的、生產(chǎn)級(jí)別的Spring應(yīng)用。由于Spring Cloud是基于Spring Boot進(jìn)行的開(kāi)發(fā),因此使用Spring Cloud就必須使用到Spring Boot。 下圖是一個(gè)常見(jiàn)的關(guān)于Spring Cloud的架構(gòu)圖。下面此圖為例,對(duì)Spring Cloud最常用的幾個(gè)組件做一個(gè)簡(jiǎn)單的介紹: ● Eureka:服務(wù)注冊(cè)中心,一個(gè)基于REST的服務(wù),用于定位服務(wù),以實(shí)現(xiàn)微服務(wù)架構(gòu)中服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。 除了上面介紹的基礎(chǔ)組件外,常見(jiàn)的Spring Cloud組件還有非常多種,涉及到了微服務(wù)以及應(yīng)用開(kāi)發(fā)的方方面面: Spring Cloud 之“精通”Spring Cloud雖然集成了眾多組件,可以構(gòu)建一個(gè)完整的微服務(wù)應(yīng)用,但是其中的各個(gè)組件卻并非完美無(wú)缺,很多組件在實(shí)際應(yīng)用中都存在諸多不足和缺陷。因此,需要我們對(duì)其中的一些組件進(jìn)行替換和修改,方能構(gòu)建一個(gè)強(qiáng)大、靈活、健壯的微服務(wù)架構(gòu)應(yīng)用。 ● 配置中心 目前開(kāi)源社區(qū)中,已經(jīng)有了很多的開(kāi)源配置中心實(shí)現(xiàn)方案,同時(shí)很多公司也自研了自己的配置中心方案。包括淘寶的統(tǒng)一配置中心Diamond(已經(jīng)多年未更新)、百度的分布式配置管理平臺(tái)Disconf、攜程的開(kāi)源分布式配置中心Apollo、360的分布式配置管理工具QConf等等。目前,筆者公司采用的是自己公司自研的配置中心,沒(méi)有采用開(kāi)源實(shí)現(xiàn)的主要原因是因?yàn)樾枰瑫r(shí)適配Spring Cloud和Dubbo等多種場(chǎng)景的應(yīng)用。 ● 注冊(cè)中心 Eureka的設(shè)計(jì)確實(shí)簡(jiǎn)單易用,但是默認(rèn)沒(méi)有實(shí)現(xiàn)對(duì)注冊(cè)中心數(shù)據(jù)的持久化。同時(shí),在極端場(chǎng)景下,也會(huì)出現(xiàn)多個(gè)Eureka注冊(cè)中心節(jié)點(diǎn)數(shù)據(jù)不一致,甚至服務(wù)注冊(cè)數(shù)據(jù)丟失的情況。當(dāng)然,從分布式CAP理論來(lái)看,理論上是沒(méi)辦法做到同時(shí)兼顧C(jī)AP三點(diǎn)的。目前也有一些互聯(lián)網(wǎng)公司對(duì)Eureka進(jìn)行了改造,支持了數(shù)據(jù)的持久化,但是尚不能完整的支持CAP的全部要求。 ● API網(wǎng)關(guān) 和大部分基于Java的Web應(yīng)用類似,Zuul也采用了Servlet架構(gòu),因此Zuul處理每個(gè)請(qǐng)求的方式是針對(duì)每個(gè)請(qǐng)求是用一個(gè)線程來(lái)處理。同時(shí),由于Zuul是基于JVM的實(shí)現(xiàn),因此性能也會(huì)在高并發(fā)訪問(wèn)場(chǎng)景下成為瓶頸。雖然網(wǎng)上一些文章評(píng)測(cè)Zuul和Nginx性能接近,但是在性能要求較高的場(chǎng)景下,JVM的內(nèi)存管理和垃圾回收問(wèn)題,仍然是一個(gè)很大的問(wèn)題。所以在實(shí)際的應(yīng)用場(chǎng)景中,通常會(huì)采用在多個(gè)Zuul幾點(diǎn)前面再添加一層Nginx或者OpenResty來(lái)進(jìn)行代理。 為了解決Zuul的性能問(wèn)題,Netflix將自己的網(wǎng)關(guān)服務(wù)Zuul進(jìn)行了升級(jí),新的Zuul 2將HTTP請(qǐng)求的處理方式從同步變成了異步,并且新增諸如HTTP/2、websocket等功能。但是遺憾的是,開(kāi)源版本的Zuul 2一直處于難產(chǎn)狀態(tài)中,始終沒(méi)有和大家正式見(jiàn)面。 ● 熔斷器 單獨(dú)使用Spring Cloud中的Hystrix無(wú)法完整的滿足上述的復(fù)雜需求,需要結(jié)合API網(wǎng)關(guān),并通過(guò)Kubernetes對(duì)資源、進(jìn)程和命名空間來(lái)提供隔離,并通過(guò)部分自定義編碼方能實(shí)現(xiàn)對(duì)全部服務(wù)的限流、降級(jí)、熔斷等需求。 ● 監(jiān)控系統(tǒng) APM整體上主要完成3點(diǎn)功能:1.日志追蹤、2.監(jiān)控報(bào)警、3.性能統(tǒng)計(jì)。目前,國(guó)內(nèi)外商業(yè)版本的APM方案已經(jīng)有很多,開(kāi)源版本的APM方案也開(kāi)始豐富起來(lái)。國(guó)內(nèi)開(kāi)源的APM方案主要有:大眾點(diǎn)評(píng)的CAT和Apache孵化中的SkyWalking。這里給大家重點(diǎn)推薦下SkyWalking,SkyWalking是針對(duì)分布式系統(tǒng)的應(yīng)用性能監(jiān)控系統(tǒng),特別針對(duì)微服務(wù)、Cloud Native和容器化(Docker, Kubernetes, Mesos)架構(gòu),項(xiàng)目的關(guān)注度和發(fā)展速度都很快,中文文檔資料也比較齊全。 Spring Cloud 之“放棄”Spring Cloud可以說(shuō)是一個(gè)完美的微服務(wù)入門框架,如果你是在一個(gè)中小型項(xiàng)目中應(yīng)用Spring Cloud,那么你不需要太多的改造和適配,就可以實(shí)現(xiàn)微服務(wù)的基本功能。但是如果是在大型項(xiàng)目中實(shí)踐微服務(wù),可能會(huì)發(fā)現(xiàn)需要處理的問(wèn)題還是比較多,尤其是項(xiàng)目中老代碼比較多,沒(méi)辦法全部直接升級(jí)到Spring Boot框架下開(kāi)發(fā)的話,你會(huì)非常希望能有一個(gè)侵入性更低的方案來(lái)實(shí)施微服務(wù)架構(gòu)。在這種場(chǎng)景下,Service Mesh將會(huì)成為你的最佳選擇,經(jīng)過(guò)一段時(shí)間的發(fā)展,目前Service Mesh這個(gè)概念已經(jīng)開(kāi)始逐步被大家了解和認(rèn)知。同時(shí),一些Service Mesh的實(shí)現(xiàn)方案也逐步成熟和落地,例如Istio、Linkerd、Envoy等。在本系列文章的下一篇中,將為大家對(duì)Service Mesh概念做一個(gè)系統(tǒng)的介紹。但是在了解Service Mesh概念之前,還是建議大家先對(duì)微服務(wù)和Spring Cloud這些概念和框架有一個(gè)深入的了解,這樣才能體會(huì)到應(yīng)用Service Mesh的價(jià)值和意義。 Spring Cloud 與 Dubbo網(wǎng)上關(guān)于Spring Cloud和Dubbo對(duì)比的文章很多,大多數(shù)對(duì)比結(jié)果都是Spring Cloud壓倒性優(yōu)勢(shì)戰(zhàn)勝Dubbo,下表是對(duì)Dubbo和Spring Cloud做的一個(gè)基礎(chǔ)功能的對(duì)比: 實(shí)際上,Dubbo的關(guān)注點(diǎn)在于服務(wù)治理,并不能算是一個(gè)真正的微服務(wù)框架。包括目前在開(kāi)發(fā)中的Dubbo 3.0,也不能完整覆蓋微服務(wù)的各項(xiàng)功能需求。而Spring Cloud一方面是針對(duì)微服務(wù)而設(shè)計(jì),另外一方面Spring Cloud是通過(guò)集成各種組件的方式來(lái)實(shí)現(xiàn)微服務(wù),因此理論上可以集成目前業(yè)內(nèi)的絕大多數(shù)的微服務(wù)相關(guān)組件,從而實(shí)現(xiàn)微服務(wù)的全部功能。 而對(duì)Dubbo而言,如果一定要應(yīng)用到微服務(wù)的使用場(chǎng)景中的話,上表中欠缺的大多數(shù)功能都可以通過(guò)集成第三方應(yīng)用和組件的方式來(lái)實(shí)現(xiàn),跟Spring Cloud相比主要的缺陷在于集成過(guò)程中的便利性和兼容性等問(wèn)題。 Spring Cloud 與 Docker雖然網(wǎng)上也有很多文章寫到如何使用Docker來(lái)實(shí)現(xiàn)微服務(wù),但是事實(shí)上單獨(dú)使用Docker是沒(méi)辦法完整的實(shí)現(xiàn)微服務(wù)的所有功能的。在實(shí)際上微服務(wù)架構(gòu)中,Spring Cloud和Docker更多的是一種協(xié)作的關(guān)系,而不是一種競(jìng)爭(zhēng)的關(guān)系。通過(guò)Docker容器化技術(shù),可以更好的解決引入Spring Cloud微服務(wù)后帶來(lái)的部署和運(yùn)維的復(fù)雜性。 Spring Cloud生態(tài)圈中的Pivotal Cloud Foundry (PCF)作為 PAAS 實(shí)現(xiàn),也提供一些類似于Docker的功能支持,但是無(wú)論上功能上還是易用性上和Docker還是存在比較大的差異。Pivotal Cloud Foundry和Docker之間的關(guān)系更多的是一種兼容關(guān)系,而不是競(jìng)爭(zhēng)關(guān)系,Pivotal Cloud Foundry的主要競(jìng)爭(zhēng)對(duì)手是Red Hat的OpenShift。目前,Pivotal Cloud Foundry支持的IAAS包括:AWS、AZURE、GCP、vSphere、OpenStack等。 Spring Cloud 與 Kubernetes網(wǎng)上也有一些“Spring Cloud與Kubernetes哪個(gè)更好”,“當(dāng)已經(jīng)有了Kubernetes之后,還需要使用Spring Cloud么”之類的文章。首先說(shuō)筆者并不認(rèn)為Spring Cloud與Kubernetes是競(jìng)爭(zhēng)關(guān)系,但是也不否認(rèn)二者確實(shí)在諸多功能上存在一些重合。下圖是對(duì)Spring Cloud與Kubernetes在微服務(wù)架構(gòu)中的一些基礎(chǔ)功能上的對(duì)比: 通過(guò)對(duì)比可以看出,Spring Cloud和Kubernetes確實(shí)存在一些功能上的重合,但是二者的定位其實(shí)差別很大。Spring Cloud是一個(gè)基于Java語(yǔ)言的微服務(wù)開(kāi)發(fā)框架,而Kubernetes是一個(gè)針對(duì)容器應(yīng)用的自動(dòng)化部署、伸縮和管理的開(kāi)源系統(tǒng),它兼容多種語(yǔ)言且提供了創(chuàng)建、運(yùn)行、伸縮以及管理分布式系統(tǒng)的原語(yǔ)。Spring Cloud更多的是面向有Spring開(kāi)發(fā)經(jīng)驗(yàn)的Java語(yǔ)言開(kāi)發(fā)者,而Kubernetes不是一個(gè)針對(duì)開(kāi)發(fā)者的平臺(tái),它的目的是供有DevOps思想的IT人員使用。 為了區(qū)分Spring Cloud和Kubernetes兩個(gè)項(xiàng)目的范圍,下面這張圖列出了幾乎是端到端的微服務(wù)架構(gòu)需求,從最底層的硬件,到最上層的DevOps和自服務(wù)經(jīng)驗(yàn),并且列出了如何關(guān)聯(lián)到Spring Cloud和Kubernetes平臺(tái)。 總結(jié)通過(guò)Spring Cloud、Docker和Kubernetes的組合,可以構(gòu)建更加完整和強(qiáng)大的微服務(wù)架構(gòu)程序。通過(guò)三者的整合,使用Spring Boot提供應(yīng)用的打包,Docker和Kubernetes提供應(yīng)用的部署和調(diào)度。Spring Cloud通過(guò)Hystrix線程池提供應(yīng)用內(nèi)的隔離,而Kubernetes通過(guò)資源、進(jìn)程和命名空間來(lái)提供隔離。Spring Cloud為每個(gè)微服務(wù)提供健康終端,而Kubernetes執(zhí)行健康檢查,且把流量導(dǎo)到健康服務(wù)。Spring Cloud外部化配置并更新它們,而Kubernetes分發(fā)配置到每個(gè)微服務(wù)。 對(duì)于一名開(kāi)發(fā)人員或者架構(gòu)師來(lái)說(shuō),想要精通微服務(wù)設(shè)計(jì)與開(kāi)發(fā),能夠在大中型項(xiàng)目中應(yīng)用微服務(wù)架構(gòu),單純掌握Spring Cloud是遠(yuǎn)遠(yuǎn)不夠的,Docker和Kubernetes等都是需要學(xué)習(xí)和掌握的內(nèi)容。同時(shí),由于采用微服務(wù)架構(gòu)后帶來(lái)了分布式的相關(guān)問(wèn)題,對(duì)于分布式系統(tǒng)理論也必須有一定的了解。當(dāng)然,最重要的還是對(duì)系統(tǒng)業(yè)務(wù)的深入理解,對(duì)整體業(yè)務(wù)進(jìn)行合理的規(guī)劃和拆分,才能真正行之有效的應(yīng)用微服務(wù)架構(gòu),構(gòu)建高效、健壯、靈活、可擴(kuò)展的微服務(wù)應(yīng)用。 參考鏈接: https://my.oschina.net/u/3677020/blog/1570248 http://blog.csdn.net/rickiyeat/article/details/60792925 https://projects./spring-cloud/ 轉(zhuǎn)載自 易商阜極 微信公眾號(hào)。 |
|
|
來(lái)自: liang1234_ > 《serviceMesh》