微服务笔记


单体应用架构演化

为用户提供服务的功能都集成在一起.

如某个服务,需要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(远程分布式缓存)

架构演化图

flowchart TB subgraph s1 direction LR A["lnmp集成环境"] B["应用数据分离"] C["缓存"] A --> B --> C end subgraph s2 direction LR D["负载均衡集群"] E["读写分离"] F["内容分发网络cdn"] D --> E --> F end subgraph s3 direction LR G["分布式缓存数据库"] H["搜索引擎"] I["分布式服务"] G --> H --> I end s1 --> s2 --> s3

什么是微服务

微服务就是分布式服务的一种实现.

微服务的想法在于将一个对外服务分而治之部署成多个内部服务,使用尽可能少的内部服务集合就能达成对外服务的目的.

微服务的特性

  • 自主性,服务自治

服务之间相互独立,互不影响,通过明确的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