跳至內容

串連至另一個 Sequence 的 Sequence

我們將建立以下邏輯配置。我們建立一個 PingSource,將事件饋送至 Sequence,然後取得該 Sequence 的輸出並將其傳送至第二個 Sequence,最後顯示結果輸出。

Logical Configuration

這些範例中使用的函式位於 https://github.com/knative/eventing/blob/main/cmd/appender/main.go

先決條件

在此範例中,我們假設您已設定 InMemoryChannel 以及 Knative Serving(用於我們的函式)。這些範例使用 default 命名空間,同樣地,如果您想部署到另一個命名空間,您需要修改範例以反映這一點。

如果您想使用不同類型的 Channel,您必須修改 Sequence.Spec.ChannelTemplate 以建立適當的 Channel 資源。

設定

建立 Knative 服務

變更以下命令中的 default,以在您要建立資源的命名空間中建立步驟

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: first
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 0"

---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: second
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 1"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: third
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 2"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: fourth
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 3"

---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: fifth
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 4"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: sixth
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
          env:
            - name: MESSAGE
              value: " - Handled by 5"
---
kubectl -n default create -f ./steps.yaml

建立第一個 Sequence

sequence1.yaml 檔案包含建立 Sequence 的規格。如果您使用不同類型的 Channel,您需要變更 spec.channelTemplate 以指向您想要的 Channel。

apiVersion: flows.knative.dev/v1
kind: Sequence
metadata:
  name: first-sequence
spec:
  channelTemplate:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
  steps:
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: first
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: second
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: third
  reply:
    ref:
      kind: Sequence
      apiVersion: flows.knative.dev/v1
      name: second-sequence

變更以下命令中的 default,以在您要建立資源的命名空間中建立 Sequence

kubectl -n default create -f ./sequence1.yaml

建立第二個 Sequence

sequence2.yaml 檔案包含建立 Sequence 的規格。如果您使用不同類型的 Channel,您需要變更 spec.channelTemplate 以指向您想要的 Channel。

apiVersion: flows.knative.dev/v1
kind: Sequence
metadata:
  name: second-sequence
spec:
  channelTemplate:
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel
  steps:
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: fourth
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: fifth
    - ref:
        apiVersion: serving.knative.dev/v1
        kind: Service
        name: sixth
  reply:
    ref:
      kind: Service
      apiVersion: serving.knative.dev/v1
      name: event-display
kubectl -n default create -f ./sequence2.yaml

建立顯示 Sequence 建立的事件的服務

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: event-display
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display

變更以下命令中的 default,以在您要建立資源的命名空間中建立 Sequence

kubectl -n default create -f ./event-display.yaml

建立以第一個 Sequence 為目標的 PingSource

這將建立一個 PingSource,它將每 2 分鐘傳送一個 CloudEvent,其中包含 {"message": "Hello world!"} 作為資料酬載。

apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: ping-source
spec:
  schedule: "*/2 * * * *"
  contentType: "application/json"
  data: '{"message": "Hello world!"}'
  sink:
    ref:
      apiVersion: flows.knative.dev/v1
      kind: Sequence
      name: first-sequence
kubectl -n default create -f ./ping-source.yaml

檢查結果

您現在可以透過檢查 event-display pod 的記錄來查看最終輸出。

kubectl -n default get pods

然後查看 event-display pod 的記錄

kubectl -n default logs -l serving.knative.dev/service=event-display -c user-container --tail=-1
☁️  cloudevents.Event
Validation: valid
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/default/pingsources/ping-source
  id: 29d531df-78d8-4d11-9ffd-ba24045241a9
  time: 2020-03-02T21:18:00.0011708Z
  datacontenttype: application/json
Extensions,
  knativehistory: first-sequence-kn-sequence-0-kn-channel.default.svc.cluster.local; first-sequence-kn-sequence-1-kn-channel.default.svc.cluster.local; first-sequence-kn-sequence-2-kn-channel.default.svc.cluster.local; second-sequence-kn-sequence-0-kn-channel.default.svc.cluster.local; second-sequence-kn-sequence-1-kn-channel.default.svc.cluster.local; second-sequence-kn-sequence-2-kn-channel.default.svc.cluster.local
  traceparent: 00-e5abc9de525a89ead80560b8f328de5c-fc12b64a6296f541-00
Data,
  {
    "id": 0,
    "message": "Hello world! - Handled by 0 - Handled by 1 - Handled by 2 - Handled by 3 - Handled by 4 - Handled by 5"
  }

您可以看到初始 PingSource 訊息 ("Hello World!") 已被 Sequence 中的每個步驟附加到其中。

我們使用分析和 Cookie 來了解網站流量。您的網站使用資訊會與 Google 分享,以達到此目的。了解更多。