绑定

创建一个绑定组件只需要几个基本步骤。

导入绑定包

创建文件components/inputbinding.go并为状态存储相关的包添加import语句。

  1. package components
  2. import (
  3. "context"
  4. "github.com/dapr/components-contrib/bindings"
  5. )

输入绑定: 实现InputBinding接口

创建一个实现InputBinding接口的类型。

  1. type MyInputBindingComponent struct {
  2. }
  3. func (component *MyInputBindingComponent) Init(meta bindings.Metadata) error {
  4. // Called to initialize the component with its configured metadata...
  5. }
  6. func (component *MyInputBindingComponent) Read(ctx context.Context, handler bindings.Handler) error {
  7. // Until canceled, check the underlying store for messages and deliver them to the Dapr runtime...
  8. }

调用Read()方法应该设置一个长期存在的机制来获取消息,但立即返回nil(或错误,如果无法设置该机制)。 当被取消时(例如,通过ctx.Done()或ctx.Err() != nil),机制应该结束。 当消息从组件的底层存储中读取时,它们通过handler回调函数传递给Dapr运行时,直到应用程序(由Dapr运行时提供服务)确认处理消息后才返回。

  1. func (b *MyInputBindingComponent) Read(ctx context.Context, handler bindings.Handler) error {
  2. go func() {
  3. for {
  4. err := ctx.Err()
  5. if err != nil {
  6. return
  7. }
  8. messages := // Poll for messages...
  9. for _, message := range messages {
  10. handler(ctx, &bindings.ReadResponse{
  11. // Set the message content...
  12. })
  13. }
  14. select {
  15. case <-ctx.Done():
  16. case <-time.After(5 * time.Second):
  17. }
  18. }
  19. }()
  20. return nil
  21. }

输出绑定: 实现OutputBinding接口

创建一个实现OutputBinding接口的类型。

  1. type MyOutputBindingComponent struct {
  2. }
  3. func (component *MyOutputBindingComponent) Init(meta bindings.Metadata) error {
  4. // Called to initialize the component with its configured metadata...
  5. }
  6. func (component *MyOutputBindingComponent) Invoke(ctx context.Context, req *bindings.InvokeRequest) (*bindings.InvokeResponse, error) {
  7. // Called to invoke a specific operation...
  8. }
  9. func (component *MyOutputBindingComponent) Operations() []bindings.OperationKind {
  10. // Called to list the operations that can be invoked.
  11. }

输入和输出绑定组件

组件可以是 即是 输入 又是 输出绑定。 只需实现两个接口并将组件注册为两种绑定类型。

注册绑定组件

在主应用程序文件中(例如,main.go),将绑定组件注册到应用程序。

  1. package main
  2. import (
  3. "example/components"
  4. dapr "github.com/dapr-sandbox/components-go-sdk"
  5. "github.com/dapr-sandbox/components-go-sdk/bindings/v1"
  6. )
  7. func main() {
  8. // Register an import binding...
  9. dapr.Register("my-inputbinding", dapr.WithInputBinding(func() bindings.InputBinding {
  10. return &components.MyInputBindingComponent{}
  11. }))
  12. // Register an output binding...
  13. dapr.Register("my-outputbinding", dapr.WithOutputBinding(func() bindings.OutputBinding {
  14. return &components.MyOutputBindingComponent{}
  15. }))
  16. dapr.MustRun()
  17. }

下一步