1 微服务的目标

  • 微服务的精髓在于服务拆分
    • 如何拆分才能粒度合适,不会太细,也不会太大
    • 如何确认服务边界
    • 如何拆才能高内聚低耦合
    • 如何拆分才能降低开发复杂度
    • 如何拆分提高系统承载能力
    • 如何拆分才利于团队之间的协作开发

2 微服务的基本需求

  1. HTTP REST、RPC
  2. 日志功能
  3. 限流
  4. API监控
  5. 服务注册与发现
  6. API网关
  7. 服务链路追踪
  8. 服务熔断和降级

3 AKF扩展立方体理论

AKF扩展立方体(Scalability Cube),是《架构即未来》一书中提出的可扩展模型,这个立方体有三个轴线,每个轴线描述扩展性的一个维度,他们分别是产品、流程和团队:

  • X轴 —— 代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上;

  • Y轴 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分;

  • Z轴 —— 关注服务和数据的优先级划分,如分地域划分。

在这里插入图片描述

3.1 X轴扩展

  • 对于应用,直接复制原有的单体服务组成集群,通过网关负载均衡到不同主机上,从而提高容量。
  • 对于数据库,从单库,水平克隆为多个库上读,一个库写,通过数据库的自我复制实现,要允许一定的读写时延。
  • 该方法适用于系统初期扩容,成本低,随着流量的继续增大,会触及数据库读写瓶颈。

3.2 Y轴扩展

  • 对于应用,面向服务分割,基于功能或者服务分割,例如电商网站可以将登陆、搜索、下单等服务进行Y轴的拆分,变为分布式系统,每一组服务再进行X轴的扩展。
  • 对于数据,根据不同的信息类型,分割为不同的数据库,即分库,例如产品库,用户库等。
  • 适用于业务复杂,数据量大,代码耦合度高,团队规模大,可以解决指令集和数据集的约束,解决代码复杂度问题,可以实现隔离故障,可以提高响应时间,可以使团队聚焦更利于团队成长,成本较高。

3.3 Z轴扩展

  • 面向查找分割,基于用户、请求或者数据分割,例如可以将不同产品的SKU分到不同的搜索服务,可以将用户哈希到不同的服务等。
  • 按照一定算法,进行分片,例如将搜索按照MapReduce的原理进行分片,把SKU的数据按照不同的哈希值进行分片存储,每个分片再进行X轴冗余。
  • 适用于用户指数级快速增长场景,能解决数据集的约束,降低故障风险,实现渐进交付,可以带来最大的扩展性,成本最昂贵,且不一定能解决指令集的问题。

4 CAP理论

分布式系统的三个目标只能同时保证两个

  • Partition tolerance,中文叫做"分区容错"
  • Consistency 中文叫做"一致性"
  • Availability 中文叫做"可用性"
    在这里插入图片描述

一般来说,单点故障服务崩溃是不能被容忍的,因此都能满足分区容错性,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

  • 分区容错性很好理解,不把鸡蛋放同一个篮子里,服务的这台主机崩了,还有别的主机继续提供服务。
  • 什么是一致性?
    考虑数据库读写分离主从双备份的情况,写数据在主节点进行,然后通过Bin log同步到多个从节点,应用往主节点写入成功后,立即去从节点读取,如果主从节点之间的同步恰好卡顿,则无法从从节点读到刚返回的数据,那么就不满足一致性。
  • 什么是可用性?
    当一个请求到达一个服务时,服务应该快速响应(注意是分布式系统中,可能用千万级亿级用户)。

那么为什么一致性和可用性之间存在矛盾?

  • 还是考虑上述场景,为了保证服务的一致性,当用户往主节点写入数据,为了保证一致性,要先对从节点加锁,不让从节点读,然后主节点进行数据的写,然后数据往从节点同步,同步成功后返回给主节点,主节点接受到同步成功信号后释放锁,使得从节点可以读。
  • 在这样的前提下,服务的性能低于单机服务,因此在用户量大,数据量大时根本无法做到及时响应。
  • 相反,为了及时响应,那么服务之间的同步和用户的请求之间是异步的,那就无法满足数据的实时一致性。

因为可用性相比于一致性,更为重要,因此主流的做法是在满足 AP的同时,提高C,常用的方法如 最终一致性方案、TCC事务补偿型方案 和 最大努力通知型。

5 缓存和异步

缓存从用户端到CPU寄存器依次有

  • 浏览器或客户端对静态资源的缓存
  • 操作系统对某些网络资源的缓存
  • CDN对静态资源的缓存
  • 服务端 Session 对当前用户热数据的缓存
  • 服务端运行节点缓存
  • 服务端的外部缓存,如Redis
  • 服务端内存与CPU的二级缓存
  • 二级缓存与寄存器

异步的作用

  • 用户消息落库,日志落库等不要求实时性的场景
  • B端批量离线任务,降低对后端服务如数据库的压力,削峰填谷,减少短时间高流量对服务的压力
  • 常用的异步中间件: Kafka,Rocket MQ,Rabbit MQ等

6 Golang 微服解决方案

[TBC]

7 友情链接

  1. https://www.cnblogs.com/guanghe/p/10978349.html
  2. https://www.jianshu.com/p/d08d0c14810f
  3. https://www.ruanyifeng.com/blog/2018/07/cap.html
  4. https://carc.top/post/94.html
  5. https://zhuanlan.zhihu.com/p/71093510
  6. https://www.jianshu.com/p/cffe039fa060
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐