微服务架构(Microservice Architecture,简称 MSA)的思想其实不是 Martin Fowler 提出的,而是存在已久。只不过 Martin Fowler 和 James Lewis 在那篇广为传颂的文章里给它下了个简明扼要的的定义:
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.
整个思路的形成和演进里面,「[Unix-like](https://en.wikipedia.org/wiki/Pipeline_(Unix)」或者是「Unix Way」被反复提及。James Lewis 第一个比较正式的关于微服务架构的演讲就叫「Microservices - Java, the Unix Way」。
这是因为 Unix 的很多设计哲学,比如「small is beautiful」或者「make each program do one thing well」,都深深的影响着微服务架构的设计思想。
甚至我觉得 Unix 的「everything is a file」,对应过来正好是「everything is a service」。
不是SOA换了个壳
很多像我一样从业已久的人,听到新名词的时候总是持抵抗和怀疑态度的。MSA 不过是 Thoughtworks 把 SOA 换了个名字出来坑钱而已,,是一个很容易入的坑。
实际上,它们确实有关系,但并不是 SOA 换了个壳。你可以把 MSA 想成是 SOA 的一种实践方式,正如 Scrum 是 Agile 的实践方式一样。只不过这种实践方式,和以前的各种实践方式相比,最大的不同就是去掉了 ESB 这样的总线,让系统的各个部分可以相对独立的被设计、开发、部署和运维。
MSA究竟是什么?
Technology is the answer, but what was the question?
Three nodes or less can reproduce 98% of failures. 35% of catastrophic failures are caused by very basic things. Testing error handling code could have prevented 58% of catastrophic failures.
另外,除开常规的测试手段,分布式系统大量的使用 Fault Injection 或者 Game Days 这种方式来进行测试。比如 Netflix 就公布了自己的Simian Army工具,Riemann的作者 Aphyr 还用 Clojure 写了个工具叫Jepsen。
Game Days 主要指通过演习来让 Partial Failure 确实发生。比较著名的有 Google 的 Wheel of Misfortune,再比如 Stripe 在自己的 Redis 主节点上来了一发kill -9之后发现了 Redis 的一个 bug,于是把这样的乱来变成了内部传统。