本文将要阐述的技术栈公众号 Java后端 都有发布过相关文章,关注 Java后端 公众号,回复 666 下载 PDF 版本。
通常来说,当用户触发某个行为后,客户端会通过http/https请求,和我们的服务器建立连接,发送请求,往往这个请求首先会被链接到负载均衡(LB)上,负载均衡根据配置,将请求转发到内部的API服务上。这些API服务,根据不同的业务逻辑会请求其他服务(Service),这些服务各司其职,例如读写某 Mysql 表、读写缓存,甚至请求搜索引擎来完成相应的任务。而API服务在完成相应的步骤后,也会将数据返回给客户端,客户端根据前端逻辑完成相关的展示。
显然,这份配置中要指定 user api 服务已经部署实例的 IP 地址和端口。如果没有自动化的发布方案,意味着每次开发新的API都需要在服务发布好以后,更新 Nginx 配置,然后通过 reload nginx 的方式将API发布上线。如果API不经常变动,这种做法也能支撑业务发展;但是如果公司业务快速发展,经常频繁发布API风险就会比较大了。在服务重启切换配置的过程中,可能导致一些请求处理被丢弃,就连服务扩容和缩容(增加减少负载均衡实例),也要变更相应的nginx配置。
如果使用 Spring Cloud 或者 Dubbo 等微服务框架,可以通过配置实现使用 Consul 作为服务注册中心,服务启动后,在Consul提供的Web界面就可以查到相应的服务。服务客户端可以在第一次调用服务端前,通过Consul进行服务端实例的查询然后按照查询奥的服务实例进行远程调用。 Consul 的 web界面:
微服务框架
开源社区中知名的微服务框架包括 Spring Cloud, Dubbo 等,这些框架配合生态中的一切其他组件可以解决例如服务注册&发现、负载均衡、熔断限流、调用链追踪等绝大多数问题。不过当业务发展到一定阶段,还会有更多问题要解决,例如服务调用鉴权等问题。
Mycat就是一个解决数据库分库分表等问题的数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,Mycat 实现了 Mysql 的原生协议,对于应用它感知不到连接了 Mycat,因为从协议来讲,两者是一样的。而Mycat将应用的请求转发给它后面的数据库,对应用屏蔽了分库分表的细节。Mycat的三大功能:分表、读写分离、主从切换。 下图通过 Mycat schema 配置和实际 DB 部署来简要说明 Mycat 分库分表功能的实现:
例如表 A,配置中它有两个数据节点,分别是 datanode1 和 datanode2,含义是逻辑表 A实 际对应了两个物理存储,分别是 db1 和 db2。 对于应用而言,应用连接 Mycat 感知到的时候逻辑表 A,而在底层 A 被拆分,存储在两个 db 中。
DRC
DRC 是 Data Replication Center 的缩写,在使用Mysql作为核心存储的场景下,我们可以使用Mysql原生的主备方案,实现同城灾备。但是如果 Mysql 部署在跨国,跨洲的场景下,原生的灾备方案就有诸多问题了,所以各大厂几乎都有自己的DRC方案。 不过,虽然各自有不同的实现,但是原理和依赖的核心组件基本相同,本文从互联网上找到饿了么DRC组件阐述其原理。
本图中,异地机房分别为北京机房和上海机房。本地机房(图中为北京机房)会启动一个 DRC Replicator,它和Master节点通信并在通信协议上模拟 Mysql Slave,Replicator将Master数据库的binlog变更实时拉取到本地。然后把binlog解析,通过消息中间件将变更发送到异地机房(北京机房)。异地机房启动一个DRC Applier的应用消费数据变更消息,然后把这个变更操作同步到本机房的Master上,就完成了异地数据同步的操作。图中展示的是北京机房数据同步到上海机房的场景,实际反过来也是一样。
前文讲述了 Mysql 和 Redis,或许对于大多数公司,这两类存储已经足够。前者用于保存业务数据,后者用于集中式缓存。但是对于大厂,还有若干场景上面两种存储无法满足:例如推荐系统在线预测场景,需要将用户画像、商品画像、商家画像、用户商户交叉画像在线加载预测上下文,特征处理后给到模型做预测打分。ToC的互联网产品的注册用户很可能过亿,所以用户画像总存储很可能百G甚至T。