Dubbo on x-protocol——SOFAMesh中的x-protocol示例演示

本文做者:彭澤文,阿里巴巴UC事業部高級開發工程師html

原文地址:www.servicemesher.com/blog/dubbo-…git

sofamesh x-protocol dubbo

X-protocol 的定位是雲原生、高性能、低侵入性的通用 Service Mesh 落地方案,依託 Kubernetes 基座,利用其原生的服務註冊和服務發現機制,支持各類私有 RPC 協議低成本、易擴展的接入,快速享受 Service Mesh 所帶來的紅利。github

本文將以 Dubbo 爲例,演示 Dubbo on x-protocol 場景下 Service Mesh 路由功能,涵蓋 Version route 、Weighted route 功能。shell

關於 x-protocol 的介紹請參考 螞蟻金服開源的 SOFAMesh 的通用協議擴展解析apache

前期準備

  1. 安裝 Minikube,推薦使用 Minikube v0.28 以上來體驗,請參考 github.com/kubernetes/…
  2. 安裝 kubectl 命令行工具,請參考 kubernetes.io/docs/tasks/…
  3. 安裝 VM Driver,推薦安裝 Virtual Box、Mac 用戶也能夠選擇 hyperkit
  4. 瞭解 Istio Traffic Management 相關概念,相關連接:istio.io/zh/docs/tas…

部署

先看部署效果圖:api

Mosn x-protocol部署圖.png | left | 747x382

本示例中dubbo-consumer的部署方式採用直連模式,即不走註冊中心,徹底依託kubernetes平臺提供的服務註冊及服務發現能力。bash

1. 安裝 Kubernetes

安裝 kubectl 命令行工具 推薦使用 Kubernetes 1.10 版本,並使用合適的 VM Driver,推薦使用默認的 VirtualBox。微信

minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
    --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
    --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key"
複製代碼

Mac OSX 用戶使用的 hyperkit 須要特別指定:app

minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
    --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
    --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
    --vm-dirver=hyperkit
複製代碼

等待 Kubernetes 啓動完畢,經過 kubectl 命令檢查curl

kubectl get pods --namespace=kube-system
複製代碼

2. 部署 SOFAMesh

本示例演示從源代碼的 master 分支直接安裝最新的 SOFAMesh,安裝過程使用 Helm 完成。

從 GitHub 拉取最新代碼:

git clone https://github.com/alipay/sofa-mesh.git
cd sofa-mesh
複製代碼

建立 SOFAMesh 須要的 CRD:

kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
複製代碼

使用 Helm 安裝 SOFAMesh:

kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
helm init --service-account tiller
helm install install/kubernetes/helm/istio --name istio --namespace istio-system
複製代碼

安裝 istioctl 命令行工具:

# 使用 make 工具安裝 istioctl
make istioctl-install
複製代碼

3. 建立示例的命名空間

如下示例都將運行在 e2e-dubbo 命名空間下,如無 e2e-dubbo 命名空間,需先建立該命名空間:

kubectl apply -f samples/e2e-dubbo/platform/kube/e2e-dubbo-ns.yaml
複製代碼

4. 注入 SOFAMosn

部署 dubbo-consumer 和 dubbo-provider,部署前須要先使用 istioctl 進行 sidecar 注入,如下示例採用手動注入方式,也能夠經過 istio namespace inject 功能來自動注入。

# mosn sidecar inject and deploy
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-consumer.yaml)
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v1.yaml)
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v2.yaml)
複製代碼

5. 部署示例應用

部署 dubbo consumer service 及 dubbo provider service。

# http service for dubbo consumer
kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-consumer-service.yaml

# dubbo provider service
kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-provider-service.yaml
複製代碼

檢查部署狀態:

#kubectl get pods -n e2e-dubbo
NAME                                     READY     STATUS    RESTARTS   AGE
e2e-dubbo-consumer-589d8c465d-cp7cx      2/2       Running   0          13s
e2e-dubbo-provider-v1-649d7cff94-52gfd   2/2       Running   0          13s
e2e-dubbo-provider-v2-5f7d5ff648-m6c45   2/2       Running   0          13s

#kubectl get svc -n e2e-dubbo 
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
e2e-dubbo-consumer   ClusterIP   192.168.1.7     <none>        8080/TCP    10s
e2e-dubbo-provider   ClusterIP   192.168.1.62    <none>        12345/TCP   10s
複製代碼

e2e-dubbo-consumer 是一個 Dubbo 客戶端應用,它暴露了一個 8080 端口的 HTTP 服務,方便咱們進行驗證,e2e-dubbo-provider 是一個 Dubbo 應用。 當 e2e-dubbo-consumer 經過 12345 端口調用 e2e-dubbo-provider 時,流量會被 IPtable 規則攔截,導流給 SOFAMosn。

驗證路由能力

本示例將驗證 Version route 和 Weighted route 能力。

1. 驗證 Version Route 能力

本例將演示控制 dubbo-consumer的全部請求指向 dubo-provider-v1 配置DestinationRule:

istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
複製代碼

dubbo-consumer.destinationrule.yaml 內容以下:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 name: e2e-dubbo-provider
 namespace: e2e-dubbo
spec:
 host: e2e-dubbo-provider
 subsets:
 - name: v1
 labels:
 ver: v1
 - name: v2
 labels:
 ver: v2 
複製代碼

配置VirtualService:

istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml
複製代碼

dubbo-consumer.version.vs.yaml 內容以下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: e2e-dubbo-provider
 namespace: e2e-dubbo
spec:
 hosts:
 - e2e-dubbo-provider
 http:
 - route:
 - destination:
 host: e2e-dubbo-provider
 subset: v1
複製代碼

路由策略已經生效,能夠 http 請求 dubbo consumer 來觸發 rpc 請求觀察效果,因爲使用 Minikube 的關係,須要啓動一個 Pod 用來測試

# 啓動一個 busybox Pod 並登錄
kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never
# 使用 e2e-dubbo-consumer 的域名訪問服務
curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn
複製代碼

清理路由策略:

istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml
複製代碼

退出 Minikube shell

2. 驗證 Weight Route 能力

本例將演示控制 dubbo-consumer 的請求指向 dubo-provider-v1,dubo-provider-v2。並控制流量分配比例爲 v1:20%,v2:80%。

配置DestinationRule:

# 若是在上一示例中已經建立好了,請跳過這一步
istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
複製代碼

dubbo-consumer.destinationrule.yaml 內容以下:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 name: e2e-dubbo-provider
 namespace: e2e-dubbo
spec:
 host: e2e-dubbo-provider
 subsets:
 - name: v1
 labels:
 ver: v1
 - name: v2
 labels:
 ver: v2 
複製代碼

配置 VirtualService:

istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml
複製代碼

dubbo-consumer.weight.vs.yaml 內容以下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: e2e-dubbo-provider
 namespace: e2e-dubbo
spec:
 hosts:
 - e2e-dubbo-provider
 http:
 - route:
 - destination:
 host: e2e-dubbo-provider
 subset: v1
 weight: 20
 - destination:
 host: e2e-dubbo-provider
 subset: v2
 weight: 80
複製代碼

路由策略已經生效,能夠 http 請求 dubbo consumer 來觸發 rpc 請求觀察效果:

# 啓動一個 busybox Pod 並登錄
kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never
# 使用 e2e-dubbo-consumer 的域名訪問服務
curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn
複製代碼

清理路由策略:

istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml
複製代碼

更多功能,敬請期待。

SOFAMesh Github 地址:github.com/alipay/sofa…

參考文檔

SOFAStack

關於SOFAMesh的更多信息請訪問 www.sofastack.tech

ServiceMesher社區信息

微信羣:聯繫我入羣

社區官網:www.servicemesher.com

Slack:servicemesher.slack.com 須要邀請才能加入

Twitter: twitter.com/servicemesh…

GitHub:github.com/

更多Service Mesh諮詢請掃碼關注微信公衆號ServiceMesher。

相關文章
相關標籤/搜索