The documentation you are viewing is for Dapr v1.5 which is an older version of Dapr. For up-to-date documentation, see the latest version.

客户端

Dapr 客户端包允许您与 Go 应用程序的其他 Dapr 应用程序进行交互。

先决条件

导入包

import "github.com/dapr/go-sdk/client"

构建块

Go SDK 允许您与所有 Dapr 构建块 进行交互。

服务调用

要在使用 Dapr sidecar 运行的另一个服务上调用特定方法,Dapr 客户端 Go SDK 提供了两个选项:

调用没有数据的服务:

resp, err := client.InvokeMethod(ctx, "app-id", "method-name", "post")

使用数据调用服务:

content := &dapr.DataContent{
    ContentType: "application/json",
    Data:        []byte(`{ "id": "a123", "value": "demo", "valid": true }`),
}

resp, err = client.InvokeMethodWithContent(ctx, "app-id", "method-name", "post", content)

状态管理

对于简单的用例,Dapr客户端提供了易于使用的 Save, Get, Delete 方法:

ctx := context.Background()
data := []byte("hello")
store := "my-store" // defined in the component YAML 

// save state with the key key1, default options: strong, last-write
if err := client.SaveState(ctx, store, "key1", data); err != nil {
    panic(err)
}

// get state for key key1
item, err := client.GetState(ctx, store, "key1")
if err != nil {
    panic(err)
}
fmt.Printf("data [key:%s etag:%s]: %s", item.Key, item.Etag, string(item.Value))

// delete state for key key1
if err := client.DeleteState(ctx, store, "key1"); err != nil {
    panic(err)
}

为了获得更精细的控制,Dapr Go 客户端公开了 setStateItem 类型 ,该类型可用于更好地控制状态操作,并允许一次保存多个项目:

item1 := &dapr.SetStateItem{
    Key:  "key1",
    Etag: &ETag{
        Value: "1",
    },
    Metadata: map[string]string{
        "created-on": time.Now().UTC().String(),
    },
    Value: []byte("hello"),
    Options: &dapr.StateOptions{
        Concurrency: dapr.StateConcurrencyLastWrite,
        Consistency: dapr.StateConsistencyStrong,
    },
}

item2 := &dapr.SetStateItem{
    Key:  "key2",
    Metadata: map[string]string{
        "created-on": time.Now().UTC().String(),
    },
    Value: []byte("hello again"),
}

item3 := &dapr.SetStateItem{
    Key:  "key3",
    Etag: &dapr.ETag{
    Value: "1",
    },
    Value: []byte("hello again"),
}

if err := client.SaveBulkState(ctx, store, item1, item2, item3); err != nil {
    panic(err)
}

同样, GetBulkState 方法提供了在单个操作中检索多个状态项的方法:

keys := []string{"key1", "key2", "key3"}
items, err := client.GetBulkState(ctx, store, keys, nil,100)

ExecuteStateTransaction 以事务方式执行多个 upsert 或删除操作的方法。

ops := make([]*dapr.StateOperation, 0)

op1 := &dapr.StateOperation{
    Type: dapr.StateOperationTypeUpsert,
    Item: &dapr.SetStateItem{
        Key:   "key1",
        Value: []byte(data),
    },
}
op2 := &dapr.StateOperation{
    Type: dapr.StateOperationTypeDelete,
    Item: &dapr.SetStateItem{
        Key:   "key2",
    },
}
ops = append(ops, op1, op2)
meta := map[string]string{}
err := testClient.ExecuteStateTransaction(ctx, store, meta, ops)

发布消息

要将数据发布到主题上,Dapr Go 客户端提供了一个简单的方法:

data := []byte(`{ "id": "a123", "value": "abcdefg", "valid": true }`)
if err := client.PublishEvent(ctx, "component-name", "topic-name", data); err != nil {
    panic(err)
}

输出绑定

Dapr Go 客户端 SDK 提供了两种方法来调用 Dapr 定义的绑定的操作。 Dapr 支持输入、输出和双向绑定。

简单地说,只输出绑定:

in := &dapr.InvokeBindingRequest{ Name: "binding-name", Operation: "operation-name" }
err = client.InvokeOutputBinding(ctx, in)

要调用含量和元数据的方法:

in := &dapr.InvokeBindingRequest{
    Name:      "binding-name",
    Operation: "operation-name",
    Data: []byte("hello"),
    Metadata: map[string]string{"k1": "v1", "k2": "v2"},
}

out, err := client.InvokeBinding(ctx, in)

密钥管理

Dapr客户端还提供访问运行时的密钥,可以由任何数量的密钥存储支持(例如: Kubernetes Secs, HashiCorp Vault, or Azure KeyVault):

opt := map[string]string{
    "version": "2",
}

secret, err := client.GetSecret(ctx, "store-name", "secret-name", opt)

授权

默认情况下,Dapr依靠网络边界限制对其API的访问。 然而,如果目标Dapr API 使用基于令牌的身份验证配置,用户可以通过以下两种方式配置Go Dapr客户端:

环境变量

如果定义了 DAPR_API_TOKEN环境变量,Dapr 将自动使用它来增加它的 Dapr API 调用来确保身份验证。

明确的方法

此外,用户还可以在任何 Dapr 客户端实例上明确地设置API令牌。 当用户代码需要为不同的Dapr API 端点创建多个客户端时,此方法是有用的。

func main() {
    client, err := dapr.NewClient()
    if err != nil {
        panic(err)
    }
    defer client.Close()
    client.WithAuthToken("your-Dapr-API-token-here")
}

相关链接