用软件代替架构
通常情况下,开发人员会在软件开发层面设法纠正系统的架构问题。虽然这种做法有其用武之地,但我非常赞成在没有必要的情况下尽量避免这种做法。将问题从软件架构层转移到基础架构层有其好处。
例如,假设您需要将某个 URL 端点的请求代理到另一台服务器。与编写 PHP 代理脚本相比,我认为这最好在网络服务器层完成。Apache 和 Nginx 都可以处理反向代理,但编写一个库来完成这项工作可能会遇到一些闻所未闻的问题。你想过要处理 HTTP PUT/DELETE 请求吗?错误处理怎么办?假设你的库已经完成,那么性能如何呢?使用低级系统工程语言编写的 Web 服务器,PHP 代理脚本真的比 Web 服务器级代理更快吗?网络服务器配置中的一两行肯定比用 PHP 编写整个代理脚本要容易得多?
下面的例子说明了在虚拟主机中创建代理是多么容易。在 Apache 虚拟主机上进行以下配置,就可以将 test.local/api
中的所有内容重新路由到 api.local
(在 Nginx 中更容易):
Unresolved include directive in modules/ROOT/pages/ch02/ch2-09.adoc - include::example$/Chapter 2/ApacheProxyPass/vhost.conf[]
这比 PHP 库中数千行代码更容易维护,PHP 库模仿了 ProxyPass Apache 模块中已经存在的东西。
我听到有人批评微服务,他们试图将问题从软件开发层转移到基础设施层,但我们真的说这总是一件坏事吗?
是的,软件开发人员在软件开发层做事情是有既得利益的,但经常值得让你自己了解在链的更高层可用的功能,看看是否可以纠正你所遇到的问题。
用奥卡姆剃刀来思考:最短解决方案通常是最好的,因为它字面意思是 “不应该使用比必要更多的东西”。