百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

「无服务器架构」动手操作Knative -第2部分

bigegpt 2024-09-22 00:44 3 浏览

在上一篇文章中,我讨论了Knative用于快速部署和自动调整无服务器容器。如果您希望您的服务由HTTP调用同步触发,那么Knative服务是很好的选择。然而,在没有服务器的微服务世界中,异步触发器更加常见和有用。这时,Knative三项赛就开始发挥作用了。

在Knative系列的第2部分中,我将介绍Knative事件并展示一些来自我的Knative教程的示例,这些示例介绍了如何将它与各种服务集成在一起。

什么是Knative Eventing?

Knative事件处理与Knative服务密切相关,它为松散耦合的事件驱动服务提供了基元。典型的Knatives事件架构是这样的:



主要有4个组成部分:

  1. Source(也称为Producer)从实际的源中读取事件,并将事件向下转发到一个通道,或者直接转发到一个服务,这种情况比较少见。
  2. Channel从源接收事件,保存到其底层存储(稍后详细介绍),并向所有订阅者展开。
  3. 订阅连接一个通道和一个服务(或另一个通道)。
  4. 服务(也称为消费者)是使用事件流的Knative服务。

让我们更详细地看看这些。

来源,渠道和订阅

Knative事件的最终目标是将事件从源路由到服务,这是通过我前面提到的原语实现的:源、通道和订阅。

Source从实际源读取事件并将它们转发到下游。到目前为止,Knative支持从Kubernetes、GitHub、谷歌云发布/订阅、AWS SQS主题、容器和CronJobs读取事件。

一旦事件被拉入Knative,它就需要保存到内存中,或者保存到更持久的地方,比如Kafka或谷歌云发布/订阅。这发生在通道上。它有多个实现来支持不同的选项。

从Channel将事件传递给所有感兴趣的Knative服务或其他通道。这可以是一对一的,也可以是扇出的。订阅决定了这种交付的性质,并充当通道和Knative服务之间的桥梁。

现在我们已经了解了Knative三项赛的基础知识,让我们来看一个具体的例子。

Hello World事件

对于Hello World事件,让我们读取来自谷歌云发布/订阅的消息并在Knative服务中注销它们。我的你好世界三项赛教程有所有的细节,但在这里重述,这是我们需要设置:

  1. 从谷歌云发布/订阅读取消息的GcpPubSubSource。
  2. 将消息保存在内存中的通道。
  3. 链接频道到Knative服务的订阅。
  4. 接收消息并注销的Knative服务。

gcp-pubsub-source。yaml定义了GcpPubSubSource。它指向一个名为测试的发布/订阅主题,它有访问发布/订阅的凭证,并指定应该像这样转发哪个频道事件:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: GcpPubSubSource
metadata:
name: testing-source
spec:
gcpCredsSecret: # A secret in the knative-sources namespace
name: google-cloud-key
key: key.json
googleCloudProject: knative-atamel # Replace this
topic: testing
sink:
apiVersion: eventing.knative.dev/v1alpha1
kind: Channel
name: pubsub-test

接下来,我们使用Channel .yaml定义通道。在这种情况下,我们只是在内存中保存消息:

apiVersion: eventing.knative.dev/v1alpha1
kind: Channel
metadata:
name: pubsub-test
spec:
provisioner:
apiVersion: eventing.knative.dev/v1alpha1
kind: ClusterChannelProvisioner
name: in-memory-channel

继续创建源和通道:

kubectl apply -f gcp-pubsub-source.yaml
kubectl apply -f channel.yaml

你可以看到源和通道被创建,有一个源pod也被创建:

kubectl get gcppubsubsource NAME AGE testing-source 1mkubectl get channel NAME AGE pubsub-test 1mkubectl get pods NAME READY STATUS gcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running

最后,我们可以创建Knative服务,并使用订阅服务器中的订阅将其链接到subscriber.yaml文件:

apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: message-dumper-csharp spec: runLatest: configuration: revisionTemplate: spec: container: # Replace {username} with your actual DockerHub image: docker.io/{username}/message-dumper-csharp:v1--- apiVersion: eventing.knative.dev/v1alpha1 kind: Subscription metadata: name: gcppubsub-source-sample-csharp spec: channel: apiVersion: eventing.knative.dev/v1alpha1 kind: Channel name: pubsub-test subscriber: ref: apiVersion: serving.knative.dev/v1alpha1 kind: Service name: message-dumper-csharp

如您所见,message-dump -csharp只是一个普通的Knative服务,但它是通过其订阅的Knative事件异步触发的。

kubectl apply -f subscriber.yamlservice.serving.knative.dev "message-dumper-csharp" created subscription.eventing.knative.dev "gcppubsub-source-sample-csharp" configured


一旦你kubectl apply所有的yaml文件,你可以使用gcloud发送消息到发布/订阅主题:

gcloud pubsub topics publish testing --message="Hello World"

你应该可以看到pods 的服务创建:

kubectl get pods
NAME READY
gcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running 0 3m
message-dumper-csharp-00001-deployment-568cdd4bbb-grnzq 3/3 Running 0 30s

服务将Base64编码的消息记录在Data下面:

info: message_dumper_csharp.Startup[0]
C# Message Dumper received message: {"ID":"198012587785403","Data":"SGVsbG8gV29ybGQ=","Attributes":null,"PublishTime":"2019-01-21T15:25:58.25Z"}
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 29.9881ms 200

查看我的Hello World事件教程,了解更多关于步骤和实际代码的细节。

与云存储和Vision API集成

当您试图以无缝的方式连接完全不相关的服务时,Knative事件就会真正地发挥作用。在我的集成与视觉API教程中,我展示了如何使用Knative事件连接谷歌云存储和谷歌云视觉API。

云存储是一种全球可用的数据存储服务。可以将bucket配置为在保存映像时发出发布/订阅消息。然后,我们可以使用Knative事件侦听这些发布/订阅消息,并将它们传递给Knative服务。在服务中,我们使用图像进行一个Vision API调用,并使用机器学习从中提取标签。所有的细节都在教程中进行了解释,但是我想在这里指出一些事情。

首先,在Knative中,所有的出站流量在缺省情况下都会被阻塞。这意味着在默认情况下,您甚至不能从Knative服务调用Vision API。这最初让我感到惊讶,所以请确保配置了网络出站访问。

其次,无论何时将图像保存到云存储中,它都会发出CloudEvents。Knative三项赛通常与CloudEvents一起使用。你需要将传入的请求解析为CloudEvents,并提取你需要的信息,如事件类型和图像文件的位置:

var cloudEvent = JsonConvert.DeserializeObject<CloudEvent>(content); var eventType = cloudEvent.Attributes["eventType"]; var storageUrl = ConstructStorageUrl(cloudEvent);

有了这些信息,很容易为图像构造存储URL并使用该URL进行Vision API调用。完整的源代码在这里解释,但这里是相关的部分:

var visionClient = ImageAnnotatorClient.Create();
var labels = await visionClient.DetectLabelsAsync(Image.FromUri(storageUrl), maxResults: 10);

一旦代码准备好了,我们就可以通过定义一个ubscriber.yaml将服务挂接到Knative事件上。它和以前很相似。我们正在重用现有的源和通道,所以我们不必重新创建它们。我们只是创建一个新的订阅指向我们新的Knative服务与愿景API容器:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: vision-csharp
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
# Replace {username} with your actual DockerHub
image: docker.io/{username}/vision-csharp:v1
---
apiVersion: eventing.knative.dev/v1alpha1
kind: Subscription
metadata:
name: gcppubsub-source-vision-csharp
spec:
channel:
apiVersion: eventing.knative.dev/v1alpha1
kind: Channel
name: pubsub-test

subscriber:
ref:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
name: vision-csharp

一旦使用kubectl apply创建了所有内容,无论何时将映像保存到云存储桶中,都应该看到该映像的Knative服务日志标签。

例如,我有一张我最喜欢的地方的照片:



当我把图片保存到桶里时,我可以在日志中看到Vision API中的以下标签:

info: vision_csharp.Startup[0]
This picture is labelled: Sea,Coast,Water,Sunset,Horizon
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 1948.3204ms 200

可以看到,我们使用Knative事件将一个服务(云存储)连接到另一个服务(Vision API)。这只是一个例子,但可能性是无限的。在本教程的翻译API集成部分中,我展示了如何将发布/订阅连接到翻译API。

这就是Knative三项赛。在本系列的下一篇也是最后一篇文章中,我将讨论Knative构建。


原文:https://medium.com/google-cloud/hands-on-knative-part-2-a27729f4d756

本文:http://jiagoushi.pro/hands-knative-part-2

讨论:请加入知识星球【首席架构师圈】或者微信圈子【首席架构师圈】

相关推荐

5分钟调色大片的方法(5分钟调色大片的方法有哪些)

哈喽大家好。在大家印象中一定觉得ps非常难学非常难。大家不要着急,小编的教学都是针对ps零基础的同学的,而且非常实用哦。只要大家跟着图文练习一两遍,保证大家立马学会~!好了,废话少说,下面开始我们今天...

闪白特效原来是这么用的(闪白特效怎么使用)

作者|高艳侠订阅|010-86092062闪白特效是影视作品中应用比较多的效果之一,那么具体该在哪些场景使用闪白特效?具体该如何操作?下面就以AdobePremiere(以下简称PR)为例,...

ppt常用小图标去哪里找?3个矢量素材网站推荐!

ppt是一个注重可视化表达的演示载体,除了高清图片,ppt中另一类常用的素材是各种小图标,也叫矢量图标,巧妙运用小图标能提升整体美观度和表现力,那么ppt常用小图标去哪里找呢?为方便各位快速找到合适的...

有什么好用的截图录屏工具?试试这9款

经常有朋友反馈苦于缺乏截屏和录屏的趁手工具,本期我们分享几个相当好用的截屏和录屏工具,希望能帮到大家。ScreenToGifScreenToGif是一款免费且开源的录屏工具。此款工具最大的特点是可以...

配色苦手福音!专业快速色环配色PS插件

今天橘子老师给的大家介绍的是一款快速配色的插件,非常强大配色苦手福音来啦!(获取方式见文末)【插件介绍】配色在后期设计中占有主导地位,好的配色能让作品更加抢眼Coolorus这款专业的配色插件,能够...

如何用PS抠主体?(ps怎么抠主体)

1.主体法抠图-抠花苞和花梗导入一张荷花苞的照片,点击上图中顶部“选择”菜单栏,下拉单击“主体”。可以看到,只有花苞被选中,但是花梗并没有被选中。接下来单击上图中左侧工具栏的“快速选择工具”,上图中顶...

2799元的4K电视,有保障吗?(买4k电视机哪个品牌好)

在上一期《电脑报》的3·15专题报道中,我们揭露了一款不靠谱的42英寸4K智能电视——TCLD42A561U。这款售价2699元的4K智能电视不仅4K画质方面存在严重问题,而且各种功能和应用体验也不理...

苹果电脑的Touch Bar推出一段时间了 这款工具可以帮你开发适用于它的APP

距离苹果推出带有TouchBar的MacBookPro已经有一段时间了,除了那些像Adobe、Google和Microsoft大公司在开发适用于TouchBar的应用之外,其实还有很多独立的开...

如魔法般吸取颜色的桌灯(如魔法般吸取颜色的桌灯叫什么)

色彩为生活带来的感官刺激,逐渐被视为理所当然。一盏桌灯运用它的神奇力量,将隐藏于物件中的颜色逐一释放,成为装点环境的空间魔法师。ColorUp是一款可以改变颜色的吸色台灯,沿用传统灯泡的造型,融入了拾...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

ps拾色器快捷键是什么?(ps2019拾色器快捷键)

ps拾色器快捷键是什么?文章末尾有获取方式,按照以下步骤就能自动获得!学会制作PS特效需要一定程度的耐心和毅力。初学者可以从基本的工具和技术开始学习,逐渐提高他们的技能水平。同时,观看更多优秀的特效作...

免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等

功能很强大、安装很小巧的免费截图、录屏工具,提供很多使用的工具来帮我么能解决问题,推荐给大家。关于ShareXShareX是一款免费的windows工具,起初是一个小巧的截图工具,经过多年的迭...

入门到精通系列PS教程:第13篇 · 拾色器、颜色问题说明及补充

入门到精通系列PS教程:第13篇·拾色器、颜色问题说明及补充作者|侯潇问题说明我的第12篇教程里,有个小问题没有说清楚。要说是错误,又不算是错误,只是没有说准确。写完那篇教程后,因为已经到了深...

PS冷知识:用吸管工具吸取屏幕上的任意颜色

今天,我们给大家介绍PS中的一个冷知识:用吸管工具可以吸取屏幕上的任意颜色。其实,操作起来是非常简单的。大多数情况下,我们认为,PS的吸管工具只能吸取PS软件作图区域范围内的颜色,最多加上画布四周的...

Windows 11 将提供内置颜色选择器工具

Windows11内置了颜色选择器,可以扫描并识别屏幕上的颜色并生成颜色代码。此外,微软还利用人工智能技术,让屏幕上的文本扫描和选择变得更加便捷。这两项功能均已在SnippingToolv1...