服務遷移之路 | Spring Cloud向Service Mesh轉變
一、導讀
Spring Cloud基於Spring Boot開發,提供一套完整的微服務解決方案,具體包括服務註冊與發現,配置中心,全鏈路監控,API閘道器,熔斷器,遠端呼叫框架,工具客戶端等選項中立的開源元件,並且可以根據需求對部分元件進行擴充套件和替換。
Service Mesh,這裡以Istio(目前Service Mesh具體落地實現的一種,且呼聲最高)為例簡要說明其功能。 Istio 有助於降低這些部署的複雜性,並減輕開發團隊的壓力。它是一個完全開源的服務網格,可以透明地分層到現有的分散式應用程式上。它也是一個平臺,包括允許它整合到任何日誌記錄平臺、遙測或策略系統的 API。Istio的多樣化功能集使你能夠成功高效地執行分散式微服務架構,並提供保護、連線和監控微服務的統一方法。
從上面的簡單介紹中,我們可以看出為什麼會存在要把Spring Cloud體系的應用遷移到Service Mesh這樣的需求,總結下來,有四方面的原因:
1. 功能重疊
來簡單看一下他們的功能對比:
功能列表 | Spring Cloud | Isito |
---|---|---|
服務註冊與發現 |
支援,基於Eureka,consul等元件,提供server,和Client管理 |
支援,基於XDS介面獲取服務資訊,並依賴“虛擬服務路由表”實現服務發現 |
鏈路監控 |
支援,基於Zikpin或者Pinpoint或者Skywalking實現 |
支援,基於sideCar代理模型,記錄網路請求資訊實現 |
API閘道器 |
支援,基於zuul或者spring-cloud-gateway實現 |
支援,基於Ingress gateway以及egress實現 |
熔斷器 |
支援,基於Hystrix實現 |
支援,基於宣告配置檔案,最終轉化成路由規則實現 |
服務路由 |
支援,基於閘道器層實現路由轉發 |
支援,基於iptables規則實現 |
安全策略 |
支援,基於spring-security元件實現,包括認證,鑑權等,支援通訊加密 |
支援,基於RBAC的許可權模型,依賴Kubernetes實現,同時支援通訊加密 |
配置中心 |
支援,springcloud-config元件實現 |
不支援 |
效能監控 |
支援,基於Spring cloud提供的監控元件收集資料,對接第三方的監控資料儲存 |
支援,基於SideCar代理,記錄服務呼叫效能資料,並透過metrics adapter,匯入第三方資料監控工具 |
日誌收集 |
支援,提供client,對接第三方日誌系統,例如ELK |
支援,基於SideCar代理,記錄日誌資訊,並透過log adapter,匯入第三方日誌系統 |
工具客戶端整合 |
支援,提供訊息,匯流排,部署管道,資料處理等多種工具客戶端SDK |
不支援 |
分散式事務 |
支援,支援不同的分散式事務模式:JTA,TCC,SAGA等,並且提供實現的SDK框架 |
不支援 |
其他 |
…… |
……
|
從上面表格中可以看到,如果從功能層面考慮,Spring Cloud與Service Mesh在服務治理場景下,有相當大量的重疊功能,從這個層面而言,為Spring Cloud向Service Mesh遷移提供了一種潛在的可能性。
2. 服務容器化
在行業當前環境下,還有一個趨勢,或者說是現狀。越來越多的應用走在了通往應用容器化的道路上,或者在未來,容器化會成為應用部署的標準形態。而且無論哪種容器化執行環境,都天然支撐服務註冊發現這一基本要求,這就導致Spring Cloud體系應用上容器的過程中,存在一定的功能重疊,有可能為後期的應用運維帶來一定的影響,而Service Mesh恰恰需要依賴容器執行環境,同時彌補了容器環境所欠缺的內容(後續會具體分析)。
3. 術業有專攻
從軟體設計角度出發,我們一直在追求松耦合的架構,也希望做到領域專攻。例如業務開發人員希望我只要關心業務邏輯即可,不需要關心鏈路跟蹤,熔斷,服務註冊發現等支撐工具的服務;而平臺支撐開發人員,則希望我的程式碼中不要包含任何業務相關的內容。而Service Mesh的出現,讓這種情況成為可能。
4. 語言壁壘
目前而言Spring Cloud雖然提供了對眾多協議的支援,但是受限於Java技術體系。這就要求應用需要在同一種語言下進行開發(這不一定是壞事兒),在某種情況下,不一定適用於一些工作場景。而從微服務設計考慮,不應該受限於某種語言,各個服務應該能夠相互獨立,大家需要的是遵循通訊規範即可。而Service Mesh恰好可以消除服務間的語言壁壘,同時實現服務治理的能力。
基於以上四點原因,當下環境,除了部分 大多已經提前走在了Service Mesh實踐的道路上 網際網路大廠以外(例如螞蟻金服的SOFASTACK),也有大部分企業已經開始接觸Service Mesh,並且嘗試把Spring Cloud構建的應用,遷移到Service Mesh中。
二、Spring Cloud向Service Mesh的遷移方案
Spring Cloud向Service Mesh遷移,從我們考慮而言大體分為七個步驟,如圖所示:
1. Spring Cloud架構解析
Spring Cloud架構解析的目的在於確定需要從當前的服務中去除與Service Mesh重疊的功能,為後續服務替換做準備。我們來看一個典型的Spring Cloud架構體系,如圖所示:
從圖中我們可以簡要的分析出,一個基於Spring Cloud的微服務架構,主要包括四部分內容:服務閘道器,應用服務,外圍支撐元件,服務管理控制檯。
-
服務閘道器
服務閘道器涵蓋的功能包括路由,鑑權,限流,熔斷,降級等對入站請求的統一攔截處理。具體可以進一步劃分為外部閘道器(面向網際網路)和內部閘道器(面向服務內部管理)。
-
應用服務
應用服務是企業業務核心。應用服務內部由三部分內容構成:業務邏輯實現,外部元件互動SDK整合,服務內部執行監控整合。
-
外圍支撐元件
外圍支撐元件,涵蓋了應用服務依賴的工具,包括註冊中心,配置中心,訊息中心,安全中心,日誌中心等。
-
服務管理控制檯
服務管理控制檯面向服務運維或者運營人員,實現對應用服務執行狀態的實時監控,以及根據情況需要能夠動態玩成線上服務的管理和配置。
這裡面哪些內容是我們可以拿掉或者說基於Service Mesh(以Istio為例)能力去做的?分析下來,可以替換的元件包括閘道器(gateway或者Zuul,由Ingress gateway或者egress替換),熔斷器(hystrix,由SideCar替換),註冊中心(Eureka及Eureka client,由Polit,SideCar替換),負責均衡(Ribbon,由SideCar替換),鏈路跟蹤及其客戶端(Pinpoint及Pinpoint client,由SideCar及Mixer替換)。這是我們在Spring Cloud解析中需要完成的目標:即確定需要刪除或者替換的支撐模組。
2. 服務改造
服務單元改造的目的在於基於第一步的解析結果,完成依賴去除或者依賴替換。根據第一步的分析結果服務單元改造分為三步:
-
刪除元件,包括閘道器,熔斷器,註冊中心,負載均衡,鏈路跟蹤元件,同時刪除對應client的SDK;
-
替換元件,採用httpClient 的SDK支援http協議的遠端呼叫(原來在Ribbon中),由原來基於註冊中心的呼叫,轉變成http直接呼叫;
-
配置資訊變更,修改與刪除元件管理的配置資訊以及必要的元件互動程式碼(根據實際應用情況操作);
當然服務單元改造過程中,還會涉及到很多的細節問題,都需要根據應用特點進行處理,這裡不做深入分析。
3. 服務容器化
服務容器化是目前應用部署的趨勢所在。服務容器化本身有很多不同的方式,例如基於Jenkins的pipeline實現,基於docker-maven-plugin + dockerfile實現,當然還有很多不同的方式。這裡以Spring Cloud一個demo服務透過docker-maven-plugin+dockerfile實現說明為例:
簡易的一個服務的Dockerfile如下所示:
ROM openjdk:8-jre-alpine
ENV TZ=Asia/Shanghai \
SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
JAVA_OPTS=
""
\
JHIPSTER_SLEEP=0
RUN ln -snf /usr/share/zoneinfo/
$TZ
/etc/localtime &&
echo
$TZ
> /etc/timezone
CMD
echo
"The application will start in
${JHIPSTER_SLEEP}
s..."
&& \
sleep
${JHIPSTER_SLEEP}
&& \
java
${JAVA_OPTS}
-Djava.security.egd=file:/dev/./urandom -jar /app.jar
# java ${JAVA_OPTS} -Djava.security.egd=environment:/dev/./urandom -jar /app.@project.packaging@
EXPOSE 8080
ADD microservice-demo.jar /app.jar
檔案中定義了服務埠以及執行命令。
Maven-docker-plugin的外掛配置如下所示:
<
build
>
<
finalName
>
microservice-demo
</
finalName
>
<
plugins
>
......
<
plugin
>
<
groupId
>
com.spotify
</
groupId
>
<
artifactId
>
docker-maven-plugin
</
artifactId
>
<
version
>
1.2.0
</
version
>
<
executions
>
<
execution
>
<
id
>
build-image
</
id
>
<
phase
>
package
</
phase
>
<
goals
>
<
goal
>
build
</
goal
>
</
goals
>
</
execution
>
<
execution
>
<
id
>
tag-image
</
id
>
<
phase
>
package
</
phase
>
<
goals
>
<
goal
>
tag
</
goal
>
</
goals
>
<
configuration
>
<
image
>
${project.build.finalName}:${project.version}
</
image
>
<
newName
>
${docker.registry.name}/${project.build.finalName}:${project.version}
</
newName
>
</
configuration
>
</
execution
>
<!--暫時不新增推送倉庫的配置-->
</
executions
>
<
configuration
>
<
dockerDirectory
>
${project.basedir}/src/main/docker
</
dockerDirectory
>
<
imageName
>
${project.build.finalName}:${project.version}
</
imageName
>
<
resources
>
<
resource
>
<
targetPath
>
/
</
targetPath
>
<
directory
>
${project.build.directory}
</
directory
>
<
include
>
${project.build.finalName}.${project.packaging}
</
include
>
</
resource
>
</
resources
>
</
configuration
>
</
plugin
>
</
plugins
>
</
build
>
透過增加docker-maven-plugin,在執行mvn package的時候可以載入Dockerfile,自動構建服務的容器映象(需要說明的前提是本地安裝docker執行環境,或者透過環境變數在開發工具中配置Docker的遠端連線環境),從而完成服務容器化改造。
4 . 容器環境構建
容器環境決定這Service Mesh的部署形態,這裡不詳細描述容器環境的部署過程。感興趣的朋友,可以參考 開源專案,提供了Kubernetes基於ansible的自動化部署指令碼。我們也建議選擇Kubernetes來構建容器環境。這裡說明容器環境構建的考慮因素:
· 叢集部署方案
叢集部署方案主要考慮多叢集,跨資料中心,儲存選擇,網路方案,叢集內部主機標籤劃分,叢集內部網路地址規劃等多方面因素。
· 叢集規模
叢集規模主要考慮etcd叢集大小,叢集內執行例項規模(用來配置ip範圍段),叢集高可用節點規模等因素。
基於以上兩點來考慮容器化環境的部署方案,關鍵是合理規劃,避免資源浪費。
5. Service Mesh環境構建
Service Mesh環境構建依賴於容器環境構建,主要考慮兩個方面,以Isito為例:
· 部署外掛
Istio部署外掛需要根據需要的場景,考慮採用的外掛完整性,例如prometheus,kiali,是否開啟TLS等,具體安裝選項可以參考。
· 跨叢集部署
依據容器環境考慮是否需要支援Isito的跨叢集部署方案.
6. 服務注入
服務注入用於將容器化的服務接入到Service Mesh的平臺中,目前主要有兩種方式。以Isito為例說明,主要包括自動注入和手動入住。選擇手動注入的目的在於可以根據企業內部上線流程,對服務接入進行人為控制。而自動注入則能夠更加快捷,方便。到此實際上已經完成服務遷移工作。
7. 服務管理控制檯
由於Service Mesh目前而言,多是基於宣告式的配置檔案,達到服務治理的效果,因此無法實時傳遞執行結果。基於這種原因,需要一個獨立的Service Mesh的管理控制檯,一方面能夠檢視各個服務的執行狀態以及策略執行情況,另外一方面能夠支援服務執行過程中策略的動態配置管理。目前而言,可以在Isito安裝過程中選擇kiali作為一個控制檯實現,當然未來也會有大量的企業提供專門的服務。
透過以上七個步驟,能夠在一定程度上幫助企業應用,從Spring Cloud遷移到Service Mesh上,但遷移過程中必然存在不斷踩坑的過程,需要根據應用特點,事前做好評估規劃。
遷移優缺點分析
Spring Cloud遷移到Service Mesh是不是百利而無一害呢?
首先,從容器化的環境出發,後續Knative,Kubernetes,Service Mesh必然會構建出一套相對完整的容器化PaaS解決方案,從而完成容器化PaaS支撐平臺的構建。Service Mesh將為容器執行態提供保駕護航的作用。
其次,就目前Service Mesh的落地實現而言,對於一些特定需求的監測粒度有所欠缺,例如呼叫執行緒棧的監測(當然,從網路層考慮,或者不在Service Mesh的考慮範圍之內),但是恰恰在很多服務治理場景的要求範圍之中。我們也需要針對這種情況,考慮實現方案。
最後,大家一直詬病的效能和安全問題。目前已經有所加強,但是依然被吐槽。
整體而言,Spring Cloud是微服務實現服務治理平臺的現狀,而Service Mesh卻是未來,當然也不能完全取而代之,畢竟設計思路和側重點不同,是否遷移需要根據業務場景而定。
本文由博雲研究院原創發表,轉載請註明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923336/viewspace-2644984/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 螞蟻金服Service Mesh漸進式遷移方案
- 服務網格 Service Mesh
- 服務網格service mesh 之 Linkerd
- 從業務變遷到研發犯難,微服務在Spring Cloud的實踐之路微服務SpringCloud
- 為什麼要使用服務網格Service Mesh?
- Linkerd Service Mesh 服務配置檔案規範
- 為什麼我們需要服務網格Service mesh?
- 企業級服務網格架構之路解讀——Service Mesh在會話層解耦架構會話解耦
- 快速上手 Linkerd v2 Service Mesh(服務網格)
- 服務治理: Spring Cloud EurekaSpringCloud
- spring cloud (一)服務治理SpringCloud
- spring-cloud 服務治理SpringCloud
- spring cloud 服務搭建(1)SpringCloud
- 螞蟻金服 Service Mesh 深度實踐
- 螞蟻金服 Service Mesh 實踐探索
- 學習Spring Cloud與微服務之路三SpringCloud微服務
- Spring Cloud構建微服務架構-spring cloud服務監控中心SpringCloud微服務架構
- Spring Cloud雲服務架構 - common-service 專案構建過程SpringCloud架構
- 服務治理->搭建服務註冊中心: Spring Cloud EurSpringCloud
- Service Mesh大咖訪談:使用服務網格的微服務通訊與治理微服務
- Spring Cloud服務發現元件EurekaSpringCloud元件
- Emoji.voto,Linkerd 服務網格(service mesh)的示例應用程式
- 企業服務行業如何試水 Istio | Service Mesh Meetup 分享實錄行業
- CDH/HDP遷移之路
- 從網路接入層到 Service Mesh,螞蟻金服網路代理的演進之路
- Service Mesh模式起源模式
- (七)整合spring cloud雲服務架構 - common-service 專案構建過程SpringCloud架構
- Spring Cloud雲服務 - 企業雲架構common-service程式碼結構分析SpringCloud架構
- 整合spring cloud雲服務-HongHu雲架構common-service程式碼結構分析SpringCloud架構
- 一文了解 Nebula Graph DBaaS 服務——Nebula Graph Cloud ServiceCloud
- Spring Cloud Hystrix 服務容錯保護SpringCloud
- Spring Cloud Feign 宣告式服務呼叫SpringCloud
- Spring Cloud Hystrix:服務容錯保護SpringCloud
- spring cloud-之使用docker部署服務SpringCloudDocker
- 使用 Flomesh 強化 Spring Cloud 服務治理SpringCloud
- Spring Cloud Kubernetes服務發現SpringCloud
- 宣告式服務呼叫 Spring Cloud FeignSpringCloud
- Dubbo 3.0 前瞻:重塑 Spring Cloud 服務治理SpringCloud