微服务
一、微服务的概念
1.什么是单体,分布式,集群
1-1 单体
业务量很小时,只需将所有代码放在一个项目中,经打包之后部署在一台服务器即可。
1-2 分布式
业务更复杂,业务量更多的情况下,把单体项目按功能拆分成多个小项目,部署在多台服务器上
1-3 集群
分布式项目中,当某个业务,比如Redis服务挂掉了,或服务器内存不支持Redis服务继续运行,就需要添加多台Redis服务器共同对外提供服务和做备用数据库,这就是集群。
1-4 负载均衡
充当调度者的角色,将请求均匀发送到服务器集群上,避免大量请求都发送到一台服务器造成压力过大
2. 单体架构、垂直架构、SOA架构、微服务架构
2-1 单体架构
优点:只需维护一个项目,部署和测试方便
缺点:可扩展性差,技术栈固化,可靠性和稳定性低,维护困难
2-2 垂直架构(分布式架构早期形式)
将单体项目按功能拆分成多个小项目
优点:解决了并发问题,可以针对不同服务进行优化和扩展,一个服务的问题不会影响到其他服务的运行
缺点:服务与服务之间项目独立,互相调用不便,服务之间可能存在重复功能,重复性高
2-3 SOA架构
在分布式架构下,使用SOA调度中心对服务进行管理
优点:使用注册中心解决了服务与服务之间调用麻烦的问题
缺点:服务之间存在依赖关系,容易造成服务雪崩,且服务关系复杂,维护、测试、部署困难
2-4 微服务架构
在SOA架构下进一步增强,所有服务彻底拆分,为每个服务单独设计数据库表
优点:所有服务独立,任务划分清晰且利于功能扩展
缺点:技术成本高
3.什么是微服务
将项目中所有功能,拆分成只负责各自业务的小的服务,通过服务中心的不同组件来管理这些服务。
3-1 常用服务组件
二、服务治理(注册与发现)
1.解决问题
传统分布式架构,以代码硬编码方式解决服务之间相互调用的问题,但无法实现负载均衡且当业务增多时,维护困难。
这时可以采用服务治理来解决。
2.什么是服务治理
服务治理是微服务架构中最核心,最基本的模块,用于实现各个微服务间的自动化注册与发现
3. 基本概念:服务注册,服务心跳,服务健康检测,服务发现
3-1 服务注册:将自身的服务信息注册到注册中心中
3-2 服务心跳:注册到注册中心的服务,定时向注册中心发送心跳数据证明自身正常运行
3-3 服务健康检测:注册中心也定时检测服务是否正常发送心跳数据,来检验服务是否正常对外提供服务
3-4 服务发现:其他服务需要调用别的服务,到注册中心查找该服务的信息,根据得到的服务列表,结合负载均衡器,分配调用服务器,实现服务的调用
三、高并发
1.什么是高并发
在很短一段时间内,大量用户访问系统程序,并且需要处理大量请求
2. 高并发场景下可能出现的问题
2-1 性能问题(请求处理不过来)
高并发场景下,系统处理不了这么多请求,所以请求的线程只能等待,导致响应时间边长甚至超时,严重影响用户体验
2-2 数据一致性问题(数据错乱)
高并发读写场景下,多个线程同时访问或修改数据,导致执行顺序不确定,最终出现数据不一致错误
2-3 可用性问题
高并发场景下,大量请求无法响应,导致其一直处于等待状态,占用了大量的服务器资源(内存,CPU,线程池等),最终导致服务器宕机,无法对外正常提供服务,甚至造成服务雪崩。
3 高并发场景常见问题的解决思路
2-1 性能问题(高性能)
缓存:提高请求处理速度,以空间换时间,将频繁读取但不经常改变的数据提前加载到缓存中,避免直接访问数据库而是从内存中读取,减少了响应时间和后端数据库的压力。
提升单个服务器的处理能力:采用异步化操作,比如使用消息队列,将耗时的操作(日志,短信,数据计算等)从主流业务中抽离出来,作为异步任务处理。
2-2 数据一致性问题(数据一致)
强一致性:
锁机制:保证数据写操作的原子性
分布式事物
弱一致性:
异步复制,消息队列,读写锁与版本号机制
2-3 可用性问题(高可用)
服务保护(熔断,降级,限流)
实现:使用Sentinel框架
熔断:当某个服务器故障,主动熔断该服务,避免造成服务雪崩
降级:当某个服务器故障,启用备用方案,不会影响用户的正常使用,但用户体验可能下降。
限流:控制请求的流量,避免大量请求直接发送到服务器上。
负载均衡
实现:Nginx,F5,SLB等
将请求均匀的分布到健康的服务实例上,避免单节点压力过大
四、远程调用,负载均衡
常用组件:Feign
Feign是SpringCloud提供的服务组件,只需声明一个接口,即可将远程服务调用变得像本地调用一样简单
五、服务防护
高并发场景下,服务器处理不了这么多请求,导致无法对外正常提供服务造成服务器宕机甚至雪崩,这时就需要一些防护机制防止这种问题的发生。
1.常用的服务防护机制:隔离,超时,限流,熔断,降级
1-1 隔离
上层服务需要调用多个下层服务完成业务,可以将上层服务的线程资源均匀分配给这些下层服务,各自提供各自的业务,避免单个下层服务故障影响其他正常服务。
1-2 超时
上层服务调用下层服务时,可以设置一个响应时间,若超过响应时间下层服务未做出响应,则断开下层服务的请求,避免长时间占用造成线程资源浪费
1-3 限流
限制流量的输入与输出,保证系统的正常运行
1-4 熔断
主动熔断出现故障的服务,避免其影响其他服务的正常运行
1-5 降级
熔断后的备选方案,当某个阶段出现故障被熔断后,采用降级机制保证服务的正常提供,以降低用户体验的手段来保证服务的正常运行。
2. 常用的服务防护组件-----Sentinel
2-1 什么是Sentinel
是阿里巴巴公司开源的用于服务防护的服务中心组件
2-2 为什么用Sentinel
1.完全开源,免费使用
2.经过市场验证,可靠性高
3.生态好
2-3 怎么使用
3. Sentinel提供的五种流量控制规则
流控规则、降级规则、热点规则、系统规则、授权
六、服务网关Gateway
1.什么是API网关
系统的统一入口
2.常用网关
2-1 Ngin+lua
2-2 Kong
2-3 Zuul
3.Gateway
优点:
性能强、功能强、设计优雅
缺点:
不是传统Servlet编程模型,学习成本高
不能部署在Tomcat,Jetty等Servlet容器中,只能打包成Jar包