Golang 微服务入门
一般来说,单点故障服务崩溃是不能被容忍的,因此都能满足分区容错性,因此可以认为 CAP 的 P 总是成立。因为可用性相比于一致性,更为重要,因此主流的做法是在满足 AP的同时,提高C,常用的方法如 最终一致性方案、TCC事务补偿型方案 和 最大努力通知型。X轴 —— 代表无差别的克隆服务和数据,工作可以很均匀的分散在不同的服务实例上;Y轴 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划
·
1 微服务的目标
- 微服务的精髓在于服务拆分
- 如何拆分才能粒度合适,不会太细,也不会太大
- 如何确认服务边界
- 如何拆才能高内聚低耦合
- 如何拆分才能降低开发复杂度
- 如何拆分提高系统承载能力
- 如何拆分才利于团队之间的协作开发
2 微服务的基本需求
- HTTP REST、RPC
- 日志功能
- 限流
- API监控
- 服务注册与发现
- API网关
- 服务链路追踪
- 服务熔断和降级
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 友情链接
- https://www.cnblogs.com/guanghe/p/10978349.html
- https://www.jianshu.com/p/d08d0c14810f
- https://www.ruanyifeng.com/blog/2018/07/cap.html
- https://carc.top/post/94.html
- https://zhuanlan.zhihu.com/p/71093510
- https://www.jianshu.com/p/cffe039fa060
更多推荐
已为社区贡献1条内容
所有评论(0)