微服务笔记
微服务笔记
单体应用架构演化
为用户提供服务的功能都集成在一起.
如某个服务,需要nginx,php,mysql,redis等来完成.
lnmp集成环境
资源配置不同怎么办,比如php耗cpu资源,mysql耗IO资源,文件系统耗磁盘资源,使用应用数据分离.
演化:nginx,mysql,php都部署在同一台机器上.
应用数据分离
数据库访问压力过大怎么办,使用缓存银弹,过滤大部分的读操作.
演化:nginx,php,mysql分别部署在不同的服务器上,通过相互调用为用户提供服务.
缓存
并发请求过高怎么办,使用负载均衡处理更多的请求连接.
演化:nginx,php,mysql,redis
负载均衡集群
缓存不能命中的读操作太多怎么办,使用数据库读写分离,保证主库的写入.
演化:nginx,php(多台服务器),mysql(库拆分),redis
读写分离
访问速度因地域不同而导致速度差别很大怎么办,使用cdn.
演化:nginx,php(多台服务器),mysql(写集群,读集群),redis
内容分发网络cdn
高并发,大流量,大数据怎么办,拆成更小的模块使用分布式.
演化:cdn,nginx,php(多台服务器),mysql(写集群,读集群),redis
分布式缓存,数据库
使用分布式后,搜索变成分片式,性能降低怎么办,用搜索引擎.
演化:cdn,nginx,php(多台服务器),mysql(分布式,表拆分),redis(远程分布式缓存)
搜索引擎
架构复杂,维护困难,扩展不易,如何管理,使用分布式服务,将业务拆分,独立部署.
演化:cdn,nginx,php(多台服务器),es(搜索引擎),mysql(分布式,表拆分),redis(远程分布式缓存)
分布式服务
大道至简,微服务就是分布式服务的一种实现.
演化:cdn,nginx,php(业务拆分),es(搜索引擎),mysql(分布式,表拆分),redis(远程分布式缓存)
架构演化图
什么是微服务
微服务就是分布式服务的一种实现.
微服务的想法在于将一个对外服务分而治之部署成多个内部服务,使用尽可能少的内部服务集合就能达成对外服务的目的.
微服务的特性
- 自主性,服务自治
服务之间相互独立,互不影响,通过明确的API进行通信.
- 专用性,单一职责
每个服务针对一组功能而设计,专注于解决特定的问题.
微服务设计原则
微服务的设计原则离不开业务设计和分布式设计,业务设计以面向对象为主,分布式设计主要以AKF拆分原则为主.
面向对象
面向对象三大基本特征:封装,继承,多态.
面向对象设计标准:高内聚低耦合
面向对象设计五项原则SOLID:
- S:单一职责,比如图片打水印的类,它不应该不负责图片上传下载功能的实现,应该新建一个类实现.
- O:开闭原则,当类的方法不能满足需求时,对内修改关闭,对外以接口形式开放让实现类扩展功能.
- L:替代原则,就是允许子类重写父类的方法.
- I:接口隔离,接口只规定公用方法,差异的方法另用一个接口.
- D:依赖倒置,控制反转的意思,提倡使用依赖注入,依赖接口而不依赖具体实现.
AFK原则
AFK(Art of Scalability),AFK可扩展立方体,系统的可扩展模型.
Y轴:业务拆分,一个对外服务部署成多个内部服务.
X轴:水平复制,负载均衡集群,用多个实例提升一个对外服务的性能.
Z轴:用户需求,根据具体的用户需求拆分,用户的地域分布(国内,国外),用户的群体(商家,消息者).
前后端分离原则
未分离
混合开发,前后端代码交织在一起,全栈模式.
演化成前端写界面,后台写完接口,将界面改成模板编译之后再返回到浏览器.
前后端分离
前端负责view层,后端提供接口,通过ajax进行交互,此时后端还控制着前端的路由和web端和app端的交互.
演化成,前端负责view层,中间层(nodejs服务器)负责业务层的交互逻辑,后端负责model层和业务处理逻辑.
其实变成了,前端,中间层,后端,中间层做为桥梁一边调用后端的接口,一边为前端做整合生成单页应用(SPA)之类的.
无状态服务
如将sessionid抽离出来做成单独的服务.
接口规范
RestFul.
服务网关(API Gateway)
为用户提供统一接口.
配置中心
服务提供者的配置文件管理,如.env文件.
服务中心
服务注册
服务提供者在启动时,向服务中心注册自己的ip等配置信息.
服务发现
服务消费者向服务中心发出请求,能发现要访问的服务提供者,并拿到相关ip等配置信息.
服务网格
服务之间调用,多语言支持,负载均衡支持,使用中间层服务网格(Service Mesh).
服务通信
用rpc为服务间通信提供多平台和更高性能的支持.
服务容错
控制请求频率和服务降级处理.
服务部署
devops