dapr实战(1):dapr locally环境的搭建和部署官方的Hello world示例

引言

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机制处理的容器,其相互关系如下:


来自于dapr的github官方文档

部署官方的Hello world示例

dapr的Hello world示例中,有两个示例场景,如下:

  1. 场景一:服务端(node开发)是一个REST服务,使用者采用rest工具,与其交互,将相关信息存入到redis中,并支持从redis中读取已经存放的数据
  2. 场景二:服务端(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的github官方文档

步骤一:通过dapr来运行我们的node的程序

  1. 进入示例的代码目录
# 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/

  1. 安装node的相关依赖
root@ubuntu:/home/dapr/samples-0.7.0/1.hello-world# npm install
node_server@1.0.0 /home/dapr/samples-0.7.0/1.hello-world
├─┬ body-parser@1.19.0
│ ├── bytes@3.1.0
│ ├── content-type@1.0.4
│ ├─┬ debug@2.6.9
......

npm WARN node_server@1.0.0 No repository field.
  1. 通过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程序

  1. 调用rest接口,插入数据

如下图:


postman插入数据

在这里我们可以看到,访问的端口是 3500,就是 由 daprd监听的端口

  1. 通过redis工具,查看redis中的数据
redis中的数据
  1. 调用rest接口,获取已经插入的数据
    如下图:


    postman获取插入的数据

小结

通过场景一的演示,我们看到postman与drapd交互,然后drapd再与node程序交互,最终将数据插入到了redis中

场景二

场景二将在场景一的基础上,将postman也换成一个python程序,而python也是用dapr进行部署,如图所示:


来自于dapr的github官方文档

步骤一:通过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


微信公众号
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345