龙空技术网

通过Dapr实现基于net的微服务电商系统(三)——教你如何撸Dapr

日行四善 622

前言:

此刻姐妹们对“aspnet直接生成zip”大概比较着重,同学们都想要了解一些“aspnet直接生成zip”的相关知识。那么小编同时在网摘上汇集了一些关于“aspnet直接生成zip””的相关内容,希望你们能喜欢,小伙伴们一起来学习一下吧!

前两章介绍了一下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 svcbuildWORKDIR /srccopy . .RUN dotnet build -c Release DaprSample.slnFROM mcr.microsoft.com/dotnet/aspnet:5.0 as clientsampleWORKDIR /appCOPY --from=svcbuild /src/ClientSample/bin/Release/net5.0 /appENTRYPOINT ["dotnet", "ClientSample.dll"]FROM mcr.microsoft.com/dotnet/aspnet:5.0 as servicesampleWORKDIR /appCOPY --from=svcbuild /src/ServiceSample/bin/Release/net5.0 /appENTRYPOINT ["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/v1kind: Deploymentmetadata:  name: clientsample  labels:    app: clientsamplespec:  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: v1kind: Servicemetadata:  name: clientsamplespec:  type: NodePort  selector:    app: clientsample  ports:    - protocol: TCP      port: 80      targetPort: 80---apiVersion: apps/v1kind: Deploymentmetadata:  name: servicesample  labels:    app: servicesamplespec:  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对象以及如何管理我们的状态

标签: #aspnet直接生成zip