Now CLoudEvent coming v2.

    最大的变化是将 原先 client 下的 transport 层单独抽出作为 protocol 层.
    即原先为相同的 client , 不同的 如针对 nats 的 transport 层.
    变成了 现在的单独为 nats 适配的 protocol 层. protocol 直接接管了 client 和 transport 的功能.并实现了规定的接口

    以 Nats 举例, 通过 环境变量生成 Nats Protocol . Protocol 包含 Nats.Client
    使用 Protocol 生成 CloudEvent 标准的 Client. 通过永久 for 循环 Client 的 StartReceiver 方法. 这意味着 startReceiver是阻塞的. 查看 Receive 代码可以发现. 每有一个 Goroutine. 一次 StartReceiver 就会多处理一个信息.

    1. package main
    2. import (
    3. "context"
    4. "fmt"
    5. "log"
    6. "github.com/kelseyhightower/envconfig"
    7. cenats "github.com/cloudevents/sdk-go/protocol/nats/v2"
    8. cloudevents "github.com/cloudevents/sdk-go/v2"
    9. )
    10. type envConfig struct {
    11. // NATSServer URL to connect to the nats server.
    12. NATSServer string `envconfig:"NATS_SERVER" default:"http://localhost:4222" required:"true"`
    13. // Subject is the nats subject to subscribe for cloudevents on.
    14. Subject string `envconfig:"SUBJECT" default:"sample" required:"true"`
    15. }
    16. func main() {
    17. var env envConfig
    18. if err := envconfig.Process("", &env); err != nil {
    19. log.Fatalf("Failed to process env var: %s", err)
    20. }
    21. ctx := context.Background()
    22. p, err := cenats.NewConsumer(env.NATSServer, env.Subject, cenats.NatsOptions())
    23. if err != nil {
    24. log.Fatalf("failed to create nats protocol, %s", err.Error())
    25. }
    26. defer p.Close(ctx)
    27. c, err := cloudevents.NewClient(p)
    28. if err != nil {
    29. log.Fatalf("failed to create client, %s", err.Error())
    30. }
    31. for {
    32. if err := c.StartReceiver(ctx, receive); err != nil {
    33. log.Printf("failed to start nats receiver, %s", err.Error())
    34. }
    35. }
    36. }
    37. type Example struct {
    38. Sequence int `json:"id"`
    39. Message string `json:"message"`
    40. }
    41. func receive(ctx context.Context, event cloudevents.Event) error {
    42. fmt.Printf("Got Event Context: %+v\n", event.Context)
    43. data := &Example{}
    44. if err := event.DataAs(data); err != nil {
    45. fmt.Printf("Got Data Error: %s\n", err.Error())
    46. }
    47. fmt.Printf("Got Data: %+v\n", data)
    48. fmt.Printf("----------------------------\n")
    49. return nil
    50. }

    总结:
    CloudEvent 的 go-sdk 虽然没什么大问题, 但是也没什么亮点.各个定义弄得非常复杂.
    event 的不同版本的解析, 编解码, 不够简洁.
    接口定义过多, 不够简洁, 边界没有定义好.
    总的来说, 最多只是一个 sdk 水平.

    事情做得太直接一般不是好程序呢.