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/pathhttp://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

MTLSRootCAMTLSClientCertMTLSClientKey 的值可以通过三种方式提供:

  • 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 状态码200404503
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 端点发送数据,请使用 POSTPUTPATCH 方法调用 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 组件中提供 MTLSRootCAMTLSClientCertMTLSClientKey 元数据字段,将 HTTP binding 配置为使用 mTLS 或客户端 TLS 认证以及 HTTPS。

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

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

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

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

  • RenegotiateNever
  • RenegotiateOnceAsClient
  • RenegotiateFreelyAsClient

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

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

相关链接