首页 > 其他分享 >CloudEvents-云原生事件规范

CloudEvents-云原生事件规范

时间:2024-06-17 17:09:55浏览次数:22  
标签:原生 CloudEvents spring 规范 cloudevents 事件 type event

简介

CloudEvents 是一种定义事件数据在云端应用之间如何交付的规范,这是由 Cloud Native Computing Foundation(CNCF)的 Serverless 工作小组开发的。通过提供统一的事件格式,CloudEvents 旨在简化跨服务、平台和供应商的事件交付。
CloudEvents位于CNCF全景图的”流和消息“
image.png

为什么要使用CloudEvents

在微服务和分布式系统中,事件驱动架构是一种常用模式,各种服务通过发布和订阅事件来进行交互。然而,由于各种服务可能使用不同的框架和平台,因此,一个通用的、跨平台的事件格式就变得尤为重要。这就是为什么需要使用 CloudEvents。
使用 CloudEvents 主要有以下优势:

  • 标准化:CloudEvents 提供了一个标准的事件格式,包括一组必备的属性,比如source、type、id等,并定义如何编码和传输这些事件。这让不同的服务,即使在不同的环境和语言中,也能以一种一致的方式处理事件。
  • 互操作性:由于 CloudEvents 是标准化的,它提高了互操作性。无论是在服务、云提供商、API 网关,甚至函数即服务(FaaS)平台之间,都可以通过 CloudEvents 进行交互。
  • 简化开发:有了 CloudEvents,开发者可以不必关心不同服务和平台的特异性,只需要关注业务逻辑即可。这极大地简化了开发流程,提高了效率。
  • 易于跟踪:CloudEvents 的标头中包括许多关于事件源、类型和 id 等信息,便于对事件进行追踪,提高运维效率。

总的来说,使用 CloudEvents 可以简化跨服务事件的处理流程,并提高互操作性和开发效率,是云原生开发中的一个重要工具。

CloudEvents格式规范

CloudEvents 是一个规范,定义了事件数据的标准和统一格式,以便在应用、服务和系统之间进行交互时保持一致性并提高互通性。CloudEvents 指定几个必要的属性以标记和描述事件数据,这些属性包括:
id: 事件的唯一标识符。
source: 定义事件发生的位置(通常是 URI)。
specversion: CloudEvents 规范的版本(例如,1.0)。
type: 描述事件类型的字符串,通常是由产生该事件的系统定义。
除了这些必须的属性外,CloudEvents 还有几个可选的属性,如:
datacontenttype: 描述 data 的媒体类型的字符串(例如,application/json)。
dataschema: 识别 data 内容使用的模式的 URI。
time: 事件产生的时间,记录为 RFC3339 时间戳。
subject: 描述 source 的主题。
消息的主体部分(data)可以包含特定于事件和其 type 的任何其他数据。具体的 data 结构完全由发件人和收件人之间的约定来确定。
以下是一个例子,它是一个 JSON 编码的 CloudEvents

{
    "specversion" : "1.0",
    "type" : "com.github.pull.create",
    "source" : "https://github.com/cloudevents/spec/pull/123",
    "subject" : "123",
    "id" : "A234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "comexampleextension1" : "value",
    "datacontenttype" : "text/xml",
    "data" : "<much wow=\"xml\"/>"
}

Demo

以spring boot为例,pom.xml加入cloud-events的sdk

<properties>
  <cloudevents.version>2.3.0</cloudevents.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <!--引入cloudevents依赖-->
  <dependency>
    <groupId>io.cloudevents</groupId>
    <artifactId>cloudevents-spring</artifactId>
    <version>${cloudevents.version}</version>
  </dependency>
  <dependency>
    <groupId>io.cloudevents</groupId>
    <artifactId>cloudevents-json-jackson</artifactId>
    <version>${cloudevents.version}</version>
  </dependency>
  <dependency>
    <groupId>io.cloudevents</groupId>
    <artifactId>cloudevents-http-basic</artifactId>
    <version>${cloudevents.version}</version>
  </dependency>
</dependencies>

配置消息转换器CloudEventHandlerConfiguration.java

@Configuration
public class CloudEventHandlerConfiguration implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new CloudEventHttpMessageConverter());
    }
}

新建一个Controller用于测试

@RestController
public class CloudEventsDemoController {
    private static final ObjectMapper objectMapper  = new ObjectMapper();
    @PostMapping("/echo2")
    public void ce(@RequestBody CloudEvent event) {
        //  此处集成jackson 以及cloudevent 数据格式,方便消息体处理
        CloudEvent event1 = CloudEventBuilder.from(event)
        .withId(UUID.randomUUID().toString())
        .withSource(URI.create("https://spring.io/foos"))
        .withType("io.spring.event.Foo")
        .withData(event.getData().toBytes())
        .build();
        PojoCloudEventData<UserEntity> cloudEventData = mapData(
            event1,
            PojoCloudEventDataMapper.from(objectMapper,UserEntity.class)
        );
        UserEntity user = cloudEventData.getValue();
        System.out.println(user.toString());
        System.out.println(event1);
    }
    @PostMapping("/echo")
    public ResponseEntity<UserEntity> echo(@RequestBody UserEntity foo, @RequestHeader HttpHeaders headers) {
        CloudEvent attributes = CloudEventHttpUtils.fromHttp(headers)
        .withId(UUID.randomUUID().toString())
        .withSource(URI.create("https://cloudevent-demo/echo"))
        .withType("io.spring.event.cloudevent-demo")
        .build();
        HttpHeaders outgoing = CloudEventHttpUtils.toHttp(attributes);
        return ResponseEntity.ok().headers(outgoing).body(foo);
    }


}

模拟客户端请求

curl -X POST -v -d '{"name": "linwj44", "age": 23}' \
    -H 'Content-type: application/octet-stream' \
    -H 'Ce-id: 1' \
    -H 'Ce-source: cloud-event-example' \
    -H 'Ce-type: happybirthday.myapplication' \
    -H 'Ce-specversion: 1.0' \
    http://localhost:8080/echo2

标签:原生,CloudEvents,spring,规范,cloudevents,事件,type,event
From: https://www.cnblogs.com/chenfyuan/p/18252070

相关文章

  • 高效开发系列:鸿蒙原生app套用混合app开发思路
    2024年,似乎华为迎来了新的企业机遇--鸿蒙独立操作系统。 受到全球国际形势的影响,加之第四次科技革命(AI革命)冷不丁的出现,在他国AI技术领先的前提下,中国自主研发的独立操作系统再次提上新的战略高度。其中,鸿蒙独立操作系统(HarmonyOS)就是大新创/国产操作系统的新高度。 鸿......
  • [LCTF 2018]bestphp's revenge php原生类的利用以及php_session反序列化相关
    今天继续来一道反序列化的题目。点击查看代码<?phphighlight_file(__FILE__);$b='implode';call_user_func($_GET['f'],$_POST);session_start();if(isset($_GET['name'])){$_SESSION['name']=$_GET['name'];}var_dump......
  • 云原生周刊:Harbor v2.11 版本发布 | 2024.6.17
    开源项目推荐DeschedulerDescheduler是一个工具,可用于优化Kubernetes集群中Pod的部署位置。它可以找到可以移动的Pod,并将其驱逐,让默认调度器将它们重新调度到更合适的节点上。ProwlerProwler是一款适用于AWS、Azure、GCP和Kubernetes的开源安全工具,用于进行安全评......
  • 数据库原理(关系数据库规范化理论)——(4)
    一、关系模式规范化的必要性1.关系可能出现的问题数据冗余大;插入异常;删除异常;更新异常;2.关系模式应满足的基本要求元组的每个分量必须是不可分割的数据项;数据库中的数据冗余应尽可能少;不要出现插入异常;不要出现删除异常;不要出现更新异常;数据库设计应考虑查询要求,数据组织要......
  • 基于Nacos的服务治理及服务的云原生设计
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • PTA ---命名规范 Snake2Camel
    用一道例题,学习代码思维!语言描述思路,代码大胆翻译。在绝大多数程序设计语言中,变量名都不能包含空格。那么如果我们使用的变量名由两个或两个以上的单词来命名,我们就需要对这些单词加以区分。一般程序设计中,有两种变量命名规范:Snake方式和Camel方式。Snake方式是指单词用小写......
  • 数据库开发设计规范(通用)
    数据库开发设计规范(通用)原创我科绝伦小周的数据库进阶之路2024-05-1715:46黑龙江一、编写目的为了在软件生命周期内规范数据库相关的需求分析、设计、开发、测试、运维工作,便于不同团队之间的沟通协调,以及在相关规范上达成共识,提升相关环节的工作效率和系统的可维护性。同......
  • Java-云原生优化指南-早期发布--全-
    Java云原生优化指南(早期发布)(全)原文:zh.annas-archive.org/md5/df95e958a0ce92b3b5aecdf89067205b译者:飞龙协议:CCBY-NC-SA4.0第一章:优化与性能定义优化Java(或任何其他类型的代码)的性能通常被视为黑魔法。关于性能分析有一种神秘感——它通常被视为一种由“独行侠黑客,思考......
  • 自适应巡航控制技术规范(简化版)
    自适应巡航控制技术规范(简化版)1系统概述2功能需求3性能需求4功能激活条件5功能抑制条件6系统局限性1系统概述  ACC自适应巡航系统可自动控制纵向跟车距离,减轻驾驶员的工作量,即驾驶员无需频繁的踩制动和油门便可完成部分的驾驶任务,但责任主体仍然是......
  • GIT版本管理规范
    版本管理规范文档编写中1.Git版本管理1.1分支命名先来一张典中典分支生命周期以上生命周期仅作参考,不同开发团队可能有不同的规范,可自行灵活定义。例如我们团队在开发时,至少需要保证以下流程:develop分支和hotfix分支,必须从master分支检出由deve......