Bootstrap

架构设计篇之微服务实战笔记(五)

第六章、设计高可靠服务

服务可用性对应用可靠性的影响

设计能够抵御外部依赖故障的服务

重试、限流、断路器、健康检查和缓存可以减少服务间的通信问题

不同的服务间采用安全的通信标准

6.1、可靠性定义

正常运行时间:在有些时间能够成功执行对应的工作

故障时间:因为故障不可避免,有些时间服务并不能完成工作

高可用服务衡量指标可以参考我的其他文章,服务与服务之间是要签署SLA服务等级协议,来保障核心服务的高可用。

6.2、哪些会出错

6.2.1、故障源

  • 硬件

  • 上游服务依赖

  • 数据存储-数据库

  • API,上传等第三方服务

  • 下游服务依赖

  • 其他相关组件,中间件

  • 网络通信

  • 内部代码Bug

  • 硬件

解决方案:异地部署,私有/公有混合部署

  • 通信故障

  • 依赖故障

6.2.2、连锁故障

服务出现多米诺骨牌效应

6.3、设计可靠的通信方案

6.3.1、重试

需要保证调用幂等性

但是为了防止服务过载,可以采用指数退避策略,通过重试操作之间增加变化的时间间隔来保证请求分布均匀,降低重试的频率。

6.3.2、后备方案

  • 优雅降级

  • 缓存

  • 功能冗余

  • 备份数据

6.3.3、超时

根据业务具体情况进行超时判断,选择合适的期限时间需要平衡时间约束来最大限度的提高请求成功的机会

6.3.4、熔断器

  • 发生问题时候,熔断

  • 依赖服务恢复之前停止故障服务调用

Hystrix停止维护---推荐resilence4j

6.3.5、异步通信

使用消息队列来进行异步通信,本质是解藕

6.4、最大限度的提高服务可靠性

6.4.1、负载均衡与服务健康

负载均衡

  • 确定底层实例哪些健康

  • 请求路由给不同实例

基于两个标准来衡量健康

  • 存活性

  • 就绪性

6.4.2、限流

  • 丢弃超过容量的请求

  • 关键数据优先

  • 丢弃不常见的客户端

  • 限制并行请求量

6.4.3、验证可靠性和容错性

  • 压力测试(参考可伸缩性的艺术 The Art of Scalability)

  • 混沌测试(为了发现系统弱点而进行的实验,精确模拟真实系统的故障)

6.5、默认安全

提前将故障能力预知并且坐防范

6.5.1、框架

将可靠性的组件进行组件化封装成框架

6.5.2、服务网格

通过代理方案,不直接交给系统应用,这个可以通过tomcat前面增加一个nginx来实现。