微服务就是一些协同工作的小而自治的服务。
1 微服务
1.1 很小,专注于做好一件事
在一个单块系统内,通常会创建一些抽象层或者模块来保证代码的内聚性,从而避免上述问题。内聚性是指将相关代码放在一起,在考虑使用微服务的时候,内聚性这一概念很重要。
单一职责原则很好地强调了内聚性这一概念,它是这样讲的:“把因相同原因而变化的东西聚合到一起,而把因不同原因而变化的东西分离开来。”
服务专注于某个边界之内,因此可以很好地避免由于代码库过大衍生出的很多相关问题。
微服务足够小即可,但不要过小。
服务应该多小的关键因素是,该服务是否能够很好地与团队结构相匹配。
使用的服务越小,独立性带来的好处就越多。
1.2 自治性
一个微服务就是一个独立的实体。它可以独立部署在 PAAS(Platform As A Service,平台即服务)上,也可以作为一个操作系统进程而存在。
服务之间均通过网络调用进行通信,从而加强了服务之间的隔离性,避免紧耦合。
这些服务应可彼此间独立修改,并且某个服务的部署,不会影响该服务的使用者。
服务会暴露出 API(Application Programming Interface,应用编程接口),然后服务之间通过这些接口进行通信。API 接口的实现技术应避免与使用者相耦合。所以,我们应该使用与具体技术不相关的 API 实现方式。
2 好处
微服务的好处,也适用于任何一个分布式系统。
2.1 技术异构性
在一个由多个服务相互协作的系统中,可以在不同的服务中使用最适合该服务的技术。
如果系统中的一部分需要性能提升,那么可以使用性能更好的技术栈来重新构建该部分。系统中的不同部分也可以使用不同的数据存储技术。比如以下的社交网络:
微服务可以帮助我们更快地采用新技术,为我们带来这些新技术的好处。
我们可以选择一个风险最小的服务来采用新技术,这样即使出现问题,也容易处理。
但同时使用多种技术,也需要付出一些代价。比如 Twitter 选用的技术大多基于 JVM(Java Virtual Machine,Java 虚拟机),因为他们了解 JVM 的稳定性与性能。他们还在 JVM 上开发了一些库与工具,使得大规模运维变得更加容易,但这同时也使得他们更难采用 Java 之外的技术来编写服务与客户端。
这就是转换代价。
服务的大小也会影响多技术栈的选择。比如一个两周内即可重写的服务,我们就会试着尝试使用新技术。
2.2 弹性
微服务具有很好的弹性。比如,系统中的某个组件不可用,但没有导致级联故障问题,即系统的其它组件仍可正常运行。微服务就是通过服务边界来避免级联故障的。
2.3 扩展
如果使用了较小的多个服务,那么我们只需要对需要扩展的服务进行硬件升级,而把那些对性能要求没有那么高的服务,运行在更小、性能稍差的硬件上。
2.4 简化部署
一个几百万行代码的应用,即使只修改了一行代码,也需要重新部署整个应用,才能发布。这种部署影响很大、风险很高。而且,两次发布之间的差异越大,出错的可能性也就越高!
微服务架构中,各个服务之间的部署是独立的,这样就可以更快地对特定部分的代码进行部署,客户也可以更快地使用我们开发的功能。。即使出了问题,也只会影响一个服务,并且可以实现快速回滚。
2.5 匹配组织结构
因为小团队更加高效。
2.6 组合性
分布式系统和面向服务架构的目标是:易于重用已有功能。
微服务架构的目标是:根据不同目的,我们可以通过不同方式使用同一个功能。
整体化应用,只能提供一个粗粒度的 API 供外部使用;而微服务架构,会开放很多细粒度的 API 。
2.7 很容易替换
当一个代码库只有几百行,我们就不会对它有太多的情感依赖,因此也会很容易替换它。
3 面向服务的架构
SOA(Service-Oriented Architecture,面向服务的架构)是一种设计方法,这种架构内部包含许多服务,服务之间通过相互配合,提供一系列功能。
微服务架构是 SOA 的一种特定方法。
4 其它分解技术
4.1 共享库
将整个代码库分解为多个库,这些库由第三方或者自己组织内部提供。比如,创建一系列的集合操作类工具等。
缺点如下:
- 无法选择异构技术。因为这些库只能使用同一种语言,或者至少在同一个平台使用。
- 无法对系统某一部分进行独立扩展。
- 当更新库时,需要重新部署。
4.2 模块分解技术
有些编程语言,可以对模块进行生命周期管理,这样就可以把模块热部署到生产上。
OSGI (Open Source Gateway Initiative,开放服务网关协议)就是具体的模块分解技术。它的缺点是:编程语言本身没有对其提供足够的支持,这样就必须做很多工作对模块进行隔离。独立的模块会慢慢地与其它代码耦合在一起,所以我们需要界定好边界。
5 没有银弹
微服务系统,就像分布式系统一样复杂。除了得到微服务架构所带来的好处之外,我们还需要在部署、测试和监控方面做很多工作。而且还需要考虑如何扩展系统,并保证它具有足够的弹性。