最近看到很多關(guān)于Service Mesh,Istio的文章,團(tuán)隊(duì)里面也有很多同學(xué)在學(xué)習(xí)應(yīng)用,我們拿Istio作為用例來談一下Service Mesh。必須說明一下,本質(zhì)和Spring Cloud能做的事情不沖突也差不多,但是由于Google力挺加上K8s的支持,Service Mesh也算是個(gè)不錯(cuò)的選擇,特別是針對(duì)cluster
本身Service Mesh是一種服務(wù)間的調(diào)用組織方式,凡是提及服務(wù),那么大家在微服務(wù)實(shí)現(xiàn)的時(shí)候?qū)W習(xí)到的服務(wù)發(fā)現(xiàn),熔斷機(jī)制,load balance,監(jiān)控,A/B測(cè)試,金絲雀發(fā)布,限流,端到端的安全認(rèn)證就都適用。
的確也看到過很多其他的框架,感覺Istio好理解,容易部署,也許這也是為啥我也花時(shí)間在上面的原因。
- 提供了針對(duì)gRPC,HTTP, gRPC, WebSocket甚至TCP的負(fù)載均衡.
- 細(xì)粒度的服務(wù)行為監(jiān)控,豐富的路由規(guī)則設(shè)置,重試的配置,自動(dòng)的failover
- 可插拔的定制化API設(shè)置,比如對(duì)ACL,限流的支持(比Zuul完善的多).
- 非常靈活的自動(dòng)化日志系統(tǒng),以及服務(wù)的跟蹤特別是在集群環(huán)境下的全鏈路的服務(wù)調(diào)用跟蹤(配置比Sleuth還簡(jiǎn)單)
- 完善的服務(wù)認(rèn)證及安全體系
在整個(gè)Istio里面提到兩個(gè)重要的概念,數(shù)據(jù)管理器和控制管理器。
-
數(shù)據(jù)流控制器包含了一組智能化代理,可以參考的就是(Envoy) 其實(shí)就是所謂的Sidecar,外掛模式(挎斗模式)這些服務(wù)代理像個(gè)Hub一樣管控協(xié)調(diào)服務(wù)之間的數(shù)據(jù)傳輸。
image
提到Sidecar一定記住這張圖,簡(jiǎn)單好理解。 -
控制管理器管控所有服務(wù)代理之間的路由方式image.png
Istio的幾大組件
1.Envoy
- 動(dòng)態(tài)的服務(wù)發(fā)現(xiàn)及注冊(cè)
- 負(fù)載均衡
- TLS 代理(SSL協(xié)議位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層: SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。
安全傳輸層協(xié)議(TLS)用于在兩個(gè)通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。該協(xié)議由兩層組成: TLS 記錄協(xié)議(TLS Record)和 TLS 握手協(xié)議(TLS Handshake)。較低的層為 TLS 記錄協(xié)議,位于某個(gè)可靠的傳輸協(xié)議(例如 TCP)上面,與具體的應(yīng)用無關(guān),所以,一般把TLS協(xié)議歸為傳輸層安全協(xié)議。
) - HTTP/2和gRPC代理的支持
- 斷路由
- 健康檢測(cè)
- 故障注入及各種數(shù)據(jù)dashboard展現(xiàn)
2.混合器
主要就是權(quán)限控制,并能夠用來收集Envoy里面的數(shù)據(jù)的,并且保證了Istio對(duì)不同的host環(huán)境和不同的infrastructure下的接口標(biāo)準(zhǔn)化。
-
Pivot,Citadel,Galley這些都是與發(fā)布,接口安全調(diào)用相關(guān)的組件:
其中Pivot的架構(gòu)如下圖,像極了Zuul+Eureka+Ribbon....:
image.png
這些組件讓Istio有豐富的,靈活的接口去管理API,管理服務(wù)之間的調(diào)用,管理終端到服務(wù)的調(diào)用。特別是,Istio管理不同的服務(wù)版本,讓他們共存在一個(gè)大環(huán)境中,的確算是個(gè)優(yōu)勢(shì)。
關(guān)于Traffic Management, 這張圖最贊

其實(shí)所謂的load balance一樣支持,輪訓(xùn)、隨機(jī)及權(quán)重分配。
我們可以看到Istio好多東西都是靠Envoy實(shí)現(xiàn)的,看看Envoy的配置,程序員同學(xué)更容易懂
"clusters": [
{
"name": "httpbin_service",
"connect_timeout_ms": 5000,
"type": "static",
"lb_type": "round_robin",
"hosts": [
{
"url": "tcp://172.17.0.2:8080"
},{
"url": "tcp://172.17.0.3:8080"
}
],
斷路由的配置:
"circuit_breakers": {
"default": {
"max_connections": 1,
"max_pending_requests": 1,
"max_retries": 3
}
負(fù)責(zé)監(jiān)測(cè)并觸發(fā)斷路器的配置:
"outlier_detection" : {
"consecutive_5xx": 1,
"max_ejection_percent": 100,
"interval_ms": 1000,
"base_ejection_time_ms": 60000
}
再來看看在K8s下的例子,就更加明白了,特別是關(guān)于API Server的配置

一定要耐心開完Bookinfo的例子,要有耐心,仔細(xì)看看各種yaml的配置,自然會(huì)懂。Istio更多關(guān)注了服務(wù)抽象層面的communication以及整體的框架,Spring cloud相對(duì)更細(xì)節(jié)化,由于基于Spring,對(duì)于Java程序員更容易理解。概念都一樣,只是血統(tǒng)不同。祝大家學(xué)習(xí)開心!


