通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:
一、通过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的微服务电商系统(十七)——服务保护之动态配置与热重载
十八、通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
十九、通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式
二十、通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
附录:(如果你觉得对你有用,请给个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对象以及如何管理我们的状态