目录:
一、通过Dapr实现一个简单的基于.net的微服务电商系统

二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

四、通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
附录:(如果你觉得对你有用,请给个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,这个过程耗时较长(翻墙软件给力一般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对象以及如何管理我们的状态

最新文章

  1. springmvc(4)注解简单了解
  2. ajax是异步的,异步取数据,如何能保证数据是存在的。
  3. SGU 105 div.3 找规律
  4. WCF学习笔记
  5. Spring MVC在接收复杂集合参数
  6. CSDN Markdown简明教程4-UML画画
  7. 如何编译生成 dll
  8. 用appuploader生成发布证书和描述性文件
  9. Java设计模式之《构建者模式》及应用场景
  10. 近日使用Taro框架的一点小心得
  11. sublime Text 几款插件
  12. OGG 12.3中支持系统procedure复制的几点说明
  13. Arrays 类的 binarySearch() 数组查询方法详解
  14. RAID磁盘阵列的原理与搭建
  15. Java 枚举那点事
  16. sql 中的分隔符
  17. [Luogu 3275] SCOI2011 糖果
  18. leetcode14
  19. leetcode 合并两个有序数组
  20. 获取BinaryReader中读取的文件名

热门文章

  1. 为什么要抢挖Baccarat流动性挖矿的头矿?头矿的价值是什么?
  2. 聊一下PBN程序图例中的XTT
  3. 经典面试题:在浏览器地址栏输入一个 URL 后回车,背后发生了什么
  4. C#如何防止程序多次运行的技巧(精典)
  5. oracle 导入导出dmp
  6. Go的函数
  7. Django 报错 Reverse for 'content' not found. 'content' is not a valid view function or pattern name.
  8. 《吃透MQ系列》核心基础全在这里了
  9. PAT-1153(Decode Registration Card of PAT)+unordered_map的使用+vector的使用+sort条件排序的使用
  10. CVE-2018-2628-WLS Core Components 反序列化