通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:
一、通过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对象以及如何管理我们的状态
通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr的更多相关文章
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权
Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
随机推荐
- Python爬虫_百度贴吧
# 本爬虫为爬取百度贴吧并存储HTMLimport requests class TiebaSpider: def __init__(self, tieba_name): self.tieba_nam ...
- 在.NET中使用Apache Kafka(一)
曾经在你的应用程序中使用过异步处理吗?在处理不需要立即执行的任务时,异步代码似乎是不可避免的.Apache Kafka是最常用和最健壮的开源事件流平台之一.许多公司和开发者利用它的强大功能来创建高性 ...
- Linux+Tomcat+Jdk1.8+jenkins环境搭建
1.下载jdk的rpm安装包,这里以jdk-8u191-linux-x64.rpm为例进行说明 下载地址:https://www.oracle.com/technetwork/java/javase/ ...
- 微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的
前端发送post请求时,请求参数可以放在请求中,代码如下: function post(url, data, callback) { wx.request({ method: 'POST', url: ...
- 微信小程序:数据绑定
data中的数据不仅仅可以当成文本来显示,还可以当成属性来显示. 注意:属性值要用单引号或双引号引起来. 在微信开发者工具的控制台中点击Wxml会看到 使用Boolean类型充当属性的时候,字符串和花 ...
- 前端传数据到后台,后台用实体类接收不到引发的思考----Java bean中字段命名潜规则
1.按照Java语法规范,通常在实体类中的属性,首字母都是小写的.这是由于JavaBean的规范导致的.一般JavaBean属性都是首字母小写,以驼峰命名格式命名,相应的 getter/setter ...
- ffmpeg番外篇:听说这款水印曾经在某音很火?办它!
今天在瞎逛时,偶然看到一个CSDN上的哥们说,他们曾经被一个水印难住了,仔细看了下,感觉可以用一行命令实现. 需求如下:视频加gif水印,gif循环,同时n秒后水印切换位置继续循环 这哥们遇到了两个问 ...
- C++入门(2):为何还学C++?
本文首发 | 公众号:lunvey 提及编程语言,最近很火的当属Python和Java,似乎C++没落了,真的是这样吗? 转行做程序员,掌握一门编程语言,也就是职业技能,我相信更多的是在乎未来发展而不 ...
- WEBAPI 的调用方式
示例是调用谷歌短网址的API. 1. HttpClient方式 public static async void DoAsyncPost() { DateTime dateBegin = DateTi ...
- JavaEE---JDBC技术
JDBC:java连接数据库(任意数据库)的技术JDBC是java为我们预先写好的操作数据库的一系列接口和类 主流的关系型数据库 中小型数据库(mysql sqlserver) 大型数据库(oracl ...