通过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的基础.最开始接触 ...
随机推荐
- qt 向窗口发送消息,键盘输入事件
#include <windows.h> #include <QtDebug> #include <locale> #include <tchar.h> ...
- 伦尼斯酒庄(Chateau Renice)再次赞助亚洲50大餐厅赛事
连续几年来,伦尼斯酒庄(Chateau Renice)一直是亚洲50大最佳餐厅评选赛(Asia's 50 Best Restaurant Awards)的赞助商.2020年伦尼斯酒庄酒庄(Chatea ...
- Error: Actions must be plain objects. Use custom middleware for async actions.
原本代码: import { SREACH_FOCUS, SREACH_BLUR } from "./actionType" export const searchFocus = ...
- Spark + GraphX + Pregel
Spark+GraphX图 Q:什么是图?图的应用场景 A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点 ...
- 设置mysql的字符集永远为UTF-8
1.在虚拟机/usr路径下创建一个文件命名为:mysql.cnf cd /usr touch mysql.cnf 2.在该文件中使用vim命令插入配置文本 vim mysql.cnf 按i键进入编辑模 ...
- Svelte 极简入门
弹指之间即可完成. 注意:原文发表于 2017-8-7,随着框架不断演进,部分内容可能已不适用. Svelte 是一种新型框架. 以往我们要引入一个框架或者类库,可以通过在页面上放置 ...
- 使用Reactor完成类似的Flink的操作
一.背景 Flink在处理流式任务的时候有很大的优势,其中windows等操作符可以很方便的完成聚合任务,但是Flink是一套独立的服务,业务流程中如果想使用需要将数据发到kafka,用Flink处理 ...
- 在16G笔记本上安装GaussDB 200
云主机太贵(最便宜的每月几千吧),长期如果需要GaussDB200有个功能测试或学习环境,那么性价比最高的方式还是在自己的笔记本电脑上尝试安装一个本地的数据库进行学习和功能验证. 01 安装环境信息 ...
- 100道Java高频面试题(阿里面试官整理)
我分享文章的时候,有个读者回复说他去年就关注了我的微信公众号,打算看完我的所有文章,然后去面试,结果我后来很长时间不更新了...所以为了弥补一直等我的娃儿们,给大家的金三银四准备了100道花时间准备的 ...
- 女朋友看了会生气的回答 URI和URL有什么区别?
URL是什么 URL 代表着是统一资源定位符(Uniform Resource Locator).作用是为了告诉使用者 某个资源在 Web 上的地址.这个资源可以是一个 HTML 页面,一个 CSS ...