分布式架构

92 阅读4分钟

为什么需要微服务架构?

单体架构只适合用户群体较少的场景,当我们的业务量越来越大,单体架构已经无法满足我们的需求,通过拆分单体架构项目变成分布式架构才能应对大规模的应用场景。

单体架构图 image.png 微服务架构 image.png

如何拆分单体架构呢?下面有两种方式对项目进行拆分:

  • 垂直拆分:按照业务模块进行拆分,比如电商系统(用户服务,商品服务,订单服务,支付服务)
  • 水平拆分:按照数据量进行拆分,比如电商系统数据库中的数据按照用户ID划分,从1-1000拆分;按照时间划分,3个月前的订单,最近三个月的订单;按地区划分,北京,天津,上海的订单。

为什么要这样做呢?因为单点故障(系统一处发生故障,导致整个系统崩溃)对系统造成的影响,防止高并发造成数据雪崩,影响用户正常使用。

除了业务之间做了隔离,还要考虑数据库之间的隔离,一个业务用一套自己的数据库。不读取对方的数据库,只通过服务进行耦合。


架构是怎么样变化的过程?

image.png

SOA(基于服务的架构)和单体架构没什么两样,图中的齿轮就是一个一个的服务,调用一个服务就会带动另一个服务,整个服务架构高度耦合。

微服务架构松耦合,每一个微服务独立完整运行,开发速度快,部署快,隔离性高,扩展度好。但是测试和维护比较麻烦,需要用SpringCloud部署和调度。

性能

构建分布式系统目的是为了提升项目访问的吞吐量,提高系统可用性。从技术层面对进行相应的优化,主要在两个方面,大流量处理把大数量的请求用集群的方式分散到不同的机器上。对业务的可用性要防止发生雪崩,我们要对服务进行降级处理。

提高性能这块还有一些方法:

  • 加缓存:以前做单体架构的时候把数据一股脑的放在redis中,现在面对的分布式架构,再用以前的方式做的话,如果reids挂了,那么大量的请求都跑到mysql里,造成不可挽回的后果。redis集群很好的解决这个问题,一个redis不够用,那我就多加几台redis,把它们变成一个个节点,串起来统一管理。
  • 负载均衡:把请求分开到不同的机器上,避免某个机器压力过大
  • 异步:如果在同一时刻突然爆发式的发起请求,很容易导致系统压力过大。消息队列让所有请求都排好队,根据后端能够处理的速度来处理请求。速度会变慢,队列中的消息会丢失,要对消息做持久化。
  • 数据镜像:把数据拷贝多份,修改一个节点上的数据,会自动同步数据。
  • 数据分区:这个有点复杂,涉及到不同位置访问不同数据区

docker可以方便的解决上所遇到的问题,虚拟容器化的技术可以很方便的软件部署、调度、管理。


监控

监控服务情况:服务搭建好之后,我们想了解系统内部资源调度和外部API服务使用情况,可以用Zipkin开源框架。

image.png 这张图上表示的服务调度时间,有了这些直观的数据表示,我们可以快速了解用户访问了哪些请求出现问题,帮助我们快速排查。

如何操作调度处理?

  • 如果发现某个服务过慢因为cpu使用过多,我们可以做弹性伸缩。意思就是根据需求动态调整系统资源(实例,内存,网络),在负载较轻的情况,自动减少系统资源;在负载较重的情况,自动增加系统资源。达到资源的高效使用和成本优化。
  • 如果出现mysql处理过慢,通过流量限制或者降级处理。