Dapr HTTP 服务 SDK for Go 入门

如何使 Dapr HTTP 服务 SDK for Go 启动和运行

前提条件

首先导入 Dapr Go service/http 包:

  1. daprd "github.com/dapr/go-sdk/service/http"

创建和启动服务

要创建 HTTP Dapr 服务,首先创建一个具有特定地址的 Dapr 回调实例:

  1. s := daprd.NewService(":8080")

如果想合并一个已存在的服务,可以用该服务的的地址和http.ServeMux:

  1. mux := http.NewServeMux()
  2. mux.HandleFunc("/", myOtherHandler)
  3. s := daprd.NewServiceWithMux(":8080", mux)

一旦你创建了一个服务实例,你就可以给该服务 “附加 “任何数量的事件、绑定和服务调用逻辑处理程序。 只要逻辑定义好,即可启动服务:

  1. if err := s.Start(); err != nil && err != http.ErrServerClosed {
  2. log.Fatalf("error: %v", err)
  3. }

事件处理

要处理来自特定主题的事件,您需要在启动服务之前至少添加一个主题事件handler:

  1. sub := &common.Subscription{
  2. PubsubName: "messages",
  3. Topic: "topic1",
  4. Route: "/events",
  5. }
  6. err := s.AddTopicEventHandler(sub, eventHandler)
  7. if err != nil {
  8. log.Fatalf("error adding topic subscription: %v", err)
  9. }

handler 本身可以是具有预期签名的任何方法:

  1. func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) {
  2. log.Printf("event - PubsubName:%s, Topic:%s, ID:%s, Data: %v", e.PubsubName, e.Topic, e.ID, e.Data)
  3. // do something with the event
  4. return true, nil
  5. }

可选地,您可以使用routing rules根据CloudEvent的内容将消息发送到不同的处理程序。

  1. sub := &common.Subscription{
  2. PubsubName: "messages",
  3. Topic: "topic1",
  4. Route: "/important",
  5. Match: `event.type == "important"`,
  6. Priority: 1,
  7. }
  8. err := s.AddTopicEventHandler(sub, importantHandler)
  9. if err != nil {
  10. log.Fatalf("error adding topic subscription: %v", err)
  11. }

服务调用处理

要处理服务调用,您需要在启动服务之前添加至少一个服务调用handler:

  1. if err := s.AddServiceInvocationHandler("/echo", echoHandler); err != nil {
  2. log.Fatalf("error adding invocation handler: %v", err)
  3. }

handler 本身可以是具有预期签名的任何方法:

  1. func echoHandler(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error) {
  2. log.Printf("echo - ContentType:%s, Verb:%s, QueryString:%s, %+v", in.ContentType, in.Verb, in.QueryString, string(in.Data))
  3. // do something with the invocation here
  4. out = &common.Content{
  5. Data: in.Data,
  6. ContentType: in.ContentType,
  7. DataTypeURL: in.DataTypeURL,
  8. }
  9. return
  10. }

绑定调用处理

  1. if err := s.AddBindingInvocationHandler("/run", runHandler); err != nil {
  2. log.Fatalf("error adding binding handler: %v", err)
  3. }

handler 本身可以是具有预期签名的任何方法:

  1. func runHandler(ctx context.Context, in *common.BindingEvent) (out []byte, err error) {
  2. log.Printf("binding - Data:%v, Meta:%v", in.Data, in.Metadata)
  3. // do something with the invocation here
  4. return nil, nil
  5. }

相关链接