通過 Dapr 實現一個簡單的基於 dotnet 的微服務電商系統——一步一步教你如何擼 Dapr

前兩章通過 Dapr 實現一個簡單的基於. net 的微服務電商系統 和通過 Dapr 實現一個簡單的基於. net 的微服務電商系統 (二)——通訊框架講解 介紹了一下 Demo 本身和 Dapr 相關以及框架相關的某些設計上的內容。今天我們來講講如何從零開始如何一步一步在 k8s 環境裏搭建起 dapr 環境以及跑一個最基礎的服務間相互調用的 Demo

  基本準備:

    window10 操作系統

    Visual studio 2019(.net 環境 5.0 需提前安裝)

  環境安裝:****

    1、首先我們需要安裝 docker、在 windows10 操作系統下,docker 提供了社區桌面版本可供我們選擇

    2、這個時候我們的 docker 應該可以通過 ss 拉取牆外的 k8s 基礎鏡像了,這個時候再次打開 docker settings, 選擇 kubernetes,勾選 Enable kubernetes 並等待 docker 安裝 k8s,這個過程耗時較長 (翻牆軟件給力一般 3-5 分鐘即可完成基礎鏡像拉取和環境啓動)。

    3、安裝完畢後 doker 會提示重啓,完成後打開 power shell 鍵入 kubectl get node, 可以看到一臺名字叫 docker-desktop 的 master 已經處於 ready 狀態,即證明 k8s 環境安裝完畢。

     4、dapr 有兩種模式安裝,一種是使用 dapr 的 cli 工具安裝,一種是基於 helm 安裝。鑑於有可能很多同學對 k8s 都不熟悉,這裏我們簡單介紹一下稍微簡單一點的基於 cli 工具如何安裝 dapr。

      首先我們登錄 github 上 dapr 的 repo, 選擇最新版本的 dapr 並下載 windows 平臺版本 daprd_windows_amd64.zip。然後我們將壓縮包解壓後放到任意目錄 (父級目錄不要帶中文或者空格),在環境變量中配置一下 path。打開 powershell 輸入 dapr --version 看看能否打印出來版本,如果打印成功則表示 cli 安裝已經完成

       接下來我們需要輸入 dapr init -k。等 dapr 初始化完畢後,我們可以通過 kubectl get po -n dapr-system 或者 dapr status -k 查看 dapr 控制平面的狀況,即可確定 dapr 已經成功部署到 k8s 環境

  徒手擼 demo:****

    首先我們打開 visual studio, 創建一個空白解決方案並創建兩個空白控制檯程序以及一個 RPC 公共類庫同時引入以下包和項目依賴

    接下來要做的是我們爲每一個控制檯程序構造一個通用主機並注入 Oxygen web 代理(由於該演示 demo 採用 eshopsample 的方式通過 oxygen 這個框架構建應用,大家也可以自行通過創建 webapi 控制器的方式來創建服務)

    接下來我們在 RpcInterface 創建一個接口用於在客戶端發起 RPC 請求。它包含兩個方法一個有參一個無參,其中 RemoteService 註解稍微解釋一下,所有需要其他服務暴露的接口均需要註解 RemoteService,該註解包含三個參數, 其中第一個參數代表其所對應的應用容器在 dapr 中註冊的服務名 (稍後創建 yaml 時會看到), 第二個參數代表當前該接口的主 router,第三個參數爲接口註釋可不填,每一個需要暴露到集羣內的方法也需要添加一個 RemoteFunc 註解。該註解支持兩種類型的服務謂詞,默認是 RPC 服務 [RemoteFunc] = [RemoteFunc(FuncType.Invoke)],後續文章會講另一個謂詞 actor 這裏不展開。

    同時我們需要在 ServiceSample 項目裏實現這個接口並在 ConfigureContainer 段中將該接口及其實現注入到 IOC 容器

    然後由於客戶端要發起調用,所以我們需要在客戶端也創建一個接口和服務同時在這個服務內部注入代理工廠創建對 IHelloService 的代理,方便外部客戶端 (postman) 調用

     調用拓撲如下:

    好了,業務層面的代碼就全部完成了,剩下就是對已有的代碼進行 docker 打包並編排到 k8s 下注入 dapr sidecar 後觀察服務間調用是否成功了

    首先我們在根目錄創建 Dockerfile,打包採用標準的二階段構造這裏就不再贅述,最好是提前將 mcr.microsoft.com/dotnet/sdk:5.0 以及 mcr.microsoft.com/dotnet/aspnet:5.0 兩個鏡像拉取準備好,否則打包階段可能會比較長。

FROM mcr.microsoft.com/dotnet/sdk:5.0 as svcbuild
WORKDIR /src
copy . .
RUN dotnet build -c Release DaprSample.sln
FROM mcr.microsoft.com/dotnet/aspnet:5.0 as clientsample
WORKDIR /app
COPY --from=svcbuild /src/ClientSample/bin/Release/net5.0 /app
ENTRYPOINT ["dotnet", "ClientSample.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:5.0 as servicesample
WORKDIR /app
COPY --from=svcbuild /src/ServiceSample/bin/Release/net5.0 /app
ENTRYPOINT ["dotnet", "ServiceSample.dll"]

    接着在根目錄打開 powershell 輸入

    docker build . -t clientsample:release --target clientsample --no-cache

    docker build . -t servicesample:release --target servicesample --no-cache

    之後我們需要創建一個 yaml 文件將我們的兩個應用部署到 k8s:

    tips1: dapr 服務間調用無需創建 k8s Service 資源,這裏我僅僅是爲了方便 postman 發起對 clientsample 的調用才創建了一個 NodePort Service。

    tips2: dapr 註解的服務名必須和 RPC 接口 RemoteService 上註解的服務名一致。否則可能導致客戶端發起調用找不到對應的服務。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: clientsample
  labels:
    app: clientsample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: clientsample
  template:
    metadata:
      labels:
        app: clientsample
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "clientsample"
        dapr.io/app-port: "80"
    spec:
      containers:
        - name: web
          image: clientsample:release
          imagePullPolicy: Never
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: clientsample
spec:
  type: NodePort
  selector:
    app: clientsample
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: servicesample
  labels:
    app: servicesample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: servicesample
  template:
    metadata:
      labels:
        app: servicesample
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "servicesample"
        dapr.io/app-port: "80"
    spec:
      containers:
        - name: web
          image: servicesample:release
          imagePullPolicy: Never
          ports:
            - containerPort: 80

    現在我們 apply 它:kubectl apply -f xx.yaml

    然後通過 kubectl get po 能看到我們的 pod 已經被注入了 sidecar,同時我們在 powershell 裏輸入 dapr dashboard -k 打開控制平面也可以看到兩個服務已經上線了

     現在我們看看 clientsample 暴露的 nodeport 端口,然後發起 postman 請求試試

    可以看到成功的從 postman 請求到了 clientsample 後 clientsample 發起了兩個對 servicesample 的 rpc 調用成功回調,整個流程按照預期工作完成。

    好了,今天的分享就到這裏,下一章我們將分享一下如何擼一個 Actor 對象以及如何管理我們的狀態

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/eC43WaOLAV-MOvxgvCChlg