目錄:
一、通過Dapr實現一個簡單的基於.net的微服務電商系統
二、通過Dapr實現一個簡單的基於.net的微服務電商系統(二)——通訊框架講解
三、通過Dapr實現一個簡單的基於.net的微服務電商系統(三)——一步一步教你如何擼Dapr
四、通過Dapr實現一個簡單的基於.net的微服務電商系統(四)——一步一步教你如何擼Dapr之訂閱發布
五、通過Dapr實現一個簡單的基於.net的微服務電商系統(五)——一步一步教你如何擼Dapr之狀態管理
六、通過Dapr實現一個簡單的基於.net的微服務電商系統(六)——一步一步教你如何擼Dapr之Actor服務
七、通過Dapr實現一個簡單的基於.net的微服務電商系統(七)——一步一步教你如何擼Dapr之服務限流
八、通過Dapr實現一個簡單的基於.net的微服務電商系統(八)——一步一步教你如何擼Dapr之鏈路追蹤
九、通過Dapr實現一個簡單的基於.net的微服務電商系統(九)——一步一步教你如何擼Dapr之OAuth2授權 && 百度版Oauth2
十、通過Dapr實現一個簡單的基於.net的微服務電商系統(十)——一步一步教你如何擼Dapr之綁定
十一、通過Dapr實現一個簡單的基於.net的微服務電商系統(十一)——一步一步教你如何擼Dapr之自動擴/縮容
十二、通過Dapr實現一個簡單的基於.net的微服務電商系統(十二)——istio+dapr構建多運行時服務網格
十三、通過Dapr實現一個簡單的基於.net的微服務電商系統(十三)——istio+dapr構建多運行時服務網格之生產環境部署
十四、通過Dapr實現一個簡單的基於.net的微服務電商系統(十四)——開發環境容器調試小技巧
十五、通過Dapr實現一個簡單的基於.net的微服務電商系統(十五)——集中式接口文檔實現
十六、通過Dapr實現一個簡單的基於.net的微服務電商系統(十六)——dapr+sentinel中間件實現服務保護
十七、通過Dapr實現一個簡單的基於.net的微服務電商系統(十七)——服務保護之動態配置與熱重載
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址
前兩章介紹了一下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,這個過程耗時較長(FQ軟件給力一般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, 選擇最新版本的daprcli並下載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對象以及如何管理我們的狀態
