最近被 react 虐得不行,想來(lái)點(diǎn)清真的。正好前幾個(gè)月參加阿里 RocketMQ 深圳技術(shù)講座,接觸到一個(gè)新詞:云原生應(yīng)用 ( Cloud Native Application )。而最近自己也在研究 Service Mesh,索性記錄一下自己的進(jìn)展。
之前大家一直說(shuō)微服務(wù),首當(dāng)其沖的微服務(wù)框架便是 Spring Cloud,之前一直用 Spring Boot,沒(méi)有太多用 Spring Cloud,課程倒是看了不少。之所以沒(méi)有用上它,一方面由于歷史原因,大多數(shù)項(xiàng)目用的基本都是 Dubbo(Dubbox) RPC 框架。很多項(xiàng)目想嘗試,后來(lái)又覺(jué)得改動(dòng)太大,用 Spring Boot 已經(jīng)是很不錯(cuò)的進(jìn)步了。
Spring Cloud功能上來(lái)說(shuō)是很強(qiáng)大,至少比 Dubbo功能豐富,涵蓋了服務(wù)發(fā)現(xiàn),服務(wù)治理,熔斷器,日志跟蹤,負(fù)載均衡等,但是如果真的要使用,大家是不是還要考慮 REST 性能與 RPC 的比較,以及 Spring Config 的配置管理是否適用現(xiàn)有項(xiàng)目等各種實(shí)際問(wèn)題,總感覺(jué)水土不服。
Spring Cloud 和 Dubbo 都屬于侵入型微服務(wù)框架,所以選型很重要,一旦用了就很難去改變。之前想把 Dubbo 改成 Spring Cloud ,后來(lái)發(fā)現(xiàn)那個(gè)代價(jià)不是一般高,服務(wù)還不能灰度上線。突然想起之前直接用 Protobuf+Netty 做推送,然后看了Dubbox 的代碼,底層是 Netty+Kryo,其實(shí)和我們之前做的差不多。
既然要說(shuō)Service Mesh,鋪墊也差不多了。Service mesh 譯作 ”服務(wù)網(wǎng)格“,作為服務(wù)間通信的基礎(chǔ)設(shè)施層。對(duì)比上述框架來(lái)說(shuō),是一種非侵入性框架或者基礎(chǔ)架構(gòu)。也就意味著微服務(wù)的那些東西就不用和業(yè)務(wù)代碼湊在一起,業(yè)務(wù)不用再去關(guān)心該用什么去做服務(wù)發(fā)現(xiàn),無(wú)論是自己用 zookeeper 實(shí)現(xiàn)一個(gè)簡(jiǎn)單服務(wù)發(fā)現(xiàn),還是用 etcd 來(lái)實(shí)現(xiàn),其實(shí)都是在增加業(yè)務(wù)代碼的復(fù)雜度。Service Mesh就不再重蹈覆轍,上述能力被下放到基礎(chǔ)架構(gòu)中,就像一個(gè)操作系統(tǒng)天生就可以完成網(wǎng)絡(luò)通訊一樣。
Service Mesh有以下特點(diǎn):
- 將服務(wù)發(fā)現(xiàn),重試/超時(shí),監(jiān)控,追蹤等下放到底層基礎(chǔ)架構(gòu)中。
- 對(duì)應(yīng)用程序透明,非侵入性
- 作為應(yīng)用間的透明網(wǎng)絡(luò)代理
目前比較流行的 Service Mesh 框架有 Istio 和 Linkerd,都可以和 K8S 進(jìn)行集成。
下面我們就來(lái)實(shí)踐一下Istio。
首先安裝 k8s ,如果覺(jué)得比較麻煩就直接安裝minikube(推薦),之后開(kāi)始安裝 istio,前方注意和諧上網(wǎng)。
curl -L https://git.io/getLatestIstio | sh -
然后添加到環(huán)境變量中
cd istio-0.x
export PATH=$PWD/bin:$PATH
前幾天還是0.5,現(xiàn)在已經(jīng)是0.6,更新還是比較迅速的。
下面就增長(zhǎng)開(kāi)始安裝:
~ kubectl apply -f install/kubernetes/istio.yaml
安裝成功之后確認(rèn)一下:
~ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-ca-97bddb669-b7xrx 1/1 Running 4 11d
istio-ingress-777786fbcd-tvtdf 1/1 Running 8 11d
istio-mixer-c976b8854-m4nqg 3/3 Running 12 11d
istio-pilot-776bb8cb7f-7h95b 2/2 Running 8 11d
istio就安裝成功了,下面來(lái)安裝bookinfo官方示例。
~ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo.yaml)
確認(rèn)一下:
~ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-56cf65ddc7-vz4pr 2/2 Running 12 11d
productpage-v1-b64876bc7-gfp9p 2/2 Running 12 11d
ratings-v1-cccf67989-mjb95 2/2 Running 12 11d
reviews-v1-846fd9c945-8xmqg 2/2 Running 12 11d
reviews-v2-74f5547679-bj6zv 2/2 Running 12 11d
reviews-v3-8d889d8d5-lqc27 2/2 Running 12 11d
下面獲取網(wǎng)關(guān)地址,這里不同的安裝方式獲取地址的方式是不一樣的,這里只演示 minikube。
~ export GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')
~ echo $GATEWAY_URL
192.168.99.100:32705
然后在瀏覽器中訪問(wèn) http://192.168.99.100:32705/productpage 就可以看到 BookInfo 主界面。
istio 有 Intelligent Route,下面也來(lái)體驗(yàn)一下:
先查看一下路由信息
~ istioctl get routerules -o yaml
No resources found.
導(dǎo)入 v1路由信息
~/Downloads/istio-0.5.0 istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml
Created config route-rule/default/productpage-default at revision 62564
Created config route-rule/default/reviews-default at revision 62565
Created config route-rule/default/ratings-default at revision 62566
Created config route-rule/default/details-default at revision 62567
~/Downloads/istio-0.5.0 istioctl get routerules -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
creationTimestamp: null
name: details-default
namespace: default
resourceVersion: "62567"
spec:
destination:
name: details
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
creationTimestamp: null
name: productpage-default
namespace: default
resourceVersion: "62564"
spec:
destination:
name: productpage
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
creationTimestamp: null
name: ratings-default
namespace: default
resourceVersion: "62566"
spec:
destination:
name: ratings
precedence: 1
route:
- labels:
version: v1
---
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
creationTimestamp: null
name: reviews-default
namespace: default
resourceVersion: "62565"
spec:
destination:
name: reviews
precedence: 1
route:
- labels:
version: v1
---
網(wǎng)頁(yè)上顯示為Book Reviews
下面我們替換為 v2路由
~/Downloads/istio-0.5.0 istioctl create -f samples/bookinfo/kube/route-rule-reviews-test-v2.yaml
Created config route-rule/default/reviews-test-v2 at revision 62803
~/Downloads/istio-0.5.0 istioctl get routerule reviews-test-v2 -o yaml
apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
creationTimestamp: null
name: reviews-test-v2
namespace: default
resourceVersion: "62803"
spec:
destination:
name: reviews
match:
request:
headers:
cookie:
regex: ^(.*?;)?(user=jason)(;.*)?$
precedence: 2
route:
- labels:
version: v2
---
然后登錄jason賬戶,密碼隨意,發(fā)現(xiàn)比 v1多了五星評(píng)價(jià)功能,這不就是 ABTest嗎,還是比較 6 的。
其他功能就不再演示了,主要有下面這些,官網(wǎng)都有:
之后打算用一下這個(gè)試一下,感覺(jué)還不錯(cuò)的樣子,最后 友情提示一下官方推薦用 Google Kubernetes Engine,但是最好還是本地弄,反正我試了幾次都是有問(wèn)題的,可能是 RP 問(wèn)題。
對(duì)了,還有新開(kāi)的博客地址:http://www.couldme.com。哈哈。