CategoryResourceRepost/极客时间专栏/左耳听风/弹力设计/51 | 弹力设计篇之“弹力设计总结”.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

136 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="51 | 弹力设计篇之“弹力设计总结”" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4f/96/4f17f1db90197cfc8d0d0f76e9175496.mp3"></audio>
我们前面讲了那么多的弹力设计的设计模式,这里做个总结。
# 弹力设计总图
首先,我们的服务不能是单点,所以,我们需要在架构中冗余服务,也就是说有多个服务的副本。这需要使用到的具体技术有:
- 负载均衡 + 服务健康检查可以使用像Nginx或HAProxy这样的技术
- 服务发现 + 动态路由 + 服务健康检查比如Consul或ZooKeeper
- 自动化运维Kubernetes 服务调度、伸缩和故障迁移。
然后,我们需要隔离我们的业务,要隔离我们的服务我们就需要对服务进行解耦和拆分,这需要使用到以前的相关技术。
<li>
bulkheads模式业务分片 、用户分片、数据库拆分。
</li>
<li>
自包含系统:所谓自包含的系统是从单体到微服务的中间状态,其把一组密切相关的微服务给拆分出来,只需要做到没有外部依赖就行。
</li>
<li>
异步通讯:服务发现、事件驱动、消息队列、业务工作流。
</li>
<li>
自动化运维:需要一个服务调用链和性能监控的监控系统。
</li>
然后,接下来,我们就要进行和能让整个架构接受失败的相关处理设计,也就是所谓的容错设计。这会用到下面的这些技术。
<li>
错误方面:调用重试 + 熔断 + 服务的幂等性设计。
</li>
<li>
一致性方面:强一致性使用两阶段提交、最终一致性使用异步通讯方式。
</li>
<li>
流控方面:使用限流 + 降级技术。
</li>
<li>
自动化运维方面:网关流量调度,服务监控。
</li>
我不敢保证有上面这些技术可以解决所有的问题,但是,只要我们设计得当,绝大多数的问题应该是可以扛得住的了。
下面我画一个图来表示一下。
<img src="https://static001.geekbang.org/resource/image/f9/2b/f9e6efa6202103a14d358ff6c80f0a2b.png" alt="" />
在上面这个图上,我们可以看到,有三大块的东西。
<li>
冗余服务。通过冗余服务的复本数可以消除单点故障。这需要服务发现,负载均衡,动态路由和健康检查四个功能或组件。
</li>
<li>
服务解耦。通过解耦可以做到把业务隔离开来不让服务间受影响这样就可以有更好的稳定性。在水平层面上需要把业务或用户分片分区业分做隔离用户做多租户。在垂直层面上需要异步通讯机制。因为应用被分解成了一个一个的服务所以在服务的编排和聚合上需要有工作流像Spring的Stream或Akka的flow或是AWS的Simple Workflow来把服务给串联起来。而一致性的问题又需要业务补偿机制来做反向交易。
</li>
<li>
服务容错。服务容错方面,需要有重试机制,重试机制会带来幂等操作,对于服务保护来说,熔断,限流,降级都是为了保护整个系统的稳定性,并在可用性和一致性方面在出错的情况下做一部分的妥协。
</li>
当然,除了这一切的架构设计外,你还需要一个或多个自动运维的工具,否则,如果是人肉运维的话,那么在故障发生的时候,不能及时地做出运维决定,也就空有这些弹力设计了。比如:监控到服务性能不够了,就自动或半自动地开始进行限流或降级。
# 弹力设计开发和运维
对于运维工具来说,你至少需要两个系统:
- 一个是像APM这样的服务监控
- 另一个是服务调度的系统Docker + Kubernetes。
此外如果你需要一个开发架构来让整个开发团队在同一个标准下开发上面的这些东西这里Spring Cloud就是不二之选了。
关于Spring Cloud和Kubernetes它们都是为了微服务而生但它们没有什么可比性因为前者偏开发后者偏运维。我们来看一下它们的差别。
<img src="https://static001.geekbang.org/resource/image/35/f4/35cd0722f99f91c904944ac1bbdd56f4.png" alt="" /><br />
图片来自Deploying Microservices: Spring Cloud vs Kubernetes
从上表我们可以得知:
<li>
Spring Cloud有一套丰富且集成良好的Java库作为应用栈的一部分解决所有运行时问题。因此微服务本身可以通过库和运行时代理解决客户端服务发现、负载均衡、配置更新、统计跟踪等。工作模式就像单实例服务集群。译者注集群中master节点工作当master挂掉后slave节点被选举顶替。并且一批工作也是在JVM中被管理。
</li>
<li>
Kubernetes不是针对语言的而是针对容器的所以它是以通用的方式为所有语言解决分布式计算问题。Kubernetes提供了配置管理、服务发现、负载均衡、跟踪、统计、单实例、平台级和应用栈之外的调度工作。该应用不需要任何客户端逻辑的库或代理程序可以用任何语言编写。
</li>
下图是微服务所需的关键技术以及这些技术中在Spring Cloud和Kubernetes的涵盖面。
<img src="https://static001.geekbang.org/resource/image/dc/af/dcab89f031d1a7083b4f0b3091873caf.png" alt="" /><br />
图片来自Deploying Microservices: Spring Cloud vs Kubernetes
两个平台依靠相似的第三方工具如ELK和EFK stacks, tracing libraries等。Hystrix和Spring Boot等库在两个环境中都表现良好。很多情况下Spring Cloud和Kubernetes可以形成互补组建出更强大的解决方案例如KubeFlix和Spring Cloud Kubernetes
下图是在Kubernetes上使用Spring Cloud可以表现出来的整体特性。要做出一个可运维的分布式系统除了在架构上的设计之外还需要一整套的用来支撑分布式系统的管控系统也就是所谓的运维系统。要做到这些不是靠几个人几天就可以完成的。这需要我们根据自己的业务特点来规划相关的实施路径。
<img src="https://static001.geekbang.org/resource/image/41/6a/41e9f7a084e6c81fcb3bb42d43b0076a.png" alt="" /><br />
图片来自Deploying Microservices: Spring Cloud vs Kubernetes
上面这张图中对于所有的特性都列举了一些相关的软件和一些设计的重点其中红色的是运维层面的和Spring Cloud和Kubernetes不相关的绿色的Spring Cloud提供的开发框架蓝色的是Kubernetes相关的重要功能。
从今天看下来微服务的最佳实践在未来有可能会成为SpringCloud和Kubernetes的天下了。这个让我们拭目以待。
我在本篇文章中总结了整个弹力设计,提供了一张总图,并介绍了开发运维的实践。希望对你有帮助。
也欢迎你分享一下你对弹力设计和弹力设计系列文章的感想。
文末给出了《分布式系统设计模式》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
<li>弹力设计篇
<ul>
- [认识故障和弹力设计](https://time.geekbang.org/column/article/3912)
- [隔离设计Bulkheads](https://time.geekbang.org/column/article/3917)
- [异步通讯设计Asynchronous](https://time.geekbang.org/column/article/3926)
- [幂等性设计Idempotency](https://time.geekbang.org/column/article/4050)
- [服务的状态State](https://time.geekbang.org/column/article/4086)
- [补偿事务Compensating Transaction](https://time.geekbang.org/column/article/4087)
- [重试设计Retry](https://time.geekbang.org/column/article/4121)
- [熔断设计Circuit Breaker](https://time.geekbang.org/column/article/4241)
- [限流设计Throttle](https://time.geekbang.org/column/article/4245)
- [降级设计degradation](https://time.geekbang.org/column/article/4252)
- [弹力设计总结](https://time.geekbang.org/column/article/4253)
- [分布式锁Distributed Lock](https://time.geekbang.org/column/article/5175)
- [配置中心Configuration Management](https://time.geekbang.org/column/article/5819)
- [边车模式Sidecar](https://time.geekbang.org/column/article/5909)
- [服务网格Service Mesh](https://time.geekbang.org/column/article/5920)
- [网关模式Gateway](https://time.geekbang.org/column/article/6086)
- [部署升级策略](https://time.geekbang.org/column/article/6283)
- [缓存Cache](https://time.geekbang.org/column/article/6282)
- [异步处理Asynchronous](https://time.geekbang.org/column/article/7036)
- [数据库扩展](https://time.geekbang.org/column/article/7045)
- [秒杀Flash Sales](https://time.geekbang.org/column/article/7047)
- [边缘计算Edge Computing](https://time.geekbang.org/column/article/7086)