五大组件
- 注册/配置中心 nacos
- 远程调用 Feign
- 负载均衡 Ribbon
- 服务保护 sentinel(实现限流、降级、熔断)
- 网关 gateway
注册中心
Eureka
-
服务注册:服务提供者把自己的信息注册到Eureka,由Eureka来保存这些信息
-
服务发现:消费者向Eureka拉取服务列表信息,若服务提供者有集群,则消费者会根据负载均衡算法,选择一个发起调用
-
服务监控: 服务提供者会每隔30s向Eureka发送心跳,报告健康状态,若90秒没接收到心跳,则将服务提供者从Eureka中删除
Nacos与Eureka的区别
共同点:
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康监测
不同点:
- Nacos支持服务端主动监测服务提供者的状态:临时实例采用心跳模式(默认),非临时实例采用主动检测模式
- 临时实例心跳不正常时会被剔除,非临时实例不会
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认AP,非临时实例时CP模式,Eureka默认AP
- Nacos支持配置中心
负载均衡
Ribbon的负载均衡策略
- 轮询
- 按照权重:响应时间越长,权重越小
- 随机选择一个可用的服务器
- 以区域可用的服务器为基础进行选择,再对区域内的做轮询(默认)
如何自定义负载均衡策略
- 创建类实现
IRule
接口(全局) - 通过配置文件配置某个服务的负载均衡策略(局部)
项目中是如何实现负载均衡
Feign远程调用的过程中,底层负载均衡LoadBalance
就是使用了Ribbon
服务雪崩
服务雪崩:指一个服务失败,导致整条链路的服务都失败的情形
解决办法
- 服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与feign接口整合,编写降级逻辑(尽可能的把系统资源让给优先级高的服务)
- 服务熔断:默认关闭,需要手动打开,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求(某个微服务不可用)
网关
工作流程
- 路由判断:客户端的请求到达网关后,先经过 Gateway Handler Mapping 处理,这里面会做断言(Predicate)判断,看下符合哪个路由规则,这个路由映射后端的某个服务。
- 请求过滤:请求到达 Gateway Web Handler,这里面有很多过滤器,组成过滤器链(Filter Chain),这些过滤器可以对请求进行拦截和修改,比如添加请求头、参数校验等等。然后将请求转发到实际的后端服务。
- 服务处理:后端服务对请求进行处理
- 响应过滤:后端处理完结果后,返回给 Gateway 的过滤器再次做处理
- 响应返回:响应经过过滤后返回给客户端
断言
就是对一个表达式进行if判断,结果为真或假,如果为真则做这件事,否则做那件事。
如果客户端发送的请求满足了断言的条件,则映射到指定的路由器,就能转发到指定的服务上进行处理。
SpringCloud Gateway实现动态路由
通过 Nacos Server 和 Spring Cloud Alibaba Nacos Config 即可实现配置的动态变更
Spring Cloud Gateway 可以从注册中心获取服务的元数据(例如服务名称、路径等),然后根据这些信息自动生成路由规则。
自定义全局异常
实现ErrorWebExceptionHandler
并重写其中的handle
方法。