本文依旧主要参考沈剑大佬的微服务设计相关的五篇博文及其精彩评论,文末是完整参考。
程序就是:数据的传输、数据的转换、数据的存储。
1、分层架构
1.1 典型的互联网分层架构
- 客户端层
- web 站点层
- 业务服务层:整个多个相关单一服务的数据,对外提供通用功能,减少重复代码
- 数据库访问层:对外提供某个系统的数据访问服务、
- 数据存储层:db/缓存
1.2 分层架构的本质
互联网分层架构的本质,是数据的移动。
一般数据处理都是通过移动数据,固定 CPU 来实现的。
- 跨进程移动:数据从数据库和缓存里,转移到service层,到web-server层,到client层
- 同进程移动:数据从model层,转移到control层,转移到view层
互联网分层架构中,数据的传输格式(协议)与数据在各层次的形态很重要
1.3 “分层架构演进”的核心原则与方法
分层的目的:遵循单一职责原则,对系统进行模块化拆分封装,实现服务自治,复用解耦,便于系统的维护和水平扩展。
- 让下游能屏蔽数据的获取细节,封装
- 让上游更高效的获取与处理数据,复用
1.4 微服务拆分的时机
数据访问层拆分
当业务越来越复杂,垂直拆分的系统越来越多,数据库实施了水平切分,数据层实施了缓存加速之后,底层数据获取复杂性成为通用痛点的时候,就应该抽象出数据访问层,简化数据获取过程,提高数据获取效率,向上游屏蔽底层的复杂性。
业务服务层拆分
业务越来越复杂,垂直拆分的子系统增加,数据访问层服务逐渐增加,各个子系统的web站点层可能需要整合多个数据访问层服务或者其他相关的单一服务的数据,甚至子系统之间出现了一些重复性的整合工作,这时可以把共同的功能抽象出业务服务层,简化数据处理和调用过程,向 web 站点层屏蔽底层的复杂性。
1.5 微服务拆分可能带来的问题
- 本地调用变成远程调用,请求处理时间可能会增加
- 系统复杂性上升,运维可能更加复杂()
- 定位问题可能会更加麻烦
2、前后端分离
2.1 什么时候可以考虑前后端分离
当展示层也就是前端页面变化频繁,但是很少涉及业务逻辑的改动,避免每次页面改动牵连后端一起部署上线,单次上线成本和复杂度较高时;
或者需要支持多端,可能需要复制多份 web站点层的代码,引入的大量重复代码极大降低系统的可维护性。
2.2 怎么分离
web 站点层分成站点展示层和站点数据层
- 站点展示层用于数据展示和用户交互,由前端开发和维护;
- 站点数据层负责业务逻辑和向前端提供数据,由后端开发维护,前端拿到数据后进行展示渲染。
2.3 好处
1、多端的业务,只需前端的站点展示层部署多套即可,后端的站点数据层只需部署一套服务,站点展示层通过不同的传参或者调用不同的接口来获得自己想要的数据。
2、前后端分离维护、开发和部署,前后端解耦合,提高可维护性,简单的前端修改无需重新修改和部署后端。
3、约定好交互接口后,前后端并行开发,加快产品迭代速度。
2.4 缺点
1、数据和页面分离,需要等 js 请求到完整数据后才能展示完整的网页,但是部分搜索引擎的 spider 爬虫可能不支持执行 js,从而只抓到了没有数据的页面,导致影响网页的 SEO(Search Engine Optimization,搜索引擎优化)。
2、产品开发需要提前约定好接口变动,且增加联调环节,从而增加了沟通成本,可能导致产品迭代的速度降低。
3、前端越来越专业,对前端同学的综合能力要求越来越高
3、问题:
问:什么系统是移动 cpu,而不是移动数据
hadoop和spark等大数据处理系统,因为大数据处理的场景下,数据量太大,数据传输需要的时间长。
问:服务器消息超时重发机制是否可以采用监听redis超时机制来实现?或者有没有其他更好的办法?
定时器或者消息队列的延迟消息做超时重发比较合适。redis 太重。
问:对于一些原本可以直接join的表被分库分表了,那dao层如何去用实现他们的 join 呢
高并发量,大数据量的场景下,不推荐使用 join,效率太低,推荐转换成在服务层多次查询数据,或者存储冗余数据。
问:第三方接口查询慢怎么办
如果第三方接口数据变化频度不高,且业务接受一定延迟,可以考虑使用 redis 把第三方接口数据缓存下来,定期刷新 redis 缓存。
问:浏览器和 app 两种客户端,服务端返回的数据格式是一样的吗
浏览器返回的是 html 或者 json 个数的数据,app 一般返回都是 json 格式的数据,在本地客户端进行渲染。
问:前后端联调时间长可能是什么原因
1.前后端联调合作磨合时间短,
2.前后端理解的业务或者接口参数不一致。
问:循环依赖怎么解决
架构设计不合理,分层架构,上游调用下游,下游不能调用上游,非要交互可以采用消息队列 MQ 来实现。
问:运营管理 admin 系统,建议做前后端分离吗
后台系统对交互/体验要求不高,也就是可能不需要支持多端且页面改动不频繁,前后端分离可做可不做。
问:前端的站点展示层是怎么部署的
NodeJs吗,还是直接部署静态页面。