深度分析:Istio替代Spring Cloud的合理性

分佈式計算 設計 YAML 通信 開發者公眾號大全 2019-05-13

一、現有微服務架構

微服務本質上是分佈式架構、分佈式應用、分佈式計算。

分佈式計算可以帶來的好處有:性能、可靠性、彈性、可擴展性、可用性、穩健性。

而從應用開發者角度看,使用微服務架構必須考慮:斷路、服務發現、

客戶端負載平衡等組件。也就是說,開發人員需要在應用邏輯中考慮太多的PaaS基礎設計相關的內容,所以他們很煩。。。:

深度分析:Istio替代Spring Cloud的合理性

現有主流的微服務架構是這樣的:

深度分析:Istio替代Spring Cloud的合理性

也就是說,通過各種組件拼湊而成,當然,通過現有的模式,搭建實驗環境,做Demo展示是完全沒問題的,例如此前我做的實驗,通過Spring Cloud搭建一個電商:

深度分析:Istio替代Spring Cloud的合理性

深度分析:Istio替代Spring Cloud的合理性

但老實說,代碼比較複雜:

深度分析:Istio替代Spring Cloud的合理性

而且這還只是一個實驗,如果真的大規模上生產,我相信現有Spring Cloud的複雜度還是非常高的。所以有的客戶,只使用了Spring Cloud的某幾個組件,而非整套上,這其實是比較明智的。

而架構複雜的原因是:現有微服務模式,需要應用開發人員過多地考慮PaaS基礎架構!


二、新一代微服務架構

Istio是新一代微服務架構,這個觀點我在去年的文章中已經介紹過了。今天我們看一下這種架構的優勢。這個架構的核心觀點,就是提供一種:儘量減少開發人員處理其應用程序分佈式特性的要求的微服務架構。

如果說目前的微服務架構,只針整個PaaS的第七層,因此開發人員非常累,需要考慮的點很多。而Istio,面向的是PaaS的4-6層。這樣,開發人員只需要關注大麥本身即可。

深度分析:Istio替代Spring Cloud的合理性

Istio的架構圖如下:

深度分析:Istio替代Spring Cloud的合理性

Istio分為數據平面和控制平面。

Istio的管理平面有三個核心組件:

Pilot:負責流量管理髮現

Mixer負責:訪問控制、策略管理、信息收集

Auth:負責認證

Istio的數據平面創建了一個跨平臺的服務網格來解決常見的微服務架構問題,如其中包括很多:通信,負載平衡,流量路由,指標,配額,身份驗證,速率限制,斷路器,超時,自動重試,等等。Istio的數據平面採取sidecars的方式,也就是在一個pod的主容器旁邊,增加一個istio的proxy。

深度分析:Istio替代Spring Cloud的合理性

我看看一下,在istio模式下,容器的通訊方式。例如Service和ServiceB。ServiceA和ServiceB分別屬於兩個pod。

深度分析:Istio替代Spring Cloud的合理性

我們再看得細一些:

深度分析:Istio替代Spring Cloud的合理性

我們查看一個調用istio的應用:

深度分析:Istio替代Spring Cloud的合理性

這個pod有兩個容器,一個是主應用bookinfo-productpage,一個是istio/proxy。

深度分析:Istio替代Spring Cloud的合理性

我們看一下我們如何可以利用Pilot規則控制應用,策略一共有三個:

DestinationPolicy:

●Client-side load-balancing, circuit-breaking

這個策略主要負責應用之間的負載均衡、熔斷。

我們看一個設置策略的例子:裡面設置了http最大請求連接數等。超出閾值,會觸發熔斷。

深度分析:Istio替代Spring Cloud的合理性

EgressRule

●Enable whitelist access to external (HTTP/S) services

●External access is off by default in Istio

這個策略控制應用訪問外部網絡,設置白名單的策略。默認是不能訪問外部網絡的。

RouteRule

●Timeouts, retries, fault injection, http rewriting and redirection

這策略主要設置應用之間通信的路由策略,屬於Ingress策略。

我們看一個使用例子,在應用的yaml文件中定義Ingress resource策略:

深度分析:Istio替代Spring Cloud的合理性

三、實驗驗證Istio

使用OCP3.7的環境。先創建項目:

oc new-project istio-system

增加SA權限:

oc adm policy add-scc-to-user anyuid -z istio-ingress-service-account -n istio-system oc adm policy add-scc-to-user anyuid -z istio-grafana-service-account -n istio-system oc adm policy add-scc-to-user anyuid -z istio-prometheus-service-account -n istio-system

oc adm policy add-scc-to-user privileged -z default -n bookinfo

下載istio的包:

curl -L https://git.io/getLatestIstio | sh -

cd istio-0.5.0

export PATH=$PWD/bin:$PATH

安裝istio:

kubectl apply -f install/kubernetes/istio.yaml

查看部署的相關istio組件:

深度分析:Istio替代Spring Cloud的合理性

截至到目前,istio相關的內容就配好了:

接下來,部署一個應用調用istio,應用的名稱叫bookinfo,就是定票信息網站。

這個應用也是一套微服務,有產品描述、評論、評級、詳細信息。

深度分析:Istio替代Spring Cloud的合理性

不是應用使用一個yaml:samples/bookinfo/kube/bookinfo.yaml,我們看一下這個yaml的主要內容:

我們看一下文件中對詳細信息服務的定義:

深度分析:Istio替代Spring Cloud的合理性

查看評級服務的定義:

深度分析:Istio替代Spring Cloud的合理性

評論服務:

深度分析:Istio替代Spring Cloud的合理性

深度分析:Istio替代Spring Cloud的合理性

查看產品定義:

深度分析:Istio替代Spring Cloud的合理性

yaml文件的最後部分,是調用istio ingress策略的描述:

深度分析:Istio替代Spring Cloud的合理性

所以,在istio模式下,對於開發人員而言,不用再過多考慮PaaS基礎架構層面的東西。

通過yaml文件部署微服務:

oc adm policy add-scc-to-user privileged -z default -n bookinfo

深度分析:Istio替代Spring Cloud的合理性

配置route:

oc expose svcproductpage --name=productpage --path=/productpage--hostname=productpage-bookinfo.example.com

oc expose svc productpage --name=productpage-login --path=/login--hostname=productpage-bookinfo.example.com

接下來,設置ingress路徑:

oc get routes productpage -o jsonpath='{.spec.host}'

把Gateway的URL設置成productpage-istio-system.apps.example.com

深度分析:Istio替代Spring Cloud的合理性

通過瀏覽器訪問應用:

深度分析:Istio替代Spring Cloud的合理性

訪問normal user,可以看到用戶是json,顯示的信息是莎士比亞的作品“錯誤喜劇”的票據信息,包括預定信息、話劇評論等。

深度分析:Istio替代Spring Cloud的合理性

接下來,我們展示如何在線更換路由策略。我們更換的路由策略,實際上就是微服務之間相互調用的策略。

深度分析:Istio替代Spring Cloud的合理性

在這個實驗中,有多個routes相關的yaml文件。

深度分析:Istio替代Spring Cloud的合理性

在沒有路由的情況下,頁面展示如下(將已有路由刪除),裡面沒有評論相關內容,因為微服務之前的路由被刪除了:

深度分析:Istio替代Spring Cloud的合理性

創建並使用V1版本的路由:

深度分析:Istio替代Spring Cloud的合理性

瀏覽器訪問頁面如下(已經出現了評論,但沒有出現rating):

深度分析:Istio替代Spring Cloud的合理性

創建V3版本的路由:然後將路由在線替換到V3:

深度分析:Istio替代Spring Cloud的合理性

重新訪問頁面(已經可以看到rating的信息):

深度分析:Istio替代Spring Cloud的合理性

同樣,我們可以設置在多個版本路由之間的訪問比率:

深度分析:Istio替代Spring Cloud的合理性

然後我們訪問頁面,在線點擊頁面刷新:

深度分析:Istio替代Spring Cloud的合理性

刷新一次:

深度分析:Istio替代Spring Cloud的合理性

再刷新一次(頁面回來了):

深度分析:Istio替代Spring Cloud的合理性

也就是說,我們可以通過簡單的替換路由的方式,改變微服務之間的調用關係。

在Istio中,我們可以部署prometheus、Metrics、Tracing,這些都是istio的addson:

深度分析:Istio替代Spring Cloud的合理性

oc apply -f prometheus.yaml

oc expose svc prometheus

oc apply -n istio-system -fhttps://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml

oc expose -nistio-system deployment jaeger-deployment --name=jaeger --port=16686

oc expose svc jaeger

深度分析:Istio替代Spring Cloud的合理性

深度分析:Istio替代Spring Cloud的合理性

查看產品定義:

深度分析:Istio替代Spring Cloud的合理性

yaml文件的最後部分,是調用istio ingress策略的描述:

深度分析:Istio替代Spring Cloud的合理性

所以,在istio模式下,對於開發人員而言,不用再過多考慮PaaS基礎架構層面的東西。

通過yaml文件部署微服務:

oc adm policy add-scc-to-user privileged -z default -n bookinfo

深度分析:Istio替代Spring Cloud的合理性

配置route:

oc expose svcproductpage --name=productpage --path=/productpage--hostname=productpage-bookinfo.example.com

oc expose svc productpage --name=productpage-login --path=/login--hostname=productpage-bookinfo.example.com

接下來,設置ingress路徑:

oc get routes productpage -o jsonpath='{.spec.host}'

把Gateway的URL設置成productpage-istio-system.apps.example.com

深度分析:Istio替代Spring Cloud的合理性

通過瀏覽器訪問應用:

深度分析:Istio替代Spring Cloud的合理性

訪問normal user,可以看到用戶是json,顯示的信息是莎士比亞的作品“錯誤喜劇”的票據信息,包括預定信息、話劇評論等。

深度分析:Istio替代Spring Cloud的合理性

接下來,我們展示如何在線更換路由策略。我們更換的路由策略,實際上就是微服務之間相互調用的策略。

深度分析:Istio替代Spring Cloud的合理性

在這個實驗中,有多個routes相關的yaml文件。

深度分析:Istio替代Spring Cloud的合理性

在沒有路由的情況下,頁面展示如下(將已有路由刪除),裡面沒有評論相關內容,因為微服務之前的路由被刪除了:

深度分析:Istio替代Spring Cloud的合理性

創建並使用V1版本的路由:

深度分析:Istio替代Spring Cloud的合理性

瀏覽器訪問頁面如下(已經出現了評論,但沒有出現rating):

深度分析:Istio替代Spring Cloud的合理性

創建V3版本的路由:然後將路由在線替換到V3:

深度分析:Istio替代Spring Cloud的合理性

重新訪問頁面(已經可以看到rating的信息):

深度分析:Istio替代Spring Cloud的合理性

同樣,我們可以設置在多個版本路由之間的訪問比率:

深度分析:Istio替代Spring Cloud的合理性

然後我們訪問頁面,在線點擊頁面刷新:

深度分析:Istio替代Spring Cloud的合理性

刷新一次:

深度分析:Istio替代Spring Cloud的合理性

再刷新一次(頁面回來了):

深度分析:Istio替代Spring Cloud的合理性

也就是說,我們可以通過簡單的替換路由的方式,改變微服務之間的調用關係。

在Istio中,我們可以部署prometheus、Metrics、Tracing,這些都是istio的addson:

深度分析:Istio替代Spring Cloud的合理性

oc apply -f prometheus.yaml

oc expose svc prometheus

oc apply -n istio-system -fhttps://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml

oc expose -nistio-system deployment jaeger-deployment --name=jaeger --port=16686

oc expose svc jaeger

深度分析:Istio替代Spring Cloud的合理性

然後可以看到豐富的頁面:

深度分析:Istio替代Spring Cloud的合理性

深度分析:Istio替代Spring Cloud的合理性

相關推薦

推薦中...