前言:接上一篇istio應用部署及服務間呼叫,本文介紹通過構建.netcore與springboot簡單服務應用,實現服務間呼叫及相關路由控制等
1、.netcore程式碼介紹及應用部署
-
新建.netcore webapi服務專案,新增簡單服務呼叫方法(getStrByServiceName與getStrByIPAddress),返回預設字串方法getDetaultStr
-
通過我們前面文章《Azure 實踐(3)- Azure Devops構建.netcore專案,打包Docker映象+執行容器部署》,打包我們的服務應用,並構建映象推送到docker hub中,構建Tag為45的映象
-
建立netapp-1nodes.yaml檔案,構建應用netapp及k8s svc service對外提供服務訪問
-
建立名稱空間netistiodemo,並設定istio自動注入:
sudo kubectl create namespace netistiodemo sudo kubectl label namespace netistiodemo istio-injection=enabled sudo kubectl get ns netistiodemo --show-labels # 檢視注入狀態
-
建立應用(namespace:netistiodemo):
sudo kubectl apply -f netapp-1nodes.yaml -n netistiodemo
-
建立netapp-destination.yaml並建立DestinationRule
sudo kubectl apply -f netapp-destination.yaml -n netistiodemo
-
建立Gateway & VirtualService
sudo kubectl apply -f nettapp-vs-v1.yaml -n netistiodemo
-
GateWay設定的port埠為81,由於istio-ingressgateway的80埠,我們已經開放對應了springbootapp應用,所以我們要給istio-ingressgateway新增埠對映,對映到netapp應用上,我們可以通過rancher管理工具新增埠對映,當然你也可以通過編輯istio-ingressgateway的yaml檔案來新增埠對映
-
這樣,我們就通過多個gateway來訪問不同名稱空間的應用(k8s節點ip+埠31381)來訪問netapp;(k8s節點ip+埠31380)來訪問springbootapp
2、springboot程式碼介紹及應用部署
-
springboot服務專案,參考我以前的dubbo實踐程式碼,這裡只展示我們要用的簡單的webapi服務
-
部署應用參考前面兩篇文章,都是基於這個應用部署的,使用到2個版本;這裡省略部署步驟(名稱空間:springistiodemo)
3、springboot應用與.netcore服務應用呼叫介紹
-
我們可以通過netapp的方法(getStrByServiceName與getStrByIPAddress)來呼叫springbootapp的hello服務方法
-
我通過管理工具kiali的服務呼叫鏈路圖來展示服務呼叫關係;有藍色線的是情況1,純綠色先的是情況2
4、路由控制
-
配置1:修改springbootapp-vs-v1.yaml檔案,新增不同名稱空間的應用服務的配置,新增多個gateway
-
說明:
gateway:springbootapp-gateway為同namespace的gateway;netistiodemo/netapp-gateway為netistiodemo空間的gateway,格式【名稱空間】/【gateway名】 match:uri prefix字首匹配,將以/net/、/netcore/為字首的請求,對映到netapp服務上;請求規則支援exact(完全匹配),prefix(字首匹配)、regex(正則匹配)三種匹配方式 host:netapp-svc.netistiodemo.svc.cluster.local,指向namespace為netistiodemo的.netcore服務中,格式【service svc】+【名稱空間】+ 【預設:svc.cluster】 + 【叢集名稱】
-
路由結果(兩個gateway的監聽埠【31380&31381】均可訪問),並且不同的uri字首(/net/ 與/netcore/)都定位到了服務
-
配置2:路由直接匹配到應用服務具體的服務上(netapp應用的api/Query/getDetaultStr服務)
-
配置3:通過新增spring的字首,定位到本namespace的springbootapp應用上
-
配置4:如無路由匹配規則(無字首匹配),則直接定位到netcoreapp上
-
Istio virtual service檔案springbootapp-vs-v1.yaml詳情:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: springbootapp-v1 spec: hosts: - "*" gateways: - springbootapp-gateway - netistiodemo/netapp-gateway http: - fault: delay: fixedDelay: 1s percent: 100 match: - uri: prefix: /net/ - uri: prefix: /netcore/ rewrite: uri: / route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /netdefault rewrite: uri: /api/Query/getDetaultStr route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1 - match: - uri: exact: /redirect redirect: authority: springbootapp-svc uri: /hello - match: - uri: prefix: /spring rewrite: uri: / route: - destination: host: springbootapp-svc port: number: 8080 subset: v1 weight: 70 - destination: host: springbootapp-svc port: number: 8080 subset: v2 weight: 30 timeout: 5s - route: - destination: host: netapp-svc.netistiodemo.svc.cluster.local port: number: 8081 subset: v1
5、服務呼叫實踐
-
通過netapp的服務/api/Query/getStrByServiceName傳入服務名埠等資訊訪問springbootapp應用的hello服務;可以看到可以訪問到springbootapp的v1和v2版本服務
-
通過netapp的服務/api/Query/getStrByIPAddress傳入IP埠等資訊訪問springbootapp應用的hello服務;可以看到可以訪問到springbootapp的v1和v2版本服務
-
通過訪問springbootapp的svc對外訪問埠也可以實現服務呼叫,且遵循Istio流量規則