項目介紹
Bookinfo是Istio官方提供的一個微服務風格的書店應用,作為實驗對象,用于演示Istio的各種特性。(顯然,在做Istio實驗前,還要自己先寫一個微服務應用,學習路徑就太不友好了。)
系統(tǒng)架構(gòu)
Bookinfo包含4個獨立的微服務:
- Ratings (評分服務)
- Details(詳情服務)
- Reviews (評論服務,依賴Ratings,同時提供評論和評分)
- Productpage(產(chǎn)品頁面,展示產(chǎn)品詳情,評論和評分)
其中Reviews有3個版本:
- v1只提供評論
- v2同時提供評論和評分,評分以黑色星星展現(xiàn)
- v3同時提供評論和評分,評分以紅色星星展現(xiàn)
依賴關(guān)系如下圖所示:

安裝步驟
istio的安裝包自帶了bookinfo的部署腳本,以下命令均在istio-1.2.0目錄下執(zhí)行。
- 對default namespace使用自動注入sidecar功能
kubectl label namespace default istio-injection=enabled
- 部署B(yǎng)ookinfo
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
部署內(nèi)容包括4個service,以及6個deployment(Reviews每個版本各有一個deployment)
檢查service和pod狀態(tài),確認啟動成功。
嘗試在ratings pod中調(diào)用productpage,確認應用運行正常。
kubectl exec -it \
$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') \
-c ratings \
-- curl productpage:9080/productpage | grep -o "<title>.*</title>"
預期輸出為<title>Simple Bookstore App</title>
源碼分析
對Bookinfo的源碼分析,主要關(guān)注點在于,開發(fā)人員需要做什么特定的調(diào)整,才可以把應用部署到Istio,并自動獲得Istio的各種特性。
- 部署腳本
部署腳本即samples/bookinfo/platform/kube/bookinfo.yaml,可以看到里面定義的均為標準Kubernetes Deployment和Service對象,并不需要為Istio做特殊定制(前提是為當前namespace啟動了sidecar自動注入)。
- 服務間通訊
Bookinfo的服務間通過HTTP通訊。以Reviews調(diào)用Ratings為例,Reviews通過GET ratings(.default.svc.cluster.local):9080/ratings/{productId}訪問Ratings,得到某個特定產(chǎn)品的評分。
其中domain部分通過環(huán)境變量SERVICE_DOMAIN傳入(若為空,則認為與調(diào)用者在同一namespace下)。
這就是kubernetes服務發(fā)現(xiàn)的方式,在代碼層面,并不需要為Istio做額外的事情。
- Tracing
在4個微服務中能發(fā)現(xiàn)類似的代碼:
從訪問本服務的HTTP Request中獲得以下header,如果需要調(diào)用其他服務,那么在請求中,也把這些header加上。
incomming_headers = [
'x-request-id',
'x-b3-traceid',
'x-b3-spanid',
'x-b3-parentspanid',
'x-b3-sampled',
'x-b3-flags',
'x-ot-span-context'
]
request = Net::HTTP::Get.new(uri.request_uri)
incomming_headers.each { |header, value| request[header] = value }
response = http.request(request)
這是為了對接OpenTracing,是屬于需要特殊的部分(但這部分特定代碼是為了使用OpenTracing,不管是否部署到Istio,如果服務需要通過OpenTracing監(jiān)控,那么這部分代碼就必須實現(xiàn))。
結(jié)論,開發(fā)人員并不需要為對接Istio做特殊的定制開發(fā),Istio確實做到了它的目標,提供強大的服務治理功能的同時,對應用開發(fā)人員透明。