七叶笔记 » golang编程 » 容器云全网最新knative-eventing基于事件驱动开发无服务架构案例

容器云全网最新knative-eventing基于事件驱动开发无服务架构案例

今天给大家演示一下官方knative-eventing事件消费 CloudEvent事件的案例,从而帮助我们理解knative-eventing中原理。

1、knative 官方网站地址

2、上传 docker file和相关源码 到带有docker 环境的服务器制作docker镜像文件,并上传镜像私服habor镜像仓库。

官方默认的Dockerfile是需要修改的,主要是国内没办法访问golang.org ,因为 go .mod中使用到了。

 github.com/cloudevents/sdk-go/v2 v2.0.0-RC2
github.com/google/uuid v1.1.1  

国内没办法下载,所以我们需要设置代理,具体修改如下:

 ENV GOPROXY   

接下来我们执行docker build 和 docker push

 docker build -t=yf.registry.965432.com/sjjcb/knative-eventing/helloworld-go:helloworldgo001 .  

接下来我们在用docker push 把创建好的镜像推送到 harbor私有仓库中。

 docker push yf.registry.965432.com/sjjcb/knative-eventing/helloworld-go:helloworldgo001  

3.修改sample-app.yaml 文件上传带有安装好kubectl 的机器

将以下服务定义复制到文件中。确保用 Docker Hub 用户名替换“{username}”

替换刚才创建的私有镜像地址

修改namespace 空间serving-test

修改后的 yaml 如下

 # Namespace for sample application
apiVersion: v1
kind: Namespace
metadata:
  name: serving-test
---
# A default broker
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: default
  namespace: serving-test
  annotations:
    # Note: you can set the eventing.knative.dev/broker.class annotation to change the class of the  Broker .
    # The default broker class is MTChannelBasedBroker, but Knative also supports use of the other class.
    eventing.knative.dev/broker.class: MTChannelBasedBroker
spec: {}
---
# Helloworld-go app deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-go
  namespace: serving-test
spec:
  replicas: 1
  selector:
    matchLabels: &labels
      app: helloworld-go
  template:
    metadata:
      labels: *labels
    spec:
      containers:
        - name: helloworld-go
          image: yf.registry.xx.com/xxx/knative-eventing/helloworld-go:helloworldgo001
---
# Service that exposes helloworld-go app.
# This will be the subscriber for the Trigger
apiVersion: v1
kind: Service
metadata:
  name: helloworld-eventing-go
  namespace: serving-test
spec:
  selector:
    app: helloworld-go
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
# Knative Eventing Trigger to trigger the helloworld-go service
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
  name: helloworld-go
  namespace: serving-test
spec:
  broker: default
  filter:
    attributes:
      type: dev.knative.samples.helloworld
      source: dev.knative.samples/helloworldsource
  subscriber:
    ref:
      apiVersion: v1
      kind: Service
      name: helloworld-go  

将修改后的sample-app.yaml 上传服务器

执行kubectl 命令

 kubectl apply -f sample-app.yaml  

创建后我们看rancher 平台上新增加的 工作负载和服务发现

4.接下来验证和测试发送并验证CloudEvents

Get the Broker URL 我们先获取这个Broker 信息

 kubectl -n serving-test get broker default  

我们记录返回的URL

​ 部署一个curl pod并用SSH连接到其中

 kubectl -n serving-test run curl --image=radial/busyboxplus:curl -it  

执行后我们在rancher平台中创建出一个带URL POD

我们点击这个URL 在“执行命令” 窗口中输入一下信息

 curl -v "#34; -X POST -H "Ce-Id: 536808d3-88be-4077-9d7a-a3f162705f79" -H "Ce-Specversion: 1.0" -H "Ce-Type: dev.knative.samples.helloworld" -H "Ce-Source: dev.knative.samples/helloworldsource" -H "Content-Type: application/json" -d '{"msg":"Hello World from the curl pod."}'  

执行后

控制台立刻返回信息

同时我们在helloworld-go 容器中查看是否能监听到broker 代理转发的事件信息

果然收到事件监听返回信息

 2022/03/05 15:08:59 Event received.

Validation: valid

Context Attributes,

  specversion: 1.0

  type: dev.knative.samples.helloworld

  source: dev.knative.samples/helloworldsource

  id: 536808d3-88be-4077-9d7a-a3f162705f79

  datacontenttype: application/json

Extensions,

  knativearrivaltime: 2022-03-05T15:08:59.768727795Z

Data,

  {

    "msg": "Hello World from the curl pod."

  }

2022/03/05 15:08:59  Hello World  Message from received event "Hello World from the curl pod."

2022/03/05 15:08:59 Responding with event

Validation: valid

Context Attributes,

  specversion: 1.0

  type: dev.knative.samples.hifromknative

  source: knative/eventing/samples/hello-world

  id: 4cee11fa-0d23-4577-808c-299fb70e11ce

  datacontenttype: application/json

Data,

  {

    "msg": "Hi from helloworld-go app!"

  }  

以上我们通过使用curl命令中的CloudEvent属性和触发器监听到消息。

从上面的实例中是个典型的代理与触发器 模式。

为了更容易地过滤事件,Knative Eventing定义了代理 (Broker)和触发器(Trigger)对象。代理提供了一个可以通过属性选择的事件桶。它接收并转发事件 到由一个或多个匹配的Trigger所定义的订阅者中。 触发器描述了一个基于事件属性的过滤器,该事件将被传递给可 寻址对象。你可以按需创建多个触发器。

对于每个代理,Knative Eventing会隐式地创建一个通道。 Trigger会订阅Broker,并将过滤器作用到消息上。过滤器通过 CloudEvent消息的属性过滤相应的消息,然后将消息传递给感兴趣的 订阅者,下面一张图可以很好地解释。

好了今天的分享就到这里,感兴趣的小伙伴可以持续关注,我后面将陆续介绍Event 其他案例以及原理等。

相关文章