HTTP binding 规范

HTTP binding 组件的详细文档

备选方案

服务调用 API 允许调用非 Dapr HTTP 端点,是推荐的方式。阅读 “如何操作:使用 HTTP 调用非 Dapr 端点” 了解更多信息。

配置 Dapr 组件

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: bindings.http
  version: v1
  metadata:
    - name: url
      value: "http://something.com"
    #- name: maxResponseBodySize
    #  value: "100Mi" # 可选,从响应中读取的最大数据量
    #- name: MTLSRootCA
    #  value: "/Users/somepath/root.pem" # 可选,根 CA 路径或 PEM 编码字符串
    #- name: MTLSClientCert
    #  value: "/Users/somepath/client.pem" # 可选,客户端证书路径或 PEM 编码字符串
    #- name: MTLSClientKey
    #  value: "/Users/somepath/client.key" # 可选,客户端密钥路径或 PEM 编码字符串
    #- name: MTLSRenegotiation
    #  value: "RenegotiateOnceAsClient" # 可选,可选值之一:RenegotiateNever、RenegotiateOnceAsClient、RenegotiateFreelyAsClient
    #- name: securityToken # 可选,<作为头部包含在 HTTP 请求中的令牌>
    #  secretKeyRef:
    #    name: mysecret
    #    key: "mytoken"
    #- name: securityTokenHeader
    #  value: "Authorization: Bearer" # 可选,<安全令牌的头部名称>
    #- name: errorIfNot2XX
    #  value: "false" # 可选

规范元数据字段

字段必填Binding 支持详情示例
urlY输出要调用的 HTTP 端点的基础 URLhttp://host:port/path、http://myservice:8000/customers
maxResponseBodySizeN输出要读取的响应的最大长度。整数被解释为字节;为方便起见,可以添加 Ki, Mi, Gi(SI)或 `kM
MTLSRootCAN输出根 CA 证书路径或 PEM 编码字符串
MTLSClientCertN输出客户端证书路径或 PEM 编码字符串
MTLSClientKeyN输出客户端私钥路径或 PEM 编码字符串
MTLSRenegotiationN输出要使用的 mTLS 重新协商类型RenegotiateOnceAsClient
securityTokenN输出要作为头部添加到 HTTP 请求的令牌值。与 securityTokenHeader 一起使用
securityTokenHeaderN输出HTTP 请求上 securityToken 的头部名称
errorIfNot2XXN输出当响应不在 2xx 范围内时是否应抛出 binding 错误。默认为 true

MTLSRootCA、MTLSClientCert 和 MTLSClientKey 的值可以通过三种方式提供:

  • secret store 引用:

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: <NAME>
    spec:
      type: bindings.http
      version: v1
      metadata:
      - name: url
        value: http://something.com
      - name: MTLSRootCA
        secretKeyRef:
          name: mysecret
          key: myrootca
    auth:
      secretStore: <NAME_OF_SECRET_STORE_COMPONENT>
    
  • 文件路径:可以将文件的绝对路径作为字段的值提供。

  • PEM 编码字符串:也可以将 PEM 编码的字符串作为字段的值提供。

Binding 支持

此组件支持 输出 binding,支持以下 HTTP 方法/动词:

  • create :出于向后兼容性考虑,被视为 post
  • get : 读取数据/记录
  • head :与 get 相同,但服务器不返回响应体
  • post :通常用于创建记录或发送命令
  • put :更新数据/记录
  • patch :有时用于更新记录的字段子集
  • delete :删除数据/记录
  • options :请求有关可用通信选项的信息(不常用)
  • trace :用于调用远程的应用层请求消息回送(不常用)

请求

操作元数据字段

上述所有操作都支持以下元数据字段

字段必填详情示例
pathN要附加到基础 URL 的路径。用于访问特定的 URI。"/1234"、"/search?lastName=Jones"
首字母大写的字段N任何首字母大写的字段都将作为请求头部发送"Content-Type"、"Accept"

检索数据

要从 HTTP 端点检索数据,请使用 GET 方法调用 HTTP binding 并使用以下 JSON 正文:

{
  "operation": "get"
}

可以选择指定路径以与资源 URI 交互:

{
  "operation": "get",
  "metadata": {
    "path": "/things/1234"
  }
}

响应

响应正文包含 HTTP 端点返回的数据。data 字段包含 HTTP 响应正文,作为字节切片(通过 curl 进行 Base64 编码)。metadata 字段包含:

字段必填详情示例
statusCodeYHTTP 状态码200、404、503
statusY状态描述"200 OK"、"201 Created"
首字母大写的字段N任何首字母大写的字段都将作为请求头部发送"Content-Type"

示例

请求基础 URL

curl -d "{ \"operation\": \"get\" }" \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>
curl -d '{ "operation": "get" }' \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>

请求特定路径

curl -d "{ \"operation\": \"get\", \"metadata\": { \"path\": \"/things/1234\" } }" \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>
curl -d '{ "operation": "get", "metadata": { "path": "/things/1234" } }' \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>

发送和更新数据

要向 HTTP 端点发送数据,请使用 POST、PUT 或 PATCH 方法调用 HTTP binding 并使用以下 JSON 正文:

{
  "operation": "post",
  "data": "content (default is JSON)",
  "metadata": {
    "path": "/things",
    "Content-Type": "application/json; charset=utf-8"
  }
}

示例

发布新记录

curl -d "{ \"operation\": \"post\", \"data\": \"YOUR_BASE_64_CONTENT\", \"metadata\": { \"path\": \"/things\" } }" \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>
curl -d '{ "operation": "post", "data": "YOUR_BASE_64_CONTENT", "metadata": { "path": "/things" } }' \
      http://localhost:<dapr-port>/v1.0/bindings/<binding-name>

使用 HTTPS

通过配置 Dapr 边车以信任服务器的 SSL 证书,HTTP binding 也可以与 HTTPS 端点一起使用。

  1. 将 binding URL 更新为使用 https 而不是 http。
  2. 如果需要添加自定义 TLS 证书,请参阅 如何操作:在 Dapr 边车中安装证书,在边车中安装 TLS 证书。

示例

更新 binding 组件

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
  namespace: <NAMESPACE>
spec:
  type: bindings.http
  version: v1
  metadata:
  - name: url
    value: https://my-secured-website.com # 使用 HTTPS

在边车中安装 TLS 证书

当边车未在容器内运行时,TLS 证书可以直接安装在主机操作系统上。

以下是边车作为容器运行时的示例。SSL 证书位于主机上的 /tmp/ssl/cert.pem。

version: '3'
services:
  my-app:
    # ...
  dapr-sidecar:
    image: "daprio/daprd:1.8.0"
    command: [
      "./daprd",
     "-app-id", "myapp",
     "-app-port", "3000",
     ]
    volumes:
        - "./components/:/components"
        - "/tmp/ssl/:/certificates" # 将证书文件夹挂载到边车容器的 /certificates
    environment:
      - "SSL_CERT_DIR=/certificates" # 将环境变量设置为证书文件夹的路径
    depends_on:
      - my-app

边车可以从各种源读取 TLS 证书。有关更多信息,请参阅 如何操作:将 Pod 卷挂载到 Dapr 边车。在此示例中,我们将 TLS 证书存储为 Kubernetes secret。

kubectl create secret generic myapp-cert --from-file /tmp/ssl/cert.pem

下面的 YAML 是 Kubernetes 部署的示例,该部署将上述 secret 挂载到边车,并设置 SSL_CERT_DIR 以安装证书。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "myapp"
        dapr.io/app-port: "8000"
        dapr.io/volume-mounts: "cert-vol:/certificates" # 将证书文件夹挂载到边车容器的 /certificates
        dapr.io/env: "SSL_CERT_DIR=/certificates" # 将环境变量设置为证书文件夹的路径
    spec:
      volumes:
        - name: cert-vol
          secret:
            secretName: myapp-cert
...

安全地调用 binding

curl -d "{ \"operation\": \"get\" }" \
      https://localhost:<dapr-port>/v1.0/bindings/<binding-name>
curl -d '{ "operation": "get" }' \
      https://localhost:<dapr-port>/v1.0/bindings/<binding-name>

使用 mTLS 或在 HTTPS 的同时启用客户端 TLS 认证

您可以通过在 binding 组件中提供 MTLSRootCA、MTLSClientCert 和 MTLSClientKey 元数据字段,将 HTTP binding 配置为使用 mTLS 或客户端 TLS 认证以及 HTTPS。

这些字段可以作为文件路径或 pem 编码字符串传递:

  • 如果提供文件路径,则读取文件并使用其内容。
  • 如果提供 PEM 编码的字符串,则按原样使用该字符串。

配置这些字段后,Dapr 边车使用提供的证书在 TLS 握手过程中向服务器验证自身。

如果远程服务器强制执行 TLS 重新协商,您还需要设置元数据字段 MTLSRenegotiation。此字段接受以下选项之一:

  • RenegotiateNever
  • RenegotiateOnceAsClient
  • RenegotiateFreelyAsClient

有关更多详细信息,请参阅 Go RenegotiationSupport 文档。

当配置 HTTP binding 进行通信的服务器需要 mTLS 或客户端 TLS 认证时,您可以使用此功能。

相关链接