10-Flow

1 Knative Event Flow

  • Importer

    • 连接至期望使用的第3方消息系统
    • 基于HTTP协议POST CloudEvents到Channel、Broker、Sequence/Parallel或Service/KService
  • Channel

    • 支持多路订阅
    • 为订阅者“持久化”消息数据
  • Service

    • 接收CloudEvents
    • (可选)回复处理后的数据

    在这里插入图片描述

  • Sequence

    • Kubernetes CRD资源类型
    • 串联多个Processor
    • 由多个有序的Step组成,每个step定义一个Subscriber
    • Step间的channel,由channeltemplate定义

    在这里插入图片描述

  • Parallel:根据不同的过滤条件对事件进行选择处理

    • Kubernetes CRD资源类型
    • 由多个条件式的并行Branch组成,每个Branch由一对Filter及Subscriber组成
      • 每个Filter即为一个Processor
    • Channel由由ChannelTemplate定义

    在这里插入图片描述

2 Sequence Flow示例

  • Sequence资源的期望状态(spec)主要包括三个字段

    • steps
      • 定义序列中的目的地(processor)列表
      • 按顺序调用
      • 每个step中还可以定义投递属性,主要定义event投递失败时的处理方案
    • channelTemplate
      • 指定要使用的ChannelCRD
      • 未指定时,将使用当前的namespace或者cluster中默认的Channel CRD
    • reply
      • 序列中最后一个subscriber处理后的信息所要发往的目的地
  • 示例环境说明

    • Curl命令负责生成event
    • Event由Sequence中的各Step顺次处理
      • 各Step都运行一个appender应用
      • 分别向收到的数据尾部附加自定义的专有数据项
    • 最终结果发往ksvc/event-display,进行展示

    在这里插入图片描述

  • 准备实践环境

    • 定义Sequence里,三个step中的knative service

      kn service apply sq-appender-01 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-01"kn service apply sq-appender-02 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-02"$ kn service apply sq-appender-03 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-03"
      
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: sq-appender-01
      spec:template:spec:containers:- image: ikubernetes/appenderenv:- name: MESSAGEvalue: " - Handled by SQ-01"
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: sq-appender-02
      spec:template:spec:containers:- image: ikubernetes/appenderenv:- name: MESSAGEvalue: " - Handled by SQ-02"
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: sq-appender-03
      spec:template:spec:containers:- image: ikubernetes/appenderenv:- name: MESSAGEvalue: " - Handled by SQ-03"
      ---
      

      在这里插入图片描述

    • 负责最后接收事件的Kservice/event-display

       kn service apply event-display --image=ikubernetes/event_display --port 8080 --scale-min 1 -n event-demo
      
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: event-display
      spec:template:metadata:annotations:autoscaling.knative.dev/min-scale: "1"spec:containers:- image: ikubernetes/event_displayports:- containerPort: 8080
      
    • 创建Sequence资源

      apiVersion: flows.knative.dev/v1
      kind: Sequence
      metadata:name: sq-demo
      spec:channelTemplate:apiVersion: messaging.knative.dev/v1kind: InMemoryChannelsteps:- ref:apiVersion: serving.knative.dev/v1kind: Servicename: sq-appender-01- ref:apiVersion: serving.knative.dev/v1kind: Servicename: sq-appender-02- ref:apiVersion: serving.knative.dev/v1kind: Servicename: sq-appender-03reply:ref:kind: ServiceapiVersion: serving.knative.dev/v1name: event-display
      

      查看sequence资源:

      kubectl get sequences
      # URL中的地址,即为当前sequence的调用接口
      

      在这里插入图片描述

    • 测试

      • 创建一个客户端Pod,使用curl命令基于HTTP协议推送event

         kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never --rm -it --command -- /bin/bash
        
      • 在启动的客户端Pod中,向Sequence/sq-demo的URL发起事件推送事件即可启动测试

         curl -v "http://sq-demo-kn-sequence-0-kn-channel.default.svc.cluster.local" -X POST -H "Content-Type: application/cloudevents+json" \
        -d '{"id": "0", "specversion": "1.0", "type": "com.icloud2native.sayhi", "source": "Curl", "data": {"message":"Hello Knative Eventing Flow"}}'
        

        在这里插入图片描述

      • 在最后一个event-display的日志中查看事件

        在这里插入图片描述

3 Parallel Flow 示例

  • Parallel资源的期望状态(spec)主要包括三个字段

    • branches
      • 每个分支由一个filter和一个subscriber组成
      • filter负责定义过滤器,将符合条件的事件发给相应的subscriber
      • subscriber负责定义processor,将filter过滤的事件做相应处理
      • 结果发往reply或全局的reply
    • channelTemplate
      • 指定要使用的Channel CRD
      • 未指定时,将使用当前namespace或者Cluster中默认的Channel CRD
    • reply
      • 为所有branch处理后的信息定义一个全局目的地
  • 示例环境说明

    • Curl命令负责生成event
    • Parallel中有两个Branch
      • 使用kservice/image-filter作为Filter,筛选类型为“com.icloud2native.file.image”的事件,相应的Subscriber为ksvc/paraappender-image,负责将该类事件信息标识为Image;
      • 使用kservice/text-filter作为Filter,筛选类型为“com.icloud2native.file.text”的事件,相应的Subscriber为ksvc/para-appender-text ,负责将该类事件信息标识为Text;
    • 所有分支的最终结果均发往ksvc/event-display,内容格式化CloudEvents存储入日志

    在这里插入图片描述

  • 具体步骤

    • 创建两个filter

      kn service apply image-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.icloud2native.file.image"'
      kn service apply text-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.icloud2native.file.text"'
      
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: image-filter
      spec:template:spec:containers:- image: villardl/filter-nodejs:0.1env:- name: FILTERvalue: |event.type == "com.icloud2native.file.image"
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: text-filter
      spec:template:spec:containers:- image: villardl/filter-nodejs:0.1env:- name: FILTERvalue: |event.type == "com.icloud2native.file.text"
      ---
      

      在这里插入图片描述

    • 创建两个subscriber

      kn service apply para-appender-image --image ikubernetes/appender --env MESSAGE=" - filetype/Image"
      kn service apply para-appender-text --image ikubernetes/appender --env MESSAGE=" - filetype/Text"
      
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: para-appender-image
      spec:template:spec:containers:- image: ikubernetes/appenderenv:- name: MESSAGEvalue: " - filetype/Image"
      ---
      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:name: para-appender-text
      spec:template:spec:containers:- image: ikubernetes/appenderenv:- name: MESSAGEvalue: " - filetype/Text"
      ---
      

      在这里插入图片描述

    • 负责最后接收事件的Kservice/event-display

      kn service apply event-display --image=ikubernetes/event_display --port 8080 --scale-min 1
      
    • 创建并查看Parallel资源

      ---
      apiVersion: flows.knative.dev/v1
      kind: Parallel
      metadata:name: filetype-parallel
      spec:channelTemplate:apiVersion: messaging.knative.dev/v1kind: InMemoryChannelbranches:- filter:ref:apiVersion: serving.knative.dev/v1kind: Servicename: image-filtersubscriber:ref:apiVersion: serving.knative.dev/v1kind: Servicename: para-appender-image- filter:ref:apiVersion: serving.knative.dev/v1kind: Servicename: text-filtersubscriber:ref:apiVersion: serving.knative.dev/v1kind: Servicename: para-appender-textreply:ref:apiVersion: serving.knative.dev/v1kind: Servicename: event-display
      

      查看parallel资源

       kubectl get parallels# URL中的地址,即为当前Parallel资源的调用接
      

      在这里插入图片描述

    • 测试

      • 创建一个客户端Pod,使用curl命令基于HTTP协议推送event

         kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never --rm -it --command -- /bin/bash
        
      • 在启动的客户端Pod中,向Parallel/filetype-parallel资源的URL发起事件推送事件即可启动测试

        # 首先推送一个类型为com.icloud2native.file.image的事件curl -v "http://filetype-parallel-kn-parallel-kn-channel.default.svc.cluster.local" -X POST \
        -H "Ce-Id: 0" \
        -H "Ce-Specversion: 1.0" \
        -H "Ce-Type: com.icloud2native.file.image" \
        -H "Ce-Source: Curl" \
        -H "Content-Type: application/json" \
        -d '{"message": "A uploaded file by a user"}'#  然后再推送一个类型为com.icloud2native.file.image的事件curl -v "http://filetype-parallel-kn-parallel-kn-channel.default.svc.cluster.local" -X POST \
        -H "Ce-Id: 0" \
        -H "Ce-Specversion: 1.0" \
        -H "Ce-Type: com.icloud2native.file.text" \
        -H "Ce-Source: Curl" \
        -H "Content-Type: application/json" \
        -d '{"message": "A uploaded file by a user"}'
        
      • 在ksvc/event-display的日志中查看事件数据,验证事件是否被不同的branch做了不同的处理

        在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284368.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hive】——DML

1 Load(加载数据) 1.1 概述 1.2 语法 LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1val1, partcol2val2 ...)]LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol…

Python 高德地图POI信息爬取代码详解

1. 函数要点整理 get_amap_poi(city, keywords, page) 这个函数旨在从高德地图中提取指定城市的POI(Point of Interest)信息。以下是函数的参数和返回值说明: 参数: city: 城市名称,指定要搜索的城市。keywords: 关键…

如何正确选择高速探头

最近看到一篇关于高速探头在DDR5测试中的应用文章,才发现探头的架构原来大有讲究,远远不是简单地带宽越高效果越好,而是需要根据测试对象进行合理地选择。 与示波器一起使用的高频电压探头会对其所连接的电路产生各种类型的负载效应&#xff…

Linux5.3、进程替换

个人主页:Lei宝啊 愿所有美好如期而遇 目录 替换原理 替换函数 函数解释 替换原理 当一个进程调用进程替换函数时,该进程的数据和代码完全被新程序的代码和数据所代替,而后重新构建页表的映射关系,进程还是之前的进程&#…

什么是SPEC基准测试?

SPEC服务器应用性能测试是一个全面衡量Web应用中java企业应用服务器性能的基础测试。 SPEC(the Standard Performance Evaluation Corporation标准性能评估机构)是一个全球性的、权威的第三方应用性能测试组织,它旨在确立、修改以及认定一系列服务器应用性能评估的…

SpringBoot配置mysql加密之Druid方式

一、导入Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>二、生成密文 方式1. 找到存放druid jar包的目录 1-1、在目录…

【企业转型】以企业架构为中心的SABOE数字化转型五环法

01 传统企业数字化转型面临诸多挑战 即将过去的2023年&#xff0c;chatGPT大模型、数据资产入表等事件的发生&#xff0c;标志着数字经济正在加速发展。数字经济是人类社会继农业经济、工业经济之后的第三种经济形态&#xff0c;将推动生产方式、生活方式和治理方式深刻变革&a…

Java研学-JavaScript 进阶

一 JS 的 DOM 1 概述 DOM 是 Document Object Model 文档对象模型的缩写。根据 W3C 的 DOM 规范&#xff0c;它是一种与浏览器&#xff0c;平台&#xff0c;语言无关的接口&#xff0c;能够动态地修改 XML 和 HTML。   D&#xff1a;文档 – HTML文档 或 XML 文档   O&…

CSS学习笔记整理

CSS 即 层叠样式表/CSS样式表/级联样式表&#xff0c;也是标记语言&#xff0c; 用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距&#xff09;以及版面的布局和外观显示样式 目录 准备工作 Chrome调…

基于FPGA的温度控制系统设计(论文+源码)

1.系统设计 本次基于FPGA的智能温度控制系统&#xff0c;以FPGA为控制核心&#xff0c;采用自顶向下的设计方法&#xff0c;按照模块化设计的思路分别实现各个模块&#xff0c;再加以整合实现整个系统&#xff0c;从而达到了温度控制的目的。系统以水箱为被控对象&#xff0c;…

环境搭建及源码运行_java环境搭建_redis安装

书到用时方恨少、觉知此时要躬行&#xff1b;拥有技术&#xff0c;成就未来&#xff0c;抖音视频教学地址&#xff1a;​​​​​​​ ​​​​​​​​​​​​​​ 1、redis 介绍 后面会有精讲redis部分&#xff0c;此部分内容着重在redis环境的搭建 Redis&#xff08;Remot…

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右&#xff0c;在此基础上也问了一些大佬&#xff0c;最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…