#rest #service #query-api #testing #cache #etc-passwd #etc-group

nightly bin+lib password-as-service

一个考虑得很差的http/rest服务

4个版本

0.1.4 2019年5月10日
0.1.3 2019年5月7日
0.1.2 2019年5月7日
0.1.1 2019年5月7日

#14 in #query-api

MIT许可证

3MB
834

包含 (ELF可执行文件,4.5MB) bin/lin64/passwd-as-service,(Mach-o可执行文件,2.5MB) bin/osx64/passwd-as-service,(DOS可执行文件,2MB) bin/win64/passwd-as-service.exe

passwd-as-service

crate 源代码 文档

Passwd-as-service是一个提供对/etc/passwd/etc/group文件查询API的webservice。它不是一个“真实”的服务;它是一个教学编码示例,用于潜在雇主,基于Brain Corp的编码挑战。有关具体挑战的详细信息,请参阅文件api.pdf

文档

克隆源代码并运行cargo doc --open,或访问docs.rs上的文档

安装

  • 使用rustup安装Rust

  • 安装nightly工具链

    rustup install nightly
    
  • 通过crates.io安装

    cargo +nightly install password-as-service
    

    另外,[./bin]中提供了64位OSXWindows和Linux Ubuntu/Debian的预构建二进制文件。

配置

[ROCKET_PORT=PORT] passwd-as-service [PATH_TO_USERS] [PATH_TO_GROUPS]
  • ROCKET_PORT是要服务的主机端口。这也可以设置为环境变量。
  • PATH_TO_USERS是用户文件的路径:默认为"/etc/passwd"
  • PATH_TO_GROUPS是用户文件的路径:默认为"/etc/group"您必须使用PATH_TO_USERS和PATH_TO_GROUPS,或者都不使用。

测试

  • 克隆仓库

    cd ~/rust
    git clone gitlab.com/efronlicht/passwd-as-service
    
  • 导航到项目目录

    cd ~/rust/passwd-ass-service
    
  • 运行测试

    Cargo

    cargo test
    

测试覆盖率(Ubuntu/Debian)

  • 安装Tarpaulin

    # install the lib-ssl development libraries
    apt-get install libssl-dev pkg-config cmake zlib1g-dev
    # set cargo to use rust's `nightly` toolchain
    rustup default nightly
    # OR:
    rustup override set nightly
    # install tarpaulin
    RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin
    
  • 获取覆盖率

    $ cargo tarpaulin
    
      [INFO tarpaulin] Running Tarpaulin
      [INFO tarpaulin] Building project
      [INFO tarpaulin] Launching test
      [INFO tarpaulin] running /home/efron/rust/passwd-as-service/target/debug/deps/bin-f54ce995ec16a011
    
      running 0 tests
    
      test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
    
      [INFO tarpaulin] Launching test
      [INFO tarpaulin] running /home/efron/rust/passwd-as-service/target/debug/deps/lib-1087fab0c4512719
    
      running 6 tests
      ......
      test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
    
      [INFO tarpaulin] Coverage Results:
      || Tested/Total Lines:
      || src/api/mod.rs: 14/14
      || src/api/tests.rs: 84/86
      || src/lib.rs: 6/20
      || src/main.rs: 0/3
      || src/model/group.rs: 11/18
      || src/model/user.rs: 24/26
      ||
      83.23% coverage, 139/167 lines covered
    

设计决策

语言:Rust

  • 优点
    • 极其强大的静态类型和关于并发的保证。没有竞态条件。
    • 没有垃圾回收和强大的优化编译器使其运行速度非常快。
    • 易于编译成可移植的二进制文件并在容器中部署。
    • 一流的文档和代码质量工具
    • 部署简单,资源利用率低,在租用的服务器上运行成本低。
    • Cargo是一个极好的包和依赖管理器。
    • 我最喜欢的编程语言。
  • 缺点
    • 学习曲线高。
    • 编写困难。
    • 与JavaScript、Go和Python等竞争对手相比,Web开发的生态系统不够成熟。
    • 对于“快速且脏”的工作,严格性并不总是必要的。
    • 编译时间慢。

数据库:无,具有内存缓存级别。

这是一个玩具项目,处理的数据量非常小。即使最大的Linux系统也不太可能有超过一万个用户或组;我们根本不需要关系型数据库来查询这类数据。我们有一个单一的事实来源(平面文件/etc/passwd//etc/group本身)。

  • 优点

    • 减少了大量的开销和磁盘使用。
    • 更便宜的容器化:大多数关系型数据库超过200MB,并且可以使用大量的内存,这对于我们根本不需要的资源来说是一大浪费。
    • 部署更简单;我们只需分发一个二进制文件,无需任何依赖。
  • 缺点

    • 关系型数据库如PostgreSQL和MySQL基本上是为这种查询而生的。
    • 如果项目扩展,我们最终可能需要使用数据库。
    • 重造轮子。

框架:Rocket

Rocket是用于在Rust中编写服务器的兴奋的框架。

优点

  • 很少的样板代码。
  • 强类型和强大的自定义宏允许您创建可读性高、可测试的API。
  • 非常快。

缺点

  • 不成熟。
  • 需要nightly rust。
  • Rust的变化可能会使Rocket陷入困境。

部署:静态链接的二进制文件

优点
  • 可移植
  • 比封装整个解释器小得多。
  • 不能注入DLL(因为没有动态库)
缺点
  • 必须每次重新编译,与解释语言不同。
  • 比使用动态链接大。

持续集成和源代码控制:Git与Gitlab

优点

  • 比大多数都简单
  • Git是世界上最常见的源代码控制工具
  • Gitlab的持续集成对于小型或中型项目来说比用于大多数GitHub项目的重型解决方案要好得多。

缺点

  • Github的发现性更强。

依赖项

~11–22MB
~341K SLoC