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
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
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位OSX、Windows和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)
-
# 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