
作者:孫浩峰
過(guò)去幾年來(lái),“微服務(wù)架構(gòu)”方興未艾,盡管這種架構(gòu)風(fēng)格沒(méi)有確切的定義,但我們已經(jīng)看到許多項(xiàng)目憑借此架構(gòu)取得了積極的結(jié)構(gòu),因此對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō),微服務(wù)正成為構(gòu)建企業(yè)應(yīng)用程序的默認(rèn)風(fēng)格??杀氖?,沒(méi)有太多的信息概述微服務(wù)的風(fēng)格以及如何去做。而實(shí)際上,擁有一個(gè)合適的微服務(wù)開(kāi)發(fā)平臺(tái)將會(huì)非常有助于實(shí)現(xiàn)微服務(wù)架構(gòu),基于此,CSDN云計(jì)算特別策劃了微服務(wù)平臺(tái)盤(pán)點(diǎn)系列文章,欲以CSDN中立技術(shù)社區(qū)專(zhuān)業(yè)、客觀的角度,探討如何為為開(kāi)發(fā)者選擇合適的微服務(wù)開(kāi)發(fā)平臺(tái),以幫助其企業(yè)實(shí)現(xiàn)微服務(wù)架構(gòu)。為此,我們采訪了數(shù)家提供微服務(wù)平臺(tái)的云服務(wù)廠商,本期,我們的主角是網(wǎng)易云。
輕舟已過(guò)萬(wàn)重山
——2019微服務(wù)盤(pán)點(diǎn)之網(wǎng)易云輕舟微服務(wù)平臺(tái)
當(dāng)前,在互聯(lián)網(wǎng)領(lǐng)域,微服務(wù)架構(gòu)是業(yè)務(wù)規(guī)模達(dá)到一定程度的團(tuán)隊(duì)的標(biāo)配,這些團(tuán)隊(duì)配備完整微服務(wù)工具和平臺(tái),實(shí)現(xiàn)熔斷、限流、降級(jí)等服務(wù)治理策略和包括CI/CD在內(nèi)的DevOps自動(dòng)化運(yùn)維;在傳統(tǒng)領(lǐng)域,服務(wù)化架構(gòu)也是傳統(tǒng)企業(yè)數(shù)字化轉(zhuǎn)型的核心技術(shù)之一,比如物流、銀行、證券、工業(yè)制造等行業(yè)的很多企業(yè),都已經(jīng)實(shí)施微服務(wù)化的改造,一些行業(yè)領(lǐng)頭羊,甚至已經(jīng)向互聯(lián)網(wǎng)企業(yè)看齊,構(gòu)建了自己的微服務(wù)平臺(tái)。
微服務(wù)面臨的困難和挑戰(zhàn)
企業(yè)對(duì)微服務(wù)平臺(tái)的熱衷,需要從微服務(wù)開(kāi)發(fā)說(shuō)起。微服務(wù)開(kāi)發(fā)并不是一件簡(jiǎn)單的事情,很多企業(yè)在微服務(wù)開(kāi)發(fā)時(shí)都面臨著困難和挑戰(zhàn),這主要體現(xiàn)在技術(shù)和業(yè)務(wù)兩個(gè)方面:
從技術(shù)方面看, 微服務(wù)體系非常復(fù)雜,開(kāi)發(fā)框架的建設(shè),無(wú)論采用Spring Cloud、Dubbo還是自研RPC,抑或Service Mesh,門(mén)檻都非常高,比如采用Spring Cloud體系,需要微服務(wù)開(kāi)發(fā)者掌握等Eureka(服務(wù)注冊(cè)/發(fā)現(xiàn))、Hystrix(熔斷器、線程隔離)、Ribbon(負(fù)載均衡)、Zuul(API網(wǎng)關(guān))、Config(配置中心)等組件,而且原生Spring Cloud組件在某些場(chǎng)景下缺乏靈活性,甚至存在一些BUG,需要團(tuán)隊(duì)擁有很強(qiáng)的技術(shù)實(shí)力。由此,微服務(wù)架構(gòu)也帶來(lái)了人才缺口、人力成本上升的問(wèn)題。
業(yè)務(wù)方面, 業(yè)務(wù)邊界的確定過(guò)程,即服務(wù)建模的過(guò)程,是服務(wù)拆分中最重要的工作,然而很多業(yè)務(wù)邊界不那么直觀,比如支付服務(wù)和結(jié)算服務(wù)都涉及賬戶(hù)余額數(shù)據(jù)。當(dāng)然,邊界能夠梳理清楚,微服務(wù)對(duì)業(yè)務(wù)發(fā)展的促進(jìn)作用也是巨大的。
微服務(wù)的本質(zhì)
實(shí)際上,微服務(wù)是核心的云原生技術(shù),它的本質(zhì)是通過(guò)分布式架構(gòu)解決兩大業(yè)務(wù)訴求:快速迭代和彈性伸縮,充分釋放云基礎(chǔ)設(shè)施的潛力,這決定了微服務(wù)是一個(gè)復(fù)雜的系統(tǒng),引入微服務(wù),除了服務(wù)注冊(cè)/發(fā)現(xiàn)、負(fù)載均衡,企業(yè)還要解決分布式系統(tǒng)的集群容錯(cuò)、系統(tǒng)的可用性和可擴(kuò)展性,服務(wù)數(shù)量多了之后的配置管理、部署調(diào)度,還有如何進(jìn)行日志和監(jiān)控的統(tǒng)一管理、如何進(jìn)行服務(wù)調(diào)用跟蹤等方面的挑戰(zhàn)。針對(duì)每一項(xiàng)挑戰(zhàn),企業(yè)都需要引入大量的基礎(chǔ)技術(shù)平臺(tái)和框架組件來(lái)解決。
所以,如果沒(méi)有一個(gè)平臺(tái)支撐微服務(wù)開(kāi)發(fā),業(yè)務(wù)開(kāi)發(fā)者勢(shì)必深陷基礎(chǔ)架構(gòu)建設(shè)與優(yōu)化的泥潭,而有了專(zhuān)業(yè)的平臺(tái),業(yè)務(wù)開(kāi)發(fā)者就可以專(zhuān)注于價(jià)值更高的核心業(yè)務(wù)。
評(píng)判微服務(wù)平臺(tái)的標(biāo)準(zhǔn)
面對(duì)眾多微服務(wù)平臺(tái),如何選擇仍然是一個(gè)困難的事情,網(wǎng)易云架構(gòu)師,輕舟微服務(wù)技術(shù)負(fù)責(zé)人馮常健認(rèn)為評(píng)判一項(xiàng)技術(shù)產(chǎn)品的唯一標(biāo)準(zhǔn)是它的業(yè)務(wù)價(jià)值,微服務(wù)平臺(tái)要實(shí)現(xiàn)加速數(shù)字化業(yè)務(wù)發(fā)展的價(jià)值,應(yīng)當(dāng)具備如下六個(gè)特征:
1. 業(yè)務(wù)無(wú)侵入: 治理邏輯不侵入業(yè)務(wù)代碼,讓業(yè)務(wù)開(kāi)發(fā)者無(wú)需關(guān)注和學(xué)習(xí)治理相關(guān)的技術(shù),引入和升級(jí)服務(wù)治理框架不會(huì)帶來(lái)業(yè)務(wù)改造的額外成本。
2. 功能完備 :不僅包括服務(wù)注冊(cè)/發(fā)現(xiàn)、降級(jí)、限流、容錯(cuò)、負(fù)載均衡、分流等服務(wù)治理全家桶,還需要配備CI/CD、容器化、全鏈路監(jiān)控、自動(dòng)化測(cè)試等工具,覆蓋微服務(wù)應(yīng)用全生命周期。
3. 安全穩(wěn)定 :提供統(tǒng)一的認(rèn)證、鑒權(quán)機(jī)制,同時(shí)保障業(yè)務(wù)系統(tǒng)穩(wěn)定運(yùn)行。
4. 易于接入 :業(yè)務(wù)系統(tǒng)可以快速接入框架和平臺(tái),同時(shí)通過(guò)平臺(tái)實(shí)時(shí)配置治理策略。
5. 跨平臺(tái)性 :支持跨不同的基礎(chǔ)設(shè)施,跨不同平臺(tái)和語(yǔ)言。
6. 生態(tài)親和性 :符合微服務(wù)技術(shù)和架構(gòu)趨勢(shì),同時(shí)具備長(zhǎng)遠(yuǎn)的擴(kuò)展性。
網(wǎng)易云輕舟微服務(wù)平臺(tái)
網(wǎng)易云開(kāi)發(fā)的微服務(wù)平臺(tái)叫“輕舟微服務(wù)平臺(tái)”,其中微服務(wù)框架組件(NSF)是它的核心。輕舟微服務(wù)框架的開(kāi)發(fā),是網(wǎng)易云調(diào)研業(yè)界存在的Spring Cloud、Dubbo、自研RPC和Service Mesh等方案之后做的決定。由于這四種方式各有優(yōu)劣,并且學(xué)習(xí)成本和使用成本都很高,網(wǎng)易云希望打造一個(gè)更通用、侵入性更低、能力更全面的微服務(wù)框架,讓業(yè)務(wù)系統(tǒng)開(kāi)發(fā)者無(wú)需關(guān)注和學(xué)習(xí)治理相關(guān)技術(shù)、無(wú)需修改業(yè)務(wù)系統(tǒng)代碼,就可以快速引入微服務(wù)架構(gòu)。
這并不意味著從零開(kāi)始造輪子。事實(shí)上,輕舟微服務(wù)框架基于Spring Cloud進(jìn)行源碼級(jí)的定制和優(yōu)化,在首個(gè)穩(wěn)定版本中,輕舟微服務(wù)框架解決了服務(wù)的治理、流控、監(jiān)控、告警、動(dòng)態(tài)配置、安全認(rèn)證等問(wèn)題,通過(guò)NSF Java Agent增強(qiáng)實(shí)現(xiàn)了治理邏輯不侵入業(yè)務(wù)代碼,并全面兼容Spring Cloud、Dubbo等開(kāi)源框架,確保用戶(hù)原有微服務(wù)的快速接入。隨后,團(tuán)隊(duì)又探索了對(duì)具有下一代微服務(wù)之稱(chēng)的Service Mesh的支持。
網(wǎng)易云輕舟微服務(wù)框架整體架構(gòu)
除了實(shí)現(xiàn)了治理無(wú)侵入,支持多種服務(wù)治理框架,網(wǎng)易云輕舟微服務(wù)平臺(tái)還通過(guò)一個(gè)圖形化的統(tǒng)一控制中心提供了完備的工具鏈,包括DevOps、容器、APM、API網(wǎng)關(guān)、接口測(cè)試等組件,覆蓋開(kāi)發(fā)、測(cè)試、構(gòu)建、發(fā)布到上線運(yùn)行、治理、運(yùn)維以及故障排查,并在網(wǎng)易千萬(wàn)級(jí)DAU大規(guī)模業(yè)務(wù)的生產(chǎn)環(huán)境中經(jīng)受住了考驗(yàn)。
網(wǎng)易云輕舟微服務(wù)平臺(tái)整體架構(gòu)
不過(guò),輕舟微服務(wù)平臺(tái)的研發(fā)也并非一蹴而就,馮常健坦言,分布式系統(tǒng)本身就是一個(gè)復(fù)雜的課題,輕舟微服務(wù)平臺(tái)的要求又是集完備性、實(shí)用性、易用性于一身,從產(chǎn)品設(shè)計(jì)、技術(shù)選型、定制開(kāi)發(fā)到源碼優(yōu)化,每一步都有很多的困難,所幸網(wǎng)易云團(tuán)隊(duì)從十多年前的博客時(shí)代就開(kāi)始面對(duì)用戶(hù)量、訪問(wèn)量暴增和產(chǎn)品高速迭代的挑戰(zhàn),沉淀了一套工程化、服務(wù)化、自動(dòng)化的工具集,也積累了豐富的云計(jì)算架構(gòu)和分布式系統(tǒng)研發(fā)經(jīng)驗(yàn),以及源碼分析能力,社區(qū)又有很多最佳實(shí)踐考驗(yàn)參考,才得以順利地完成這個(gè)項(xiàng)目。
微服務(wù)的拆分
即使擁有一個(gè)出色的微服務(wù)開(kāi)發(fā)平臺(tái),如果不能很好的界定如何進(jìn)行服務(wù)拆分以及對(duì)組織架構(gòu)進(jìn)行調(diào)整,微服務(wù)的實(shí)現(xiàn)仍然會(huì)困難重重。馮常健認(rèn)為,服務(wù)拆分的基本原則是“高內(nèi)聚、低耦合”,設(shè)計(jì)功能高度內(nèi)聚的服務(wù),每次修改只涉及較少的服務(wù),可以達(dá)到快速發(fā)布和交付的目的。如果服務(wù)間耦合過(guò)緊,就會(huì)出現(xiàn)對(duì)一個(gè)服務(wù)的修改導(dǎo)致另一個(gè)服務(wù)被動(dòng)也需要修改的問(wèn)題,影響系統(tǒng)功能的交付。全新設(shè)計(jì)系統(tǒng)的拆分步驟是:數(shù)據(jù)庫(kù)獨(dú)立、代碼獨(dú)立、確定服務(wù)間通信方式、服務(wù)獨(dú)立發(fā)布與部署;歷史遺留系統(tǒng)的服務(wù)化改造需要重點(diǎn)關(guān)注系統(tǒng)架構(gòu)的平滑過(guò)渡,步驟是:分析業(yè)務(wù)邊界、凍結(jié)遺留服務(wù)、拆分新服務(wù)、訂正數(shù)據(jù)、循環(huán)迭代。
對(duì)于復(fù)雜業(yè)務(wù)拆分,每個(gè)業(yè)務(wù)并不一定只能拆成一個(gè)組件,需要實(shí)際分析;業(yè)務(wù)過(guò)于龐大必須進(jìn)行拆分,拆分出來(lái)的必須是相對(duì)獨(dú)立和龐大的業(yè)務(wù);如果業(yè)務(wù)較小但是比較多,類(lèi)型相似,可以不用著急拆分。對(duì)于重耦合業(yè)務(wù)拆分,先在原有服務(wù)中獨(dú)立功能模塊,規(guī)范輸入輸出,形成服務(wù)內(nèi)部的分離;再新建工程,只轉(zhuǎn)流量,不做代碼遷移,通過(guò)新建的工程對(duì)外提供服務(wù),替代老的接口;然后將老工程的接口復(fù)制到新工程,在新工程的接口調(diào)用上,使用熱開(kāi)關(guān)進(jìn)行容災(zāi);最后優(yōu)化新工程的邏輯,刪除老工程的相關(guān)代碼。
重耦合業(yè)務(wù)拆分步驟
應(yīng)用架構(gòu)的演進(jìn)也牽連著組織架構(gòu)的變革。組織架構(gòu)方面,對(duì)微服務(wù)至關(guān)重要的是組織DevOps化,環(huán)境交付、Dockerfile書(shū)寫(xiě)提前到開(kāi)發(fā)環(huán)節(jié),服務(wù)注冊(cè)、發(fā)現(xiàn)、治理、配置等,下沉成為運(yùn)維團(tuán)隊(duì)統(tǒng)一管理的基礎(chǔ)設(shè)施。如下圖為網(wǎng)易杭州研究院DevOps組織架構(gòu),數(shù)據(jù)中心由運(yùn)維部門(mén)管理,上面是云平臺(tái)組,基于OpenStack的云平臺(tái)上,包括了PaaS、容器、微服務(wù)管理和治理等組件。業(yè)務(wù)部門(mén)的中間件組或者架構(gòu)組和云平臺(tái)組溝通密切,共同探討如何以正確的姿勢(shì)使用云平臺(tái)組件;最上面是業(yè)務(wù)部門(mén)的前端組、業(yè)務(wù)開(kāi)發(fā)組和中臺(tái)開(kāi)發(fā)組。當(dāng)然,小團(tuán)隊(duì)自主決策也很重要。
網(wǎng)易杭州研究院DevOps組織架構(gòu)
網(wǎng)易云微服務(wù)平臺(tái)的未來(lái)
談到輕舟微服務(wù)平臺(tái)的未來(lái),馮常健表示,輕舟微服務(wù)平臺(tái)的開(kāi)發(fā),是源自業(yè)務(wù)的驅(qū)動(dòng),輕舟微服務(wù)開(kāi)發(fā)框架的最大愿景,就是讓業(yè)務(wù)系統(tǒng)開(kāi)發(fā)者無(wú)需關(guān)注和學(xué)習(xí)治理相關(guān)技術(shù)、無(wú)需修改業(yè)務(wù)系統(tǒng)代碼就可以快速引入服務(wù)治理能力。微服務(wù)相關(guān)技術(shù)的未來(lái)發(fā)展,網(wǎng)易云目前主要關(guān)注兩個(gè)方面:
第一是Service Mesh,它的主要作用就是將服務(wù)治理下沉到平臺(tái)層,進(jìn)行統(tǒng)一的治理。微服務(wù)框架的統(tǒng)一,涉及到多語(yǔ)言、和應(yīng)用層綁定等問(wèn)題,無(wú)論是Spring Cloud還是Dubbo,都很難完全平臺(tái)化,所以需要Service Mesh;輕舟已經(jīng)基于Envoy做優(yōu)化和改進(jìn),提供高性能的微服務(wù)通信網(wǎng)絡(luò),形成自己的數(shù)據(jù)面組件,并無(wú)縫對(duì)接輕舟微服務(wù)控制平臺(tái)。鑒于目前不同業(yè)務(wù)服務(wù)化改造進(jìn)度不同,有些業(yè)務(wù)仍用傳統(tǒng)虛擬機(jī)方式部署,有些業(yè)務(wù)選擇了不同的服務(wù)化注冊(cè)中心,為了讓業(yè)務(wù)能更低成本地接入Service Mesh,輕舟對(duì)Istio和Envoy都進(jìn)行了擴(kuò)展,使其能支持非容器化環(huán)境和多注冊(cè)中心,滿(mǎn)足業(yè)務(wù)平滑遷移的需求。
第二是AIOps和智能調(diào)度,就是通過(guò)對(duì)于海量數(shù)據(jù)中心收集的監(jiān)控?cái)?shù)據(jù)和業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)的自動(dòng)調(diào)度和參數(shù)調(diào)整。隨著微服務(wù)化和容器化,服務(wù)的數(shù)量會(huì)十分的龐大,運(yùn)維難度大幅度提高,基于AIOps和智能調(diào)度提高效率節(jié)約成本勢(shì)在必然。
技術(shù)點(diǎn)評(píng)
作為網(wǎng)易云重點(diǎn)打造的微服務(wù)平臺(tái),輕舟微服務(wù)平臺(tái)有著鮮明的特點(diǎn):
首先,基于開(kāi)源、兼容開(kāi)源:容器平臺(tái)基于Kubernetes和Docker,服務(wù)治理兼容Spring Cloud、Dubbo和Service Mesh,監(jiān)控追蹤采用OpenTracing、Zipkin、Promethus和Jaeger。
其次,低成本、易接入:支持代碼零改動(dòng)接入微服務(wù)框架,提供非侵入式探針,支持應(yīng)用拓?fù)淇梢暬С纸y(tǒng)一的平臺(tái)認(rèn)證&權(quán)限管控。
第三,立體化監(jiān)控:支持實(shí)時(shí)監(jiān)控,精準(zhǔn)掌控服務(wù)健康狀況;支持服務(wù)拓?fù)?,調(diào)用鏈跟蹤可視化呈現(xiàn);支持多維度關(guān)聯(lián)分析,預(yù)防系統(tǒng)級(jí)故障。
最后,超大規(guī)模的管理能力:容器管理支持單集群3萬(wàn)節(jié)點(diǎn)、45萬(wàn)容器的規(guī)模,注冊(cè)中心提供單節(jié)點(diǎn)10,000個(gè)服務(wù)實(shí)例的注冊(cè)能力。
為了實(shí)現(xiàn)這些特點(diǎn),輕舟做了很多深度定制和優(yōu)化。例如無(wú)侵入性的實(shí)現(xiàn),輕舟微服務(wù)主要采用Javaagent字節(jié)碼增強(qiáng)技術(shù),將服務(wù)治理邏輯以獨(dú)立Jar包的方式提供加載。為支持更大的并發(fā),輕舟微服務(wù)后端采用全分布式架構(gòu),能支持單節(jié)點(diǎn)20,000個(gè)服務(wù)實(shí)例同時(shí)在線,支持水平擴(kuò)展,并提供99.99%以上的可用性。
這些特點(diǎn),都使得輕舟微服務(wù)平臺(tái)能夠幫助企業(yè)開(kāi)發(fā)團(tuán)隊(duì)能夠以較小的投入和代價(jià),敏捷迅速的實(shí)現(xiàn)微服務(wù)架構(gòu),真可謂“輕舟已過(guò)萬(wàn)重山!