dapr系列(二)

安装 Dapr CLI 脚手架工具

命令行客户端界面
Dapr CLI 是用于操作各种任务的主要任务。使用它来运行一个与 Dapr sidecar 相关的应用程序,以及查看 sidecar、日志工具运行中的服务、运行 Dapr 仪表板。 Dapr CLI适用于自托管和kubernetes环境。

这里先不讲在kubernetes上的相关的操作,因为后续会专门讲dapr+kubernetes

linux(二进制)

直接下载二进制包,解压到PATH即可使用,你也可以使用源码包编译安装
在这里插入图片描述
或者直接运行下面的命令,默认是安装最新版本,你可以自己调整版本

wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

验证安装

[root@master1 ~]# dapr

          __
     ____/ /___ _____  _____
    / __  / __ '/ __ \/ ___/
   / /_/ / /_/ / /_/ / /
   \__,_/\__,_/ .___/_/
             /_/

===============================
Distributed Application Runtime

Usage:
  dapr [command]

Available Commands:
  annotate       Add dapr annotations to a Kubernetes configuration. Supported platforms: Kubernetes
  build-info     Print build info of Dapr CLI and runtime
  completion     Generates shell completion scripts
  components     List all Dapr components. Supported platforms: Kubernetes
  configurations List all Dapr configurations. Supported platforms: Kubernetes
  dashboard      Start Dapr dashboard. Supported platforms: Kubernetes and self-hosted
  help           Help about any command
  init           Install Dapr on supported hosting platforms. Supported platforms: Kubernetes and self-hosted
  invoke         Invoke a method on a given Dapr application. Supported platforms: Self-hosted
  list           List all Dapr instances. Supported platforms: Kubernetes and self-hosted
  logs           Get Dapr sidecar logs for an application. Supported platforms: Kubernetes
  mtls           Check if mTLS is enabled. Supported platforms: Kubernetes
  publish        Publish a pub-sub event. Supported platforms: Self-hosted
  run            Run Dapr and (optionally) your application side by side. Supported platforms: Self-hosted
  status         Show the health status of Dapr services. Supported platforms: Kubernetes
  stop           Stop Dapr instances and their associated apps. Supported platforms: Self-hosted
  uninstall      Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted
  upgrade        Upgrades or downgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes
  version        Print Dapr runtime and Cli version.

Flags:
  -h, --help          help for dapr
      --log-as-json   Log output in JSON format
  -v, --version       version for dapr

Use "dapr [command] --help" for more information about a command.

在本地环境中初始化 Dapr

Dapr 与您的应用程序一起作为sidecar运行,在自托管模式下,这意味着它是您本地机器上的一个进程。 因此,初始化 Dapr 包括获取 Dapr sidecar 二进制文件并将其安装到本地.

此外,默认初始化过程还创建了一个开发环境,帮助简化 Dapr 的应用开发。 这包括下列步骤:
1.运行一个用于状态存储消息代理的Redis容器实例
2.运行一个用于提供可观察性的Zipkin容器实例(后续建议使用tragger)
3.创建具有上述组件定义的默认组件文件夹
4.运行用于本地actor支持的Dapr placement服务容器实例

如果你是容器方式安装dapr,那么就需要进入容器里面运行命令,这里直接在终端输入即可

安装最新的 Dapr 运行时二进制程序:

dapr init

验证版本:

[root@master1 .dapr]# dapr --version
CLI version: 1.8.0
Runtime version: 1.8.0
[root@master1 .dapr]# docker ps
CONTAINER ID   IMAGE                                               COMMAND                  CREATED         STATUS                   PORTS
c3f8bbf23492   daprio/dapr:1.8.0                                   "./placement"            4 minutes ago   Up 4 minutes             0.0.0.0:5000ement
7c9503a84e6e   redis                                               "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes             0.0.0.0:6379s
c2c27bfcf3e7   openzipkin/zipkin                                   "start-zipkin"           4 minutes ago   Up 4 minutes (healthy)   9410/tcp, 0.in

在 dapr init时,CLI 还创建了一个默认组件文件夹,其中包括几个 YAML 文件,其中包含state store、elevated 和 zipkin。 Dapr sidecar, 将读取这些文件。 告诉它使用Redis容器进行状态管理和消息传递,以及Zipkin容器来收集跟踪。

[root@master1 .dapr]# pwd
/root/.dapr
[root@master1 .dapr]# ls
bin  components  config.yaml

使用 Dapr 的编曲 API

运行上一步dapr init中的命令后(就是开启dapr运行时),你的本地环境具有 Dapr sidecar 二进制文件以及状态管理和消息代理(均使用 Redis)的默认组件定义。现在可以通过使用 Dapr CLI 来运行 Dapr sidecar 并测试使用状态来展示 API 来和检索状态,提供 Dapr 的一些功能。

可以运行sidecar并直接调用API(模拟应用程序将做什么)。

运行 Dapr sidecar

最有用的 Dapr CLI 命令之一是dapr run

下面以运行 Dapr 边车命令,在启动程序 350 上监听 myapp 的空白应用程序:

[root@master1 .dapr]# dapr run --app-id myapp --dapr-http-port 3500
WARNING: no application command found.
ℹ️  Starting Dapr with id myapp. HTTP Port: 3500. gRPC Port: 40891
ℹ️  Checking if Dapr sidecar is listening on HTTP port 3500
INFO[0002] starting Dapr Runtime -- version 1.8.0 -- commit dc7f86840c85a1eff2e1223456994f554ea31d11  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] log level set to: info                        app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] metrics server started on :37738/             app_id=myapp instance=master1 scope=dapr.metrics type=log ver=1.8.0
INFO[0002] standalone mode configured                    app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] app id: myapp                                 app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] mTLS is disabled. Skipping certificate request and tls validation  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] local service entry announced: myapp -> 192.168.23.232:36553  app_id=myapp instance=master1 scope=dapr.contrib type=log ver=1.8.0
INFO[0002] Initialized name resolution to mdns           app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] loading components                            app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] component loaded. name: pubsub, type: pubsub.redis/v1  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] waiting for all outstanding components to be processed  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] detected actor state store: statestore        app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] component loaded. name: statestore, type: state.redis/v1  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] all outstanding components processed          app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] gRPC proxy enabled                            app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] enabled gRPC tracing middleware               app_id=myapp instance=master1 scope=dapr.runtime.grpc.api type=log ver=1.8.0
INFO[0002] enabled gRPC metrics middleware               app_id=myapp instance=master1 scope=dapr.runtime.grpc.api type=log ver=1.8.0
INFO[0002] API gRPC server is running on port 40891      app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] enabled metrics http middleware               app_id=myapp instance=master1 scope=dapr.runtime.http type=log ver=1.8.0
INFO[0002] enabled tracing http middleware               app_id=myapp instance=master1 scope=dapr.runtime.http type=log ver=1.8.0
INFO[0002] http server is running on port 3500           app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] The request body size parameter is: 4         app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] enabled gRPC tracing middleware               app_id=myapp instance=master1 scope=dapr.runtime.grpc.internal type=log ver=1.8.0
INFO[0002] enabled gRPC metrics middleware               app_id=myapp instance=master1 scope=dapr.runtime.grpc.internal type=log ver=1.8.0
INFO[0002] internal gRPC server is running on port 36553  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
WARN[0002] app channel is not initialized. did you make sure to configure an app-port?  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] actor runtime started. actor idle timeout: 1h0m0s. actor scan interval: 30s  app_id=myapp instance=master1 scope=dapr.runtime.actor type=log ver=1.8.0
WARN[0002] app channel not initialized, make sure -app-port is specified if pubsub subscription is required  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
WARN[0002] failed to read from bindings: app channel not initialized   app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] dapr initialized. Status: Running. Init Elapsed 31.531104999999997ms  app_id=myapp instance=master1 scope=dapr.runtime type=log ver=1.8.0
INFO[0002] placement tables updated, version: 0          app_id=myapp instance=master1 scope=dapr.runtime.actor.internal.placement type=log ver=1.8.0
ℹ️  Checking if Dapr sidecar is listening on GRPC port 40891
ℹ️  Dapr sidecar is up and running.
✅  You're up and running! Dapr logs will appear here.

使用这个命令,没有定义自定义组件文件夹。因此在使用 Dapr 中创建的默认组件定义(默认有个组件文件夹,比如$HOME/.dapr/components),告诉 Dapr 使用本地的 Redis Docker 容器作为状态存储和消息代理。

保存状态

我们现在将更新对象的状态。 新状态将看起来像这样:

Copy
[
  {
    
    
    "key": "name",
    "value": "Bruce Wayne"
  }
]

注意, 状态中包含的对象有一个 key, 其值 name。 您将在下一步中使用该key。

运行下面显示的命令来存储新的状态:

curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Bruce Wayne"}]' http://localhost:3500/v1.0/state/statestore

获取状态

现在通过使用状态管理API,用key name 来获取你刚刚存储在状态中的对象。

用上面运行的同一个Dapr实例运行:

Copy
curl http://localhost:3500/v1.0/state/statestore/name

查看状态如何在 Redis 中存储

在 Redis 容器中看到并验证Dapr 正在使用它作为状态存储。 运行以下命令来使用Redis CLI:

docker exec -it dapr_redis redis-cli

列出redis keys以查看Dapr如何创建一个键值对(你提供给 dapr run 的app-id 作为key的前缀):

keys *
"myapp||name"

查看运行时状态值:

hgetall "myapp||name"
1) "data"
2) "\"Bruce Wayne\""
3) "version"
4) "1"

退出redis-cli,使用

exit

定义一个组件

在前面,调用了 Dapr HTTP API 从 Redis 支持的状态存储中存储和检索状态。Dapr 通过初始化创建的默认组件定义文件,使用你的机器上本地配置好的 Redis 实例。
当制造一个应用程序时,你很可能会根据你想使用的制造时间和特定的组件来定义自己的组织文件。
作为如何为你的应用程序定义自定义组件的示例,现在创建一个组件定义文件以与secret building block进行交互。

1.创建本地JSON密钥存储
2.使用定义组件文件在 Dapr 注册密钥存储
3.使用 Dapr HTTP API 获取密钥

创建一个 JSON 密钥存储

虽然 Dapr 支持多种类型的secret存储,但最简单的入门方法是包含secret的本地 JSON 文件(注意,用于常规开发跟用于生产环境的secret安全性不在一个级别内,这里只适合用在本地联系,如果是生产环境,则需要更高安全级别的secret)

将下面的 JSON 内容保存到一个名为mysecrets.json的文件中:

{
    
    
   "my-secret" : "I'm Batman"
}

创建一个密钥存储Dapr组件

创建一个名为my-components的目录来存放新的组件:

mkdir my-components

在这个目录里面创建一个新文件localSecretStore.yaml,内容如下:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: my-secret-store
  namespace: default
spec:
  type: secretstores.local.file
  version: v1
  metadata:
  - name: secretsFile
    value: <PATH TO SECRETS FILE>/mysecrets.json
  - name: nestedSeparator
    value: ":"

你可以看到上面的文件定义有一个type: secretstores.local.file字段值,它告诉 Dapr 使用本地文件组件作为密钥存储组件。元数据字段提供了使用该组件所需的组件信息

运行 Dapr sidecar

下面以运行 Dapr 边车命令,在启动程序 350 上监听 myapp 的空白应用程序:

dapr run --app-id myapp --dapr-http-port 3500 --components-path ./my-components

获取一个密钥

在单独的终端运行中:

curl http://localhost:3500/v1.0/secrets/my-secret-store/my-secret

你看到的输出应该是你存储在JSON文件中的密钥

{
    
    "my-secret":"I'm Batman"}

dapr教程

定义一个组件

创建组件定义文件以与secret building block进行交互
在构建应用程序时,你很可能会创建自己的组件文件定义,具体取决于你想要使用的构建块特定组件

这里创建一个组件定义文件以与secret building block API进行交互:

1.创建本地 JSON 机密存储。
2.使用组件定义文件向 Dapr 注册secret存储。
3.使用 Dapr HTTP API 获取密钥。

创建 JSON secret存储

Dapr 支持多种类型的secret存储,这里创建一个本地 JSON 文件,命名mysecrets.json:

{
    
    
   "my-secret" : "I'm Batman"
}

创建secret存储 Dapr 组件

创建一个名为my-components保存新组件文件的新目录:

mkdir my-components

切换到这个目录:

cd my-components

创建一个localSecretStore.yaml包含以下内容的新文件:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: my-secret-store
  namespace: default
spec:
  type: secretstores.local.file
  version: v1
  metadata:
  - name: secretsFile
    value: <PATH TO SECRETS FILE>/mysecrets.json
  - name: nestedSeparator
    value: ":"

type: secretstores.local.file告诉 Dapr 使用本地文件组件作为secret存储。
metadata字段提供使用此组件所需的组件特定信息。
在这种情况下,secret存储 JSON 路径是相对于你调用dapr run时所处的路径。

运行 Dapr sidecar

启动一个 Dapr sidecar,它将在端口 3500 上侦听一个名为 的空白应用程序myapp:

dapr run --app-id myapp --dapr-http-port 3500 --components-path ./my-components
如果出现错误消息,说明app-id已在使用中,您可能需要停止任何当前正在运行的 Dapr sidecars。
dapr run在运行下一个命令之前停止 sidecar :
按 Ctrl+C 或 Command+C。
dapr stop在终端中运行命令。

获取秘密

在单独的终端中,运行:

curl http://localhost:3500/v1.0/secrets/my-secret-store/my-secret

{
    
    "my-secret":"I'm Batman"}

为 Dapr 配置状态存储和发布/订阅消息代理组件

要启动并运行状态和 Pub/sub 构建块,你需要两个组件:
1.用于持久性和恢复的状态存储组件。
2.作为用于异步样式消息传递的发布/订阅消息代理组件。

创建 Redis 存储

Dapr 可以使用任何 Redis 实例:
1.在本地开发机器上容器化
2.托管的云服务。

自托管环境

作为初始化过程的一部分,Dapr CLI 会在自托管环境中自动安装 Redis。

kubernetes

安装redis之前,先安装Helm v3

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install redis bitnami/redis

对于 Dapr 的 Pub/sub 功能,至少需要 Redis 版本 5。对于状态存储,您可以使用较低版本。
运行kubectl get pods以查看现在在集群中运行的 Redis 容器:

kubectl get pod

对于 Kubernetes:
1.主机名是redis-master.default.svc.cluster.local:6379
2.secret ,redis是自动创建的。

配置 Dapr 组件

Dapr 定义了用于使用组件构建块功能的资源。用上面创建的资源连接到 Dapr 以获取 state 和 pub/sub。

找到你的组件文件

自托管

在自托管模式下,组件文件会在以下位置自动创建:$HOME/.dapr/components

kubernetes

组件文件随你放,之后能用kubectl就行

创建状态存储组件

创建一个名为 的文件redis-state.yaml,然后粘贴以下内容:

自托管
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
  # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 
kubernetes
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <REPLACE WITH HOSTNAME FROM ABOVE - for Redis on Kubernetes it is redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
  # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 

示例使用你之前在设置集群时创建的 Kubernetes 密钥。

创建发布/订阅消息代理组件

创建一个名为 的文件redis-pubsub.yaml,然后粘贴以下内容:

自托管
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
 # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 
kubernetes
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <REPLACE WITH HOSTNAME FROM ABOVE - for Redis on Kubernetes it is redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
 # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 

示例使用您之前在设置集群时创建的 Kubernetes 密钥。

硬编码密码(不推荐)

仅出于开发目的,可以跳过创建 Kubernetes secret并将密码直接放入 Dapr 组件文件:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>
  # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>
  # uncomment below for connecting to redis cache instances over TLS (ex - Azure Redis Cache)
  # - name: enableTLS
  #   value: true 

生产环境千万别这样做

应用配置

自托管
Kubernetes

当你运行时dapr init,Daprpubsub.yaml在你的本地机器上创建一个默认的 redis。通过打开你的组件目录进行验证:
~/.dapr/components/pubsub.yaml

对于新的组件文件:
1.components在你的应用文件夹中创建一个包含 YAML 文件的新目录。
2.dapr run使用标志提供命令的路径--components-path

如果你在slim 模式下初始化 Dapr (没有 Docker),你需要手动创建默认目录,或者总是使用–components-path

猜你喜欢

转载自blog.csdn.net/weixin_45843419/article/details/125828483