引言
dapr是多运行时微服务架构(及机甲架构)的参考实现,关于多运行时微服务架构的介绍,可以参考敖小剑老师的两篇文章:
[译]多运行时微服务架构
Mecha:将Mesh进行到底
为了探索dapr的使用,我们必须有一个环境,为了能快速体验dapr的使用,在本文中,我们将阐述如何搭建一个dapr的locally环境,并在其上运行dapr的hello world示例代码进行验证
dapr的安装
这次搭建采用的操作环境信息如下:
cat /proc/version
Linux version 4.4.0-177-generic (buildd@lgw01-amd64-035) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #207-Ubuntu SMP Mon Mar 16 01:16:10 UTC 2020
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
UBUNTU_CODENAME=xenial
安装docker
安装方式,在这里采用了阿里提供一键安装脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
安装完成后,我们查看一下docker的信息,如下:
root@ubuntu:/home/dapr# docker version
Client: Docker Engine - Community
Version: 19.03.9
API version: 1.40
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:25:34 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.9
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 9d988398e7
Built: Fri May 15 00:24:07 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
root@ubuntu:/home/dapr#
安装dapr
dapr提供了其cli工具,通过 dapr 的cli就可以在本地主机上完成dapr组件的安装,如下:
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
dapr的cli工具安装完成后,就可以安装dapr的相关组件了,如下:
dapr init
⌛ Making the jump to hyperspace...
Downloading binaries and setting up components
✅ Success! Dapr is up and running
在这个初始化的过程中,下载了相关dapr镜像和daprd这个二进制包,如下:
find / -name *dapr*
/usr/local/bin/daprd
# docker ps
82cfe68fe555 daprio/dapr "./placement" 2 days ago Up 2 hours 0.0.0.0:50005->50005/tcp dapr_placement
其中,daprd就是我们业务程序与之交互的sidecar(dapr runtime),而placement是负责 dapr actor机制处理的容器,其相互关系如下:
部署官方的Hello world示例
dapr的Hello world示例中,有两个示例场景,如下:
- 场景一:服务端(node开发)是一个REST服务,使用者采用rest工具,与其交互,将相关信息存入到redis中,并支持从redis中读取已经存放的数据
- 场景二:服务端(node开发)是一个REST服务,客户端(python程序)也使用dapr来部署,二者交互,完成将相关信息存入到redis中,并从redis中读取已经存放的数据
在开始部署这两个场景前,我们需要先将dapr的官方实例代码下载到本地,进行解压,如下:
# wget https://github.com/dapr/samples/archive/v0.7.0.tar.gz
# tar -xvf v0.7.0.tar.gz
注:由于我当前使用的dapr的0.7.0 版本,所以下载的实例也是 0.7.0的,大家在试验时,一定要注意版本匹配
场景一
这个场景的示意图如下:
步骤一:通过dapr来运行我们的node的程序
- 进入示例的代码目录
# cd samples-0.7.0/
# ls
1.hello-world 5.bindings CONTRIBUTING.md
2.hello-kubernetes 6.functions-and-keda LICENSE
3.distributed-calculator 7.middleware README.md
4.pub-sub 8.observability samples-diagrams.pptx
# cd 1.hello-world/
- 安装node的相关依赖
root@ubuntu:/home/dapr/samples-0.7.0/1.hello-world# npm install
[email protected] /home/dapr/samples-0.7.0/1.hello-world
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
......
npm WARN [email protected] No repository field.
- 通过dapr来运行node进程
dapr run --app-id nodeapp --app-port 3000 --port 3500 node app.js
WARNING: Redis State Store file is being overwritten: /home/dapr/samples-0.7.0/1.hello-world/components/statestore.yaml
WARNING: Redis PubSub file is being overwritten: /home/dapr/samples-0.7.0/1.hello-world/components/pubsub.yaml
ℹ️ Starting Dapr with id nodeapp. HTTP Port: 3500. gRPC Port: 35158
......
ℹ️ Updating metadata for app command: node app.js
✅ You're up and running! Both Dapr and your app logs will appear here.
这里对启动的参数做一个简单的说明,--app-id为这个应用在dapr中指定一个id,--app-port是node对外的监听端口,而port是dapr runtime为这个服务而提供的一个对外端口,我们通过Linux命令来验证一下,如下:
# lsof -i:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 2969 root 10u IPv6 12038090 0t0 TCP *:3000 (LISTEN)
# lsof -i:3500
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
daprd 2968 root 15u IPv4 12038265 0t0 TCP *:3500 (LISTEN)
root@ubuntu:~#
步骤二:通过Postman来访问我们的node程序
- 调用rest接口,插入数据
如下图:
在这里我们可以看到,访问的端口是 3500,就是 由 daprd监听的端口
- 通过redis工具,查看redis中的数据
-
调用rest接口,获取已经插入的数据
如下图:
小结
通过场景一的演示,我们看到postman与drapd交互,然后drapd再与node程序交互,最终将数据插入到了redis中
场景二
场景二将在场景一的基础上,将postman也换成一个python程序,而python也是用dapr进行部署,如图所示:
步骤一:通过pip来安装python程序的依赖包
# pip3 install requests
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting requests
Downloading https://files.pythonhosted.org/packages/1a/70/1935c770cb3be6e3a8b78ced23d7e0f3b187f5cbfab4749523ed65d7c9b1/requests-2.23.0-py2.py3-none-any.whl (58kB)
100% |████████████████████████████████| 61kB 429kB/s
.........
步骤二:通过dapr将python程序运行起来
新启动一个终端,在这个终端用dapr启动这个python程序(这个程序也是在官方的1.hello-world中)
# dapr run --app-id pythonapp python3 app.py
ℹ️ Starting Dapr with id pythonapp. HTTP Port: 40182. gRPC Port: 41868
.....
使用dapr运行这个python程序后,在node的终端中就可以看到如下打印输出:
== APP == Got a new order! Order ID: 1
== APP == Successfully persisted state.
== APP == Got a new order! Order ID: 2
== APP == Successfully persisted state.
== APP == Got a new order! Order ID: 3
总结
在这篇文章我们搭建了dapr的单机环境,并通过官方示例代码,体验了dapr的使用方式,但是我们对Dapr还是存在很多不明白的地方,在下一篇中,我将用go和java来重写一下这个hello world,来进一步深入Dapr