2018 重温 Unix 哲学
创始人
2024-03-02 01:06:04
0

在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。

1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “Unix 环境编程” 的文章,其中他们使用 BSD 的 cat -v 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 stdin / stdout 进行通信,并通过管道进行连接。

听起来是不是有点耳熟?

是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 微服务的定义

简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。

虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。

*nix程序 vs 微服务

下面的表格对比了 *nix 环境中的程序(例如 catlsof)与微服务环境中的程序。

*nix 程序微服务
执行单元程序使用 stdin/stdout使用 HTTP 或 gRPC API
数据流管道
可配置和参数化命令行参数、环境变量和配置文件JSON/YAML 文档
发现包管理器、man、makeDNS、环境变量、OpenAPI

让我们详细的看看每一行。

执行单元

*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从 stdin 读取输入并将输出写入 stdout。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC API。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。

数据流

传统的,*nix 程序能够通过管道进行通信。换句话说,我们要感谢 Doug McIlroy,你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了我在 2017 年做的基于 Apache Kafka 小实验,没有什么能比得上管道化的微服务了。

可配置和参数化

你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数、环境变量,或全面的配置文件。在微服务架构中,典型的做法是用 YAML(或者甚至是 JSON)文档,定制好一个服务的布局和配置以及依赖的组件和通信、存储和运行时配置。例如 Kubernetes 资源定义Nomad 工作规范Docker 编排 文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的 Helm,否则你会发现你使用了很多 sed -i 这样的命令。

发现

你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用它们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像 Airbnb 的 SmartStackNetflix 的 Eureka 等可以定制以外,通常还有基于环境变量或基于 DNS 的方法,允许您动态的发现服务。同样重要的是,事实上 OpenAPI 为 HTTP API 提供了一套标准文档和设计模式,gRPC 为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发者经验(DX),应该从写一份好的 Makefile 开始,并以编写符合 风格 的文档结束。

优点和缺点

*nix 系统和微服务都提供了许多挑战和机遇。

模块性

要设计一个简洁、有清晰的目的,并且能够很好地和其它模块配合的某个东西是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到 服务网格 service mesh 是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。

可观测性

在一个 独石 monolith (2018 年)或是一个试图做任何事情的大型程序(1984 年),当情况恶化的时候,应当能够直接的找到问题的根源。但是在一个

yes | tr \\n x | head -c 450m | grep n

或者在一个微服务设置中请求一个路径,例如,涉及 20 个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是 OpenCensusOpenTracing。如果您希望转向微服务,可预测性仍然可能是最大的问题。

全局状态

对于 *nix 程序来说可能不是一个大问题,但在微服务中,全局状态仍然是一个需要讨论的问题。也就是说,如何确保有效的管理本地化(持久性)的状态以及尽可能在少做变更的情况下使全局保持一致。

总结一下

最后,问题仍然是:你是否在使用合适的工具来完成特定的工作?也就是说,以同样的方式实现一个特定的 *nix 程序在某些时候或者阶段会是一个更好的选择,它是可能在你的组织或工作过程中的一个最好的选择。无论如何,我希望这篇文章可以让你看到 Unix 哲学和微服务之间许多强有力的相似之处。也许我们可以从前者那里学到一些东西使后者受益。


via: https://opensource.com/article/18/11/revisiting-unix-philosophy-2018

作者:Michael Hausenblas 选题:lujun9972 译者:Jamskr 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

武汉发布十大优秀开源软件项...
随着AI时代的到来,开源已经成为全球数字经济发展的关键要素。开源不...
2025-03-04 11:21:47
选择合适的服务器操作系统:...
在如今这个信息化、数字化的时代,服务器扮演着至关重要的角色。它们是...
2025-02-25 10:46:43
UNIX_T·杨宇 :HE...
UNIX_T时间截(英文为Unix epoch,Unix time...
2025-02-18 16:18:55
不正确和奇怪的Unix时间...
要将不正确和奇怪的Unix时间转换为日期时间,可以使用Pandas...
2025-01-11 18:02:02
不要允许直接调用微服务,只...
要实现不允许直接调用微服务,只允许通过Zuul API网关访问,可...
2025-01-11 01:00:40
不同用户之间的Unix排序...
在Unix系统中,使用sort命令可以对文本进行排序。默认情况下,...
2025-01-09 23:00:44

热门资讯

使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
Bazzite:专为 Stea... 为 Linux 桌面或者 Steam Deck 做好游戏准备,听起来都很刺激!对于一个专为 Linu...
Motrix:一个漂亮的跨平台... 一个开源的下载管理器,提供了一个简洁的用户界面,同时提供了跨平台操作的所有基本功能。在这里了解关于它...
Bash 脚本中如何使用 he... here 文档 here document (LCTT 译注:here 文档又称作 heredoc ...
使用 dialog 和 jq ... 为何选择文字用户界面(TUI)?许多人每日都在使用终端,因此, 文字用户界面 Text User I...