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

ServiceMesher發表於2018-09-12

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

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

sofamesh x-protocol dubbo

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

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

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

前期準備

  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…

部署

先看部署效果圖:

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

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

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 需要特別指定:

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 命令檢查

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。

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


相關文章