前面主要聊了多个弹力设计,遮盖力主要做一个汇总
弹力设计总图
集群:服务不能是单点的,所以我们的架构需要冗余设计,设计成集群服务,也就是多个副本机制。需要具体的技术
- 负载均衡+服务健康检查,使用像Nginx或者HAProxy 等SLB技术。 如果是对外系统的话,那么需要使用SLB进行负载均衡。
- 服务发现+动态路由+服务健康检查,Consul 或Zookeeper。这种方式主要是内部服务的调用,比如订单调用支付,支付有三个服务,应该调用那个服务,那么就需要使用注册中心+RPC的方式进行内部服务调用。
- 自动化运维,因为传统的人工运维是很浪费时间的。所以需要K8s服务调度、伸缩和故障迁移。
服务隔离
为保证服务之间不会出现多米诺骨牌效应,那么应该对服务进行解耦和拆分。
- bulkheads模式:业务分片、用户分片、数据库拆分。
- 自包含系统:所以自包含的系统是从单体到微服务的中间状态,把密切相关的微服务拆分出来,做到没有外部依赖。
- 异步通讯 :服务发现、事件驱动、消息队列、业务工作流。
- 自动化运维 服务调用链和性能监控的监控系统。
容错失败设计
一个分布式系统是不能避免出现失败异常的场景,所以我们需要design for 失败。也就是容错设计。
- 错误方面 :重试、熔断、幂等设计
- 一致性方面 :强一致性使用两阶段提交,最终一致性使用异步通讯方式。
- 流控方面 :限流+降级技术
- 自动化运维方面 :网关流量调度,服务监控。
所以主要就是三块东西,服务冗余、服务解耦、服务容错
对于服务容错来说,有重试势必就要有幂等设计。而限流、降级、排队、熔断是保证系统的稳定性,在可用性和一致性之间作出的妥协。
除了上述这三点,还要考虑自动化运维,要不然人肉运维的话,故障出现的时候不能及时解决。
弹力开发与运维
Kubernetes 不是针对语言的,而是针对容器的,所以,它是以通用的方式为所有语言解决分布式计算问题。
Spring Cloud 有一套丰富且集成良好的 Java 库,作为应用栈的一部分解决所有运行时问题
二者可以互补。
小结
这里贴以下弹力设计的文章,感兴趣的可以看以下。
聊聊故障和高可用架构设计
幂等设计
重试设计
降级设计
熔断设计
限流设计
异步通讯设计
隔离设计
容灾 异地多活设计