写在开局 : 本文接近 4 万字长文, 717行, 全部阅读花费时间比较久!
用途 : 仅用作个人复习使用!
包括 SpringCloud 和阿里巴巴 常用的系列组件的部分知识点和常见面试题, 可以针对性复习阅读!
1. Spring Cloud
SpringCloud常用组件:
阿里巴巴组件 :
- 注册中心 / 配置中心 Nacos
- 负载均衡 Ribbon
- 服务调用 Feign
- 服务保护 Sentinel
- 服务网关 Gateway
Spring Cloud 是一套分布式微服务的技术解决方案,它提供了快速构建分布式系统的常用的一些组件
比如说配置管理、服务的注册与发现、服务调用的负载均衡、资源隔离、熔断降级等等
不过 Spring Cloud 只是 Spring 官方提供的一套微服务标准定义,而真正的实现目前有两套体系用的比较多。
- 一个是 Spring Cloud Netflix
- 一个是 Spring Cloud Alibaba
Spring Cloud Netflix是基于Netflix这个公司的开源组件集成的一套微服务解决方案,其中的组件有
- Ribbon——负载均衡
- Hystrix——服务熔断
3.Zuul——网关- Eureka——服务注册与发现
- Feign——服务调用
Spring Cloud Alibaba 是基于阿里巴巴开源组件集成的一套微服务解决方案,其中包括- Dubbo——消息通讯
- Nacos——服务注册与发现
3.Seata——事务隔离- Sentinel——熔断降级
有了 Spring Cloud 这样的技术生态,使得我们在落地微服务架构时。不用去考虑第三方技术集成带来额外成本,只要通过配置组件来完成架构下的技术问题,从而可以让我们更加侧重性能方面
服务注册 nacos & eureka
异同 | Nacos | Eureka |
---|---|---|
相同点 | 都支持服务注册和服务拉取,都支持服务提供者心跳方式做健康检测 | |
区别1 | 支持服务端主动检测提供者状态:临时实例用心跳模式,非临时实例用主动检测模式 | |
区别2 | 临时实例心跳不正常会被剔除,非临时实例则不会被剔除 | |
区别3 | 服务列表变更的消息推送模式,服务列表更新更及时(push/pull) | 只支持定时拉取,时效性相对差 |
区别4 | 默认采用AP方式,当集群中存在非临时实例,采用CP | AP, 不支持切换 |
负载均衡 Ribbon | 自定义
负载均衡背景
互联网早期,单体架构就能完成业务支撑,随着用户量增加,服务器并发量,请求也越多,单体会有以下问题:
- 软件的性能逐步下降,访问延迟越来越高
- 容易出现单点故障
为了解决这个问题,我们引入了集群化部署的架构,也就是把一个软件应用同时部署在多个服务器上
架构的变化带来了两个问题: - 客户端请求如何均匀的分发到多台目标服务器上?
- 如何检测目标服务器的健康状态,使得客户端请求不向已经宕机的服务器发送请求。
为了解决这两个问题,引入了负载均衡的设计,简单来说,负载均衡机制的核心目的是让客户端的请求合理均匀的分发到多台目标服务器,由于请求被多个节点分发,使得服务端的性能得到有效的提升。
负载均衡的实现技术
基于 DNS 实现负载均衡
基于硬件实现负载均衡
基于软件实现负载均衡
基于 DNS 实现负载均衡的方式,实现方式比较简单,只需要在 DNS服务器上针对某个域名做多个 IP 映射即可;
工作原理是: 当用户通过域名访问某个网站时,会先通过 DNS 服务器进行域名解析得到一个 IP 地址,DNS 服务器可以随机分配一个 IP 地址进行访问,这样就可以实现目标服务集群的请求分发。
除此之外,DNS 还可以根据不同的地域分配就近机房的 IP,比如长沙的小伙伴,可能会得到在湖南范围内最近的一个机房的 IP,在这个模式下可以实现「就近原则」实现请求处理,缩短了通信距离从而提升网站访问效率。
DNS 实现负载均衡的优点是: 配置简单,实现成本低,无需额外的开发和维护。
缺点是: 由于 DNS 多级缓存的特性,当我们修改 DNS 配置之后,会因为缓存导致 IP 变更不及时,从而影响负载均衡的效果。
基于硬件实现负载均衡
硬件负载设备,我们可以简单把它理解成一个网络设备,类似于网络交换机,它
3. 它的性能很好,每秒能够处理百万级别的请求,
4. 支持多种负载均衡算法,我们可以非常灵活的配置不同的负载策略
5. 它还具备防火墙等安全功能。
6. 硬件负载是商业产品,有专门的售后来支持,所以企业不需要花精力去做维护。
F5 是比较常见的硬件负载设备,由于硬件负载设备价格比较贵,一般应用在大型银行、政府、电信等领域。
基于软件实现负载均衡
所谓软件负载,就是通过一些开源软件或者商业软件来完成负载均衡的功能。常见的软件负载技术有:Nginx、LVS、HAProxy 等。
目前互联网企业绝大部分采用的都是软件负载,主要原因是:
- 免费,企业不需要投入较高的成本。
- 开源,不同企业对于负载均衡的要求有差异,所以可以基于开源软件上做二次开发。
- 灵活性较高
负载均衡的作用范围
负载均衡是作用在网络通信上,来实现请求的分发。
而在网络架构中,基于 OSI 模型,又分为 7 层网络模型
也就是意味着我们可以在网络的某些分层上做请求分发处理,因此根据这样一个特性,对于负载均衡的作用范围又可以分为:
二层负载:基于 Mac 地址来实现请求分发,一般采用虚拟 Mac 的方式实现,服务器收到请求后,通过动态分配后端服务的实际 Mac 地址进行响应从而实现负载均衡
三层负载:基于 IP 层负载,一般通过虚拟 IP 的方式实现,外部请求访问虚拟 IP,服务器收到请求后根据后端实际 IP 地址进行转发。
四层负载:通过请求报文中的目标地址和端口进行负载,Nginx、F5、LVS 等都可以实现四层负载
七层负载:七层负载是基于应用层负载,也就是服务器端可以根据 http 协议中请求的报文信息来决定把请求分发到哪个目标服务器上,比如 Cookie、消息体、RequestHeader 等
负载均衡的常用算法
负载均衡算法,就是决定当前客户端请求匹配到目标服务器集群中的具体哪个节点
- 轮询,也就是多个服务器按照顺序轮询返回,这样每个服务器都能获得相同的请求次数
- 随机,根据随机算法获得一个目标服务地址(就像古时候皇帝翻牌子),由于该算法具备随机性,因此每个服务器获得的请求数量不一定均等
- 一致性 hash,也就是对于具有相同 hash 码的请求,永远发送到同一个节点上。
- 最小连接数,根据目标服务器的请求数量来决定请求分发的权重,也就是目标服务集群中,请求更少的节点将会获得更多的请求。这是负载均衡中比较好的策略,真正能够实现目标服务器的请求均衡。
熔断 | 降级
监控 skywalking
问题定位 性能分析 服务关系 服务告警
springboot-admin prometheus+grafana(普罗米修斯) zipkin+skywalking链路追踪工具
微服务用skywalking监控
skywalking主要可以监控接口 服务 物理实例的状态,特别是压测时候可发现众多服务中哪些服务和接口比较慢,针对性分析优化;
设置告警规则,特别是项目上线后,如果报错,分别设置可以给相关负责人发短信和发邮件, 第一时间知道项目 bug 情况,进行修复;
2. 业务相关
限流
Nginx 限流
控制速率 (突发流量)
limit_req_zone key zone rate
key 定义限流对象 binary_remote_addr