从 ServerlessWorkflow 学习到了什么

2022年11月19日 1508点热度 1人点赞 0条评论
内容纲要

背景

突然了解到有个项目叫 ServerlessWorkflow 。

https://github.com/serverlessworkflow

这个项目有什么用,并不重要,重要的是可以从这里了解到云原生中间件开发的一些现状和需要学习的知识。

因为这个项目是 CNCF 项目,里面使用到的规范、思想、协议,也可以很好地体现当前 CNCF 的趋势。

ServerlessWorkflow 是一个 CNCF 发起的工作流协议,然后现在使用了 C# 实现了这个协议。

https://github.com/serverlessworkflow/synapse

下载这个 synapse 源码之后,有好多地方震惊到我了。并不是因为里面的代码可以秀到起飞,而是里面使用到的协议、组件、思想。

synapse 的源码结构如下:
file

synapse 的工作原理是大概这样的,Worker 是一个独立的进程,每当启动一个工作流时,都使用使用 Docker 或 Kubernetes 启动一个 Worker 进程,然后 Worker 解析流程协议,执行流程步骤。

这个项目使用到了与 Docker、Kuberntes 通讯,这是一点,这个先放一放。

这个 Worker 使用到的 Nuget 库很多:
file

我们来看 ServerlessWorkflow.SDK 这部分。

ServerlessWorkflow.SDK 使用到的 Nuget 如下:
file

我们从中了解里面的所有 nuget 。

CloudNative.CloudEvents

cloudevents:一个以通用格式来描述事件数据的规范

这个库是实现了一个 CNCF 云原生事件总线协议的,官网:https://cloudevents.io/
C# SDK 使用方法:https://github.com/cloudevents/sdk-csharp/blob/main/docs/guide.md

使用方法大概是这样的:

CloudEvent cloudEvent = new CloudEvent
{
    Id = "event-id",
    Type = "event-type",
    Source = new Uri("https://cloudevents.io/"),
    Time = DateTimeOffset.UtcNow,
    DataContentType = "text/plain",
    Data = "This is CloudEvent data"
};

CloudEventFormatter formatter = new JsonEventFormatter();
HttpRequestMessage request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = cloudEvent.ToHttpContent(ContentMode.Structured, formatter)
};

本质是通过 Http 协议,在 Header 中携带某些信息,让 Http 请求变成事件。
Dapr 的 Pub/Sub、CAP 框架也是类似,链路追踪框架也是在 Header 中注入 SpanContext 信息。

可以看到,先生成 CloudEvent ,然后将 CloudEvent 附带到 Http 请求信息中。

协议通讯

file
file

在 ServerlessWorkflow 中,流程中的函数(Action 操作)可以向外部服务远程请求,将工作流中的参数传递过去,接着获取响应结果,处理响应结果将数据放到流程中使用。

ServerlessWorkflow 支持以下几种调用方式:

Using Functions for RESTful Service Invocations为 RESTful 服务调用使用函数
Using Functions for Async API Service Invocations为异步 API 服务调用使用函数
Using Functions for RPC Service Invocations在 RPC 服务调用中使用函数
Using Functions for GraphQL Service Invocations在 GraphQL 服务调用中使用函数
Invoking a GraphQL 调用 GraphQL Query
Invoking a GraphQL 调用 GraphQL Mutation
Using Functions for OData Service Invocations在 OData 服务调用中使用函数
Creating an OData Function Definition创建 OData 函数定义
Invoking an OData Function Definition调用 OData 函数定义

Http 平时用得多,gRPC 也有用,但是 GraphQL、OData、CloutEvent 都没有使用过,也对其一点都不了解。

Neuroglia.Serialization.* 里面的组件也很有意思。可以简化协议、序列化反序列化过程。
protobuf-net.Grpc ,可以在不写 proto 的情况下,实现 gRPC 。

另一个有意思的点是,都是 http 请求,里面还有 Async API 这种说法。

Neuriglia.Data.Expressions.JQ 则是用于解析流程中的表达式。

痴者工良

高级程序员劝退师

文章评论