我们前面讲了那么多的弹力设计的设计模式,这里做个总结。
首先,我们的服务不能是单点,所以,我们需要在我们的架构中冗余服务,也就是说有多个服务的副本。这需要使用到的具体技术有:
然后,我们需要隔离我们的业务,要隔离我们的服务我们就需要对服务进行解耦和拆分,这需要使用到以前的相关技术。
然后,接下来,我们就要进行和能让整个架构接受失败的相关处理设计,也就是所谓的容错设计。这会用到下面的这些技术。
我不敢保证有上面这些技术可以解决所有的问题,但是,只要我们设计得当,绝大多数的问题应该是可以扛得住的了。
下面我画一个图来表示一下。
在上面这个图上,我们可以看到,有三个大块的东西。
当然,除了这一切的架构设计外,你还需要一个或多个自动运维的工具,否则,如果是人肉运维的话,那么在故障发生的时候,不能及时地做出运维决定,也就空有这些弹力设计了。比如:监控到服务性能不够了,就自动或半自动地开始进行限流或降级。
对于运维工具来说,你至少需要两个系统:
此外,如果你需要一个开发架构来让整个开发团队一在同一个标准下开发上面的这些东西,这里,Spring Cloud 就是不二之选了。
关于 Spring Cloud 和 Kubernetes,它们都是为了微服务而生,但它们没有什么可比性,因为,前者偏开发,后者偏运维。我们来看一下它们的差别。
(图片来自:Deploying Microservices: Spring Cloud vs Kubernetes)
从上表我们可以得知:
下图是微服务所需的关键技术,以及这些技术中在 Spring Cloud 和 Kubernetes 的涵盖面。
(图片来自:Deploying Microservices: Spring Cloud vs Kubernetes)
两个平台依靠相似的第三方工具,如 ELK 和 EFK stacks, tracing libraries 等。Hystrix 和 Spring Boot 等库,在两个环境中都表现良好。很多情况下,Spring Cloud 和 Kubernetes 可以形成互补,组建出更强大的解决方案(例如 KubeFlix 和 Spring Cloud Kubernetes)。
下图是在 Kubernetes 上使用 Spring Cloud 可以表现出来的整体特性。要做出一个可运维的分布式系统,除了在架构上的设计之外,还需要一整套的用来支撑分布式系统的管控系统,也就是所谓的运维系统。要做到这些,不是靠几个人几天就可以完成的。这需要我们根据自己的业务特点来规划相关的实施路径。
(图片来自:Deploying Microservices: Spring Cloud vs Kubernetes)
上面这张图中,对于所有的特性,都列举了一些相关的软件和一些设计的重点,其中红色的是运维层面的和 Spring Cloud 和 Kubernetes 不相关的,绿色的 Spring Cloud 提供的开发框架,需要作开发,蓝色的是 Kubernetes 相关的重要功能。
从今天看下来,微服务的最佳实践在未来有可能会成为 SpringCloud 和 Kubernetes 的天下了。这个让我们拭目以待。
我在本篇文章中总结了整个弹力设计,提供了一张总图,并介绍了开发运维的实践。希望对你有帮助。
也欢迎你分享一下你对弹力设计和弹力设计系列文章的感想。