从0开始学架构: 1. 互联网架构演义

2020-03-30  本文已影响0人  牧码人爱跑马

架构的终极目标是降本增效。是各方面折中的结果。

本文以互联网软件架构的演进之路为主线,结合案例分析每个阶段架构的适用场景、技术栈和优缺点。

0、架构的本质

架构是对业务场景抽象后,对各方面因素折中后的结果,这些因素包括:

1、架构演进概述

架构演进

从单体架构演进到微服务架构的精髓用一个字概括:拆。

2、单体架构设计与实践

单体架构

客户端APP发送请求到单体服务,服务端接收到请求后从DB读取数据,并进行业务逻辑处理,最后对返回结果进行封装,返回结果给APP。

2.1 单体架构优点

只有一个进程,简单。

单体架构优点

注意单体架构实际也必须扩展,即使只有一个QPS,生产环境下也不能只部署一个单体实例。
上图中,生产环境中Nginx一般也至少两台,前面还有一组主备的LVS,LVS的VIP直接和app交互。
上面的单体WAR必须是无状态的,才是可扩展的,因为这样它的冗余备份才是完全对等的。

2.2 单体架构适用场景:

金融案例:
股票、虚拟币等高频交易的背景下,量化交易软件要及时毫秒级捕捉价格变化。所以service和DB最好在一台机器上(单体),请求端和服务端也尽量在同一机房。
思考下公司哪些业务适用于单体架构。

单体架构缺点

image.png

单体架构最大的一个痛点就是耦合度太高,业务壮大后都在一个单体内肯定不行。

拆分

由此,单体架构需要破局演进。很自然想到,把上图单体服务原本的一个进程安装业务种类垂直拆成三个服务进程。当然可以按功能水平拆分,并且数据库也需要拆。

总结:
1、 数据库存储量大 、请求量大,拆分主要两种方式:

2、 架构拆分
其实架构的拆分也和DB的拆分的思路是类似的:

3、面向服务架构设计与实践

SOA是由单体架构的垂直方向拆分演变而来。


SOA

但是生产中的SOA架构和上图这样的理想模型是有一点差别的。
以58为例:

image.png

每个单体有自己的DB,服务间通信有soap(也可以json)。

3.1 SOA架构缺点

4、水平分层架构设计与实践

按请求功能进行聚类。
水平风向拆分,如电商案例(按请求链路拆分)

image.png

APP到GW 传输部分用的http协议,数据部分用json。
网关到业务逻辑层一般用TCP(也可以用http2.0,支持长连接,机房内部可以用),数据部分用pb/msgpack,可以跨语言的。
数据访问层到DB是SQL2003.

业务逻辑层和数据访问层可以考虑合并成一个进程,从而降低分层后交互的延迟。又能节省成本。

接下来深入介绍每一层的功能。

网关层功能

纯数据,前后端分离。

header: uid + cmd + session id + body length
变长body:{k1:v1, k2:v2}(网关是不关心这部分,因为属于业务语义部分。)

网关层框架对比

业务逻辑层功能

数据访问层功能

4.1 水平分层架构服务和协议

image.png

思考如何把同步变异步。加个MQ就可以。
所以上面如果想异步,MQ要加在GW与logic层之间。

请求异步

4.2 水平分层架构缺点

如业务逻辑层会部署多个实例,但是公司所有的服务逻辑都在一起,粒度太粗。

4.3 水平层次划分案例

image.png

后来路由层干掉了,存到Redis

百度空间案例:

image.png

5、微服务架构与实践

既做水平拆分,又做垂直拆分就是微服务。比SOA粒度更小,且去掉了ESB。
没必要按DDD来做,落地难度太大。

微服务架构

微服务中垂直拆分不容易。比如,用户功能中有用户注册、用户登录、用户查询。读(用户登录)会影响写(用户注册),因此要考虑读写分离,所以这样就是按API的粒度来拆分,其实是否要拆主要就看读写之间影响是不是很大。另如下单和查询。

再如user,user主库用于写,从库用于读。从库没有数据,再去主库查。但是insert可以,update不行,解决方案是主从强同步,主进行切片。根据uid就可以知道落到哪个库。或者采用集群的方式。

image.png

网关层相当于SaaS层。
一般没必要按API的粒度去拆分。

image.png

以上不同层其实可以用不同语言来写。

微服务问题1:服务设计和服务治理强耦合。

image.png

微服务问题2: 基础组件升级困难

image.png

微服务问题3:多语言之间通信问题

image.png

解决方案:微服务2.0,即service mesh。就是把服务设计(业务)和服务治理(通信)解耦。
把通信组件独立为一个进程,叫sidecar,和应用程序在同一台机器。

6. Service Mesh 架构设计与实践

定义 架构

服务网格化的目的:把和业务无关的服务治理功能剥离出来。

image.png

linkerd后来被istio被替代了。

Service Mesh 优势

image.png lstio 最普适的完整SM架构

重点注意,数据访问流向。
上图数据访问层访问DB画的不对,应直接访问DB/Cache。

7. 大中台架构设计与实践

出现 阿里大中台组织架构 分类 image.png

同层调用不允许,可以直接跨层向下调用,为了避免循环调用。

业务数据和中台数据如何存储

大中台化数据架构 数据2

上图是mysql要这么做,如果是MongoDB不需要扩展表,只要一张表,因为不需要schema。

8. 云原生架构设计与实践

重点是部署。

  1. 按需使用和弹性伸缩
  2. 无状态化设计(stateless)
  3. 自动化部署和管理
  4. CICD

9. 架构演进

image.png image.png

公共逻辑层即技术中台。

架构设计思考:

image.png

思考:

上一篇 下一篇

猜你喜欢

热点阅读