在Dapr从入门到精通系列之一:缘起 中我们初步认识了Dapr的诞生背景、整体架构、构建块、组件等核心概念。本篇我们将安装一个本地开发环境,然后用代码方式来了解Dapr的基本使用。Dapr环境搭建 Dapr 支持多种安装方式,不过因为国内网络问题在线安装大都不能成功。笔者亲验推荐使用离线安装包方式:https://github.com/dapr/installer-bundle/releases Dapr离线安装包中包含了CLI、Runtime、Dashboard三个主要组件。这样就避免了在线安装下载包以及本地初始化时下载Docker镜像的问题。 Dapr CLI是用于各种 Dapr 相关任务的主要工具,可以类比Kubectl。 我们使用它来运行一个带有Dapr sidecar的应用程序, 以及查看sidecar日志、列出运行中的服务、运行 Dapr 仪表盘等。它即可以运行在自托管模式下,也可以很好的与Kubernetes等容器化环境工作。 Dapr Runtime 是Dapr的核心组件,它提供分布式应用所必需的各种运行时能力,是构建块的运行环境。 Dapr Dashboard 提供直观可见方式查看、操作Dapr应用。 离线安装包目录结果如下:daprbundle dapr dist daprd__ .tar.gz (`.zip` for windows) dashboard_ _ .tar.gz (`.zip` for windows) placement_ _ .tar.gz (`.zip` for windows) sentry_ _ .tar.gz (`.zip` for windows) docker daprio/dapr- .tar.gz details.json 将离线安装包解压,对于Windows创建一个目录并将其添加到系统PATH。然后通过命令行终端验证CLI是不是可以正常工作: 图2-1 CLI安装完成后下一步就需要进行Dapr初始化工作。Dapr 与应用程序一起作为sidecar运行,在自托管模式下这意味着它是本地机器上的一个进程。 因此,初始化 Dapr 包括获取 Dapr sidecar 二进制文件并将其安装到本地。 此外,默认初始化过程还创建了一个开发环境,帮助简化 Dapr 的应用开发。 这包括下列步骤:运行一个用于状态存储和消息代理的Redis容器实例运行一个用于提供可观察性的Zipkin容器实例创建具有上述组件定义的 默认组件文件夹运行用于本地Actor支持的Dapr placement服务容器实例 官方推荐使用Docker方式初始化Dapr,这要求提前安装Docker环境这里不再赘述。将切换目录至安装包路径,运行 dapr init --from-dir . 图2-2 初始化完成后,在windows用户目录下可以看到daprd,dashboar的可执行程序,以及缺省安装的Redis组件用于状态管理、发布/订阅场景下使用。 运行Dapr version命令,应该可以看到CLI和Runtime的版本号。如果查看docker进程,可以看到若干运行中的容器。 图2-3 图2-4 至此Dapr环境搭建就大功告成了。使用Dapr状态管理API 接下来我们将通过一两个例子来展示如何使用Dapr进行状态管理。 首先我们运行 dapr run --app-id myapp --dapr-http-port 3500,该命令会启动Dapr sidecar,并使用初始化时安装的Redis组件进行状态存储(windows下在:%USERPROFILE%.daprcomponents),同时监听3500端口。 图2-5 打开postman,模拟服务调用端进行状态读写操作。首先向http://localhost:3500/v1.0/state/statestore端点post一个简单的JSON字符串写入Redis(Dapr默认状态组件),之后进行查询操作确认Redis是否成功写入: 图2-6 图2-7 或者也可以直接通过Redis命令方式来进行查看: 图2-8 我们可以看到键值被成功写入,读取。但它到底是如何工作的呢?在第一篇博客中我们提到了Dapr的核心思想是面向能力编程,在这个例子中我们通过Dapr抽象的状态管理API进行了读写操作,大体过程如下: 图2-9 其中,http://localhost:/v1.0/state// 是Dapr对外提供的状态管理抽象API端点。请求在提交至该端点时会被Dapr sidcar所拦截,然后sidecar根据当前配置选择后端实际数据存储组件进行操作。 接下来我们尝试切换到Memcached状态组件。首先在%USERPROFILE%.daprcomponents目录下新建一个yaml文件,内容如下apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore_memcached spec: type: state.memcached version: v1 metadata: - name: hosts value: localhost:11211 # Required. Example: "memcached.default.svc.cluster.local:11211" - name: maxIdleConnections value: # Optional. default: "2" - name: timeout value: # Optional. default: "1000ms" 重启应用在日志中可以看到Memcached已经被成功加载: 图2-10 在postman中继续进行验证 图2-11 图2-12 可以看到,我们不需要一行代码修改就可以实现在不同状态存储组件之间的移植,这就是面向能力编程的价值。同样的场景我们可以用以在Kafka、RocketMQ等不同消息中间件移植。