.NET云原生大咖课-第一课【朱永光-利用Azure Container Apps轻松托管Dapr应用内容】文字稿

我是朱永光,目前在微软工作,其实最近一两年,我在社区都做了大量关于Dapr的分享,所以说今天我分享的内容还是和Dapr相关,不过会以微软的一个全新的一个PaaS服务,作为分享的一个主要的主题,我们今天分享题目是利用Azure Container Apps轻松托管Dapr应用内容,下面是我分享内容的一个大纲。

大家已经对Dapr有所了解,但是我相信可能还是有部分的小伙伴,可能对Dapr不是这么了解,所以,我前面会花一点时间,来介绍一下,然后,我会介绍一下我最近刚刚开源的针对Dapr应用的一个POC的介绍,为什么会介绍这个POC呢?最近我把它重新托管到了Azure Container Apps上面,所以,今天重点的内容,其实就是来介绍一下Azure Container Apps以及如何用这个PaaS服务来托管Dapr应用,最后会有一点简单的操作演示,因为我相信很多人可能第一次听到这个名词,所以,我会通过讲解和操作的方式来给大家熟悉一下,讲完我会到群里和大家做一些这种QA的环节。

我们还是来讲解下Dapr的基本概念,Dapr其实要解决的问题很简单,就是,现在在做微服务,而微服务支持我们最大的一个好处就是,你可以选择你自己喜欢的这个技术栈或者语言。

但是,现有的一些微服务的框架,它其实是会受限于语言的这些限制的,比如说你有些框架就是用某种语言做的,所以说他也就只支持某些语言的开发,而Dapr的出现其实也是为了解决这样的一些痛点,所以说Dapr第一个好处就是你可以用你喜欢的任何语言,然后,用这语言上流行的一些Web框架来开发,一个现代的、微服务的应用,或者叫云原生的应用。

这里其实列出了好多种语言,从GO、Python到中国最流行的Java,以及我们最喜爱的.NET,当然,甚至你还可以用一些比较冷门的,比如说C++、PHP来做开发,甚至有一次Azure的CTO,在做演示的时候,甚至用了一个很古老的一个语言FBasic来做,所以说其实你只要这种语言,能够去访问标准的http协议,大家也看到了,下面是有http协议的接口,那么你就可以使用Dapr来开发你的微服务的应用。

同时,Dapr还带来另外一个好处,就是他除了支持让你使用多种语言,还可以让你把你的微服务的应用,原生的应用运行在不同的基础设施的环境里面去,这就很容易让你实现,你对微服务应用的一致性以及跨平台的这种能力,当然,其实除了这几个绿色基础设施以外,微软Azure或者说微软的跨云的这样的一个管理平台,你也可以在AWS,Google云、阿里云、华为云都是可以的,甚至在你自己的数据中心,也是可以使用Dapr。

那么他是如何做到这样的呢?其实,它使用了一个前几年很流行的编程模型方式,把边车运用到了大规模应用的一种模式,也就说Dapr把一些公共的能力都以边车的方式抽象出来,然后,你对外的一些访问都是通过这个Dapr的边车去交互,那么Dapr再把你的请求转发给其他的一些底层的组件,这就实现了你不需要去了解特定组件的sdk,你直接使用Dapr的标准请求接口就可以来做标准的服务间的调用、状态的存储、发布订阅异步的调用,也可以做这种获取密钥等等一系列的信息。所以我们可以看到Dapr应用和应用之间其实就是通过边车去访问,那么边车就把我们刚才讲到的这些公共的能力都抽象出来了。

其实我们还可以看到最下面的观测性,因为你对其他应用的调用不管是同步的还是异步的发布订阅,甚至于说你可以使用状态管理的这种请求,你请求第三方的一个服务,都会通过这个Dapr的边车来过一道,那么,所有的这种数据流,都可以被Dapr的边车来采集到,就可以很容易的实现,这种非侵入性的可观测性。

那么,Dapr是如何让你做到和平台无关的呢?其实是刚才我们抽象了很多公共能力,但是这些公共的能力的落地,其实是落地到不同的组件上,只要这组件根据Dapr的公共能力的接口,来实现对应的落地接口就行了,比如说状态存储,你可以使用Azure CosmosDB,发布订阅,你可以使用Azure Service Bus。甚至于说像Dapr的注册发现、配置管理,都可以通过Dapr组件的方式,来和真正底层去落地的这些数据源,进行抽象和隔离。

所以说Dapr的这种公共的能力,我们称之构建快,现在我们列出的这些,就是大家最常用的服务到服务之间这种同步调用,然后,你一个服务在运行过程中,可能会有一些和业务状态相关的信息需要保存,那么你就可以使用状态,这样就可以让你的这种无状态的微服务,变成一个有状态的方式来运行,然后,服务之间的异步的这种调用就可以通过发布订阅,还有就是发布订阅能保证你整个的这种微服务,或者云原生的性能以及它的可伸缩性,当然还有绑定,绑定你可以认为是系统对外的这种发布订阅,而发布订阅一般是指系统内部的这种,消息的这种驱动的一个处理,还有执行组件,这也是Dapr有特点的一个组件,当然这是因为来自于微软,我们使用执行组件,可以实现很多很复杂的一些并发的场景,因为Dapr这个组件可以让你写同步代码的方式,来实现大规模的这种逐渐的运行,当然还有观测性,我刚才也讲到了,它的基本原理,还有密钥的管理,因为你的整个的这种对外的一些连接字符串,你不应该写在你的代码里面,所以说我们一般会通过一种,机密管理的方式来获取这样的连接字符算一些敏感的信息。

这是我之前的一个Dapr的POC的应用,大家可以看到,其实整个应用最早是部署在一个AKS的一个环境里面,我每个应用会有自己的一个数据源,这里大家可以看到它虽然有两个数据源,是因为我会去访问一个遗留系统数据源,所以它是画在边界之外的,然后,你可以看到,这里面的前面这两个是用Java开发的,后面是用.NET6开发的,可以看到,Dapr确实可以让我们使用不同的语言,来实现紧密融合在一起运行的微服务应用,然后,我这两个应用之间是采用了发布订阅的这种调用方式,它外部使用Azure Service Bus,而其他服务之间就使用了这种服务间调用的同步调用方式。

然后,这个服务还使用了一些状态管理,他就要存储到Azure Storage,我还运行了一个工作流的,单独的Dapr服务,这两者间是可以通过工作流来触发的,最后,我整个的微服务镜像,实际上是托管到了容器注册的服务里面,然后所有的这个Dapr都可以通过,Azure DevOps的CICD的这种能力,来进行持续集成和持续交付,但是,我源代码其实是放在GitHub下,所以我们可以看到Azure DevOps Service CIUD能力是很强的,同时整个系统我是使用了Azure上的一个服务,他可以Dapr这种可观测性的信息收集到Azure里面去,从而实现这种良好的分布式跟踪,以及日志,甚至,我除了可以了解我应用程序的日志,我还可以了解到,我容器运行环境,背后虚拟机的运行环境,然后,对外部系统需要访问的一些入口,我可以通过ipm服务,来对外部系统进行鉴权,进行限流的一些控制,然后再把它转到一个内部的网关服务里面。

我们可以看一下整个技术栈,一共有11个项目,有十个Dapr的项目,然后还有一个桌面应用。

然后,Java项目开发了三个,但有一个像old的这个项目,它其实是一个外部的,你可以认为是一个遗留的单体应用,然后,.NET来开发了其他的项目,然后整个东西当时是托管在AKS里面,然后CI/CD就像刚才讲到的,然后数据库使用了SqlServer、PostgreSQL,然后有一个叫portal的项目就是用户操作的门户,它使用了Server Blazor来进行,然后,使用了Server Blazor的聚合网关模式,来办理对portal的请求分发到其他微服务上去,然后,还有一个gateway项目,它通Ocelot的网关,也是.NET开发的,当然这个网关它其实是有点老了,未来可能我会对POC作不断的引进,可能会用其他的这种网关的这种中间件或者组件来替换它。

从微服务你就可以看到,比如说替换这一部分,并不会影响其他微服务的组件。然后,gateway其实是实现的标准任务,路由的网关模式,我们知道网关模式其实是分为两种,一种是聚合网关,一种路由网关,路由网关,就是说我只是把请求拿过来,然后通过我的路由配置,转发到其他的微服务上去。

当然,你在这个网关也可以去做一些鉴权了,而且额外的,像限流的一些操作,只是说在我的这个POC里面,这样的事情我是交给了ipm的,然后,在我开发的时候,其实是使用了一个叫Logic的模拟的这么一个工具,来模拟我的其他微服务的接口,也就是说我不需要把其他微服务开发出来,我就可以使用Logic的这个东西来模拟它,方便你其他微服务进行调试,同时,我还创新性的使用Dapr的方式来启用Logic,这样子的话,其实是你在调试的时候,真正的就是使用Dapr的方式去调试,而不是去调用一个外部的API接口,整个POC当时实现了一个工作流的引擎,是基于Azure上logic Apps的这么一个运行来实现了工作流来驱动其中的一个业务的功能,叫入库申请的审批流程,这个就是我整个的技术栈,然后,代码在这里,然后我忘记把它转成一个二维码了,大家起去搜一下daprapps-poc应该就可以搜得到。

好,我这里简单来展示一下我们的代码,你可以看得到,整个代码在VSCode里面是可以完全去跑的,当然我也建立了VisualStudio的解决方案,像.NET项目我也可以在VisualStudio里面开发,你可以看得到,其实是创建了很多启动的项目,通过它我可以来启动一些Dapr的应用。

这里我们使用了godown,使用Dapr启动了一个主键,然后把主键的路径传递给它,然后在调试的时候它其实是会自动以Dapr的方式去启动,这两个文件应该在那个源代码里面都有的,大家可以看得到,好,这就是我刚才讲到的,如何去调试这个POC的。

然后我们看一下源代码,我大概分做了这些项目,这是一个Java的项目,它就是标准的springboot的项目,还有一个controller来提供相应的接口,然后我们可以看得到,在这个应用里面也使用了Dapr SDK来访问,另外一个微服务。

大家可以看得到,这我们其实是引用了,这个dapr client Java的SDK来访问它。

同样.NET就有大量的,比说,我们来看portal,我们实现了一个聚合网关,比如说我portal访问后面的Approval这么一个服务,那么是在服务里面去声明一个daprClient,通过daprClient去调用外部的另外一个微服务,是这个方法。

我们可以看到另外一个微服务的APPID,叫这个approval,好时间有限,我这个代码就先讲到这里,详细的大家可以去下载代码https://github.com/heavenwing/daprapps-poc

下面,我们来介绍一下微软全新的容器托管服务,在详细介绍之前,其实在Azure上有很多和容器相关的服务,这个是一个全新的微服务托管的一个PaaS,我们之前有一个叫App Service大家应该可能很多人都会用过它,当然,你是来托管应用的,但其实这个应用你可以把它打包成一个容器镜像以容器的方式来运行,然后我们还有个叫Azure Container Instances,只是名字最后不一样,它其实是来托管单个Dapr镜像,可以认为它是单体的容器方式来跑项目和是一个PaaS,然后,我们还有一个托管的Kubernetes标准服务,然后,我们知道Azure Functions可以把它打包成一个容器的方式来运行,然后,我们还有Spring的一个应用,它是以容器的方式来运行Spring这个应用,还有Openshift是托管到Openshift的一个服务,它其实是一个添加了很多额外功能的Kubernetes的发行版本,以前我们微软还重点推广了一个开源的Fabric,它是可以帮助你来开发一个强大分布式应用的一个开发框架和一个运行环境。

Azure Container Apps是一个用于构建现代应用程序和微服务的一个全新的服务器,你不需要去管,你背后的一些服务器要怎么配,就算你用AKS其实还需要去管它的节点,使用Container Apps你不需要去管怎么配置,并且它集成了很多云原生的一些基础设施进去,其实它背后也是一个AKS,然后,他使用了KEDA来帮助你去做一些自动的伸缩,然后它可以和Dapr无缝的集成,来支持应用的运行,然后,他也集上Envoy来做一些流量的分发,你可以认为在Container Apps这里面集成了Service Mesh。

它其实是有这些概念和特性,我会逐一的来讲。

首先,环境你可以认为就是微软帮你,去托管和创建了一个虚拟的Kubernetes集群,但是你不需要管这个集群是怎么配置的,微软帮你处理了,然后,你一个容器应用总是要选择一个环境去跑的,并且这个环境也帮你管理了一些虚拟网络,也会把一些日志写入到一个日志分析的工作区里面去。

然后就会讲到每一个容器,容器本质上就是你的运行环境,你的应用程序运行的一个实例。

然后,你会对你运行的这个应用程序做一些更新,做一些部署的配置修改,那么他就会先创建一个修订版本,而修订版本,它是一个不可变的,本质上来说你改了任何东西,它就会创建一个新的版本。

所以他整体的容器应用就会有一个生命周期,而一个容器应用,它会经过三个阶段,部署、更新和停用,你在部署的时候,它会创建第一个修订版本。

当你去改配置或者修改整个template,一些配置的时候,它会创建更多的版本,如果你是修订版本的模式,你改了任何东西那么旧的修订版本,就会自动停用,然后,来激活新的修订版本,当然你可以多版本共存,就存在一个路由管理的问题。

然后,刚才容器应用本质上包含了多个容器的话,就形成了一个微服务,而这个微服务是可以独立缩放,进行版本控制和升级的,我刚才已经讲到了,然后,对于我们关心的就是它可以和Dapr做集成。

容器应用也内置了全面的这种很强大的观测性,其实本质上和我开始POC使用AKS是一样,它是把这种观测的信息,发送到了Azure 里面去。

在这个容器应用里面,还给你提供了一个验证集成的能力,它本质上是给你生成了一个验证中间件的边车容器,然后有外部请求进来,首先到那个边车去转一下,然后验证通过了,以后才会去调用你真正应用程序的容器,然后,验证通过的时候,会带着验证了的一些信息,比如说你当前的用户名是什么,用户id是什么,然后传给你,容器的这种应用。

本质上Container Apps和Dapr集成,是在我们的容器应用里面,可以去声明,我们要启用Dapr,启用了以后,你可以配置Dapr ID,其实我刚才讲的环境,我们去应用这个环境。它已经把Dapr的的一些扩展都帮你装好了,所以说你只需要声明这个容器应用,启用它就行了。

那为什么要使用这个ACA来托管Dapr应用,主要是我们不需要自己去运维Kubernetes,Kubernetes已经帮我们屏蔽了as,本质上还不是一个真正意义上的PaaS,真正的PaaS你不需要去管,背后的一些基础设施的细节,然后PaaS还有另外一个特点,它就是按量付费,你就算建一个AKS你的节点开了以后,不管节点上面跑的应用是多还是少,它还是按照节点的方式去收费,但是这个ACA就是按照你这个容器应用好的cpu时间和内存占用的这个时间来收费的,它就是真正一个按量付费的一个PaaS。然后你也不需要去配Dapr,等一系列的环境,开箱即用,把你的应用开发好,打包成容器镜像,然后,发布上去就行了。

官方文档给了一个例子,前面有一个API,这个API会去调一个订单的服务和一个库存的服务。

然后,这么简单的一个应用,其实你可以看得到它采用的两种语言,然后,你启用以后,它就会跟你去注入一个Dapr的边车,它之间可以让你去使用Dapr这种方式去调用,然后调用的这种过程的跟踪信息,可以传递到Azure Container Instances这个组件里去。

然后,还有一些运行过程中的状态信息可以存储到Azure Storage,这里是它的一个简单的地址。

在ACA中运行Dapr的POC应用展示,可以观看视频,文字无法描述。

创建演示需要一段时间,我们先看下源码。

Dpar的应用部署到AKS,首先需要使用dockerfiles把它做成一个容器镜像的,举个例子,比如说像这个,portal.Dockerfile对吧,就使用了.NET 6这么一个激进项。

看下源代码,这个就是简单的一个获取镜像,把它编译,然后发布到我的DockerHub里面,发布了以后,如果你是在传统的这种Kubernetes上部署的话,你还需要去创建一个部署的yaml文件。

比如说以这个portal.yaml为例,因为这个portal需要被外部访问,所以说我去创建了一个Service,最终我这个东西其实是使用,外部的一个负载均衡来暴露它的。

我其实设定了一个ingress,大家可以看到ingress其实是来暴露这个portal,portal首先要暴露一个service。

最关键是说我们需要去创建一个Deployment,你需要去声明Dapr的启用。

下面我们通过在ACA中运行Dapr的POC应用展示看下项目运行,可以观看视频,文字无法描述。

这个ACA本质上就是帮你简化了Kubernetes的学习成本,也就是开发人员不需要去了解Kubernetes的一些东西,其实。我接触到的,有一些这种厂商,他们其实对最终的开发人员,他也不会把整个的Kubernetes这种概念暴露给开发人员,或者开发团队的,它会封装成一层,叫他们内部的一个应用的运行平台,那么开发人员只需要把它的应用程序打包成容器镜像,后面整个的这个容器镜像到底怎么部署,其实都不需要去管Kubernetes的任何概念,其实微软只是把这样的东西,把它做成了Azure上的一个PaaS的服务,同时集成了要构建现代应用程序的一些基础的设施的能力,比如,Dapr、KEDA、DAPR、Envoy我的分享,就到这里。

给TA打赏
共{{data.count}}人
人已打赏
Azure

如何使用 Azure-SSIS 集成运行时在 Azure 和 Azure Government运行 SSIS 包

2022-6-30 10:37:14

.Net CoreAzure

将 ASP.NET Core 和 Azure SQL 数据库应用部署到 Azure 应用服务

2022-8-16 10:28:07

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索