#mocking #system #framework #backed #pattern #actors #architectural

motley

基于 Rust 类型系统的架构级模拟框架

1 个不稳定版本

0.0.1 2022年9月7日

#68 in #actors

Apache-2.0

30KB
605 代码行数,不包括注释

Motley - 架构模拟的图案

让我们创建一个演员模拟库,

  1. 通过实际编译的事实来验证模拟演员的稳定性
  2. 通过简单的测试套件验证演员交互的图案。

目标

  • 模拟
    • 云部署类型(服务、函数等)
    • 云部署图案(HTTP、PubSub等)
    • 数据库类型(SQL、NoSQL等)
    • 数据库图案(CRUD等)
    • 云服务提供商类型(AWS、GCP、Azure等)
  • 生成
    • 生成常见的规范格式(OpenAPI、AsyncAPI等)
    • 生成常见的部署格式(Terraform、CloudFormation等)
    • 生成一个模拟服务器,可以用来测试模拟演员之间的图案
  • 测试
    • cargo build 成功? -> 模拟是稳定的
    • cargo test 成功? -> 图案是稳定的
    • 测试模拟演员之间的请求流
    • 符合人体工程学,专注于验证模拟演员之间的图案
  • 可视化
    • 可视化模拟演员
    • 可视化模拟演员之间的依赖关系
    • 可视化模拟演员之间的图案

挑战目标

  • 生成
    • 从真实系统中生成模拟
    • 从一组图案中生成模拟
  • 保存/加载
    • “保存文件”将是一个可编译的 Rust 二进制文件,可用于测试图案
      • crate 的根将处理为图案设置模拟的连接
      • 每个演员将表示为一个单独的同级子模块
      • 每个演员模块将包含封装其依赖演员的子模块
    • 将模拟演员保存到文件中
    • 从文件中加载模拟演员

非目标

todo!()

立即回头

作者的牢骚和一些想法和动机

以与 mdBook 相同的方式进行可视化

将实现作为特性与枚举实现一起使用?从 OpenAPI 规范生成?输出到 OpenAPI 规范?输出到带有示例的 OpenAPI 规范?输出到 ORM 工具?输出到 Rust 框架?输出到 Go 框架?将子实现输出到语言或规范是一个好主意,可以帮助启动复杂的系统

RPC 服务

  • HTTP
    • 请求资源(常见端点)
      • 嵌套?
      • 列表 - GET /resource
      • 显示 - GET /resource/:id
      • 创建 - POST /resource
      • 更新 - PUT /resource/:id
      • 删除 - DELETE /resource/:id
    • 请求对象
      • 头部(结构体)
      • 路径参数(结构体)
      • 查询参数(结构体)
      • 正文(结构体)
    • 响应对象
      • 头部(结构体)
      • 状态码(枚举)
      • 正文(结构体)
  • gRPC
    • 服务对象
      • RPC 方法
        • 请求对象
          • 元数据(结构体)
          • 消息(结构体)
        • 响应对象
          • 元数据(结构体)
          • 消息(结构体)
      • 流方法
        • 请求对象
          • 元数据(结构体)
          • 消息(结构体)
        • 响应对象
          • 元数据(结构体)
          • 消息(结构体)

数据库服务

  • 关系型
    • 仓库模式
      • 定义 CRUD 操作的特定高级函数
    • ORM 模式(稍后)
      • 仅提供通用的 CRUD 操作
      • 可能由于ORM模式复杂,属于后期目标
    • 原始SQL(LATER)
      • SELECT, INSERT, UPDATE, DELETE
  • NoSQL
    • 键/值
    • 文档
    • 列式
    • 时间序列
    • 搜索
  • 缓存层?

消息队列服务

  • 基于拉取
    • 拉取 - GET /queue/:queue_name
    • 确认 - POST /queue/:queue_name
    • 拒绝 - POST /queue/:queue_name
  • 基于推送
    • 推送 -> 确认/拒绝 - POST /queue/:queue_name
  • 请求对象
    • 元数据
    • 正文

依赖

~130KB