Spring Cloud Alibaba
SpringCloud Alibaba是SpringCloud的子项目,很可能成为Spring Cloud第二代的标准实现,与SpringCloud第一代比较SpringCloud Alibaba的优势如下:
spring-cloud-dependencies 2020 默认不在加载bootstrap配置文件,如果项目中要用bootstrap配置文件需要手动添加spring-cloud-starter-bootstrap依赖,原先导入配置的方法改为SpringBoot2.4提供的新spring.config.import功能
注册中心
- Eureka
服务注册:Eureka Client向Eureka Server注册自己的元数据(ip、端口等等)
服务续约:Eureka Client每30秒向Eureka Server发送一次心跳,并拉取Eureka Server中的其它注册列表信息到本地
服务剔除:Eureka Client连续90秒没有向Eureka Server发送心跳,则会从Eureka Server中进行删除
服务下线:Eureka Client关闭时会向Eureka Server发送下线请求,该Client的信息将会从Server中删除
- Nacos
…
服务网关
- Gateway
基于Spring5.x、SpringBoot2.x实现,采用非阻塞方式并且支持长链接
【断言】路由转发的判断条件,决定当前的请求由哪一个路由处理
【路由】网关的基本单元,由ID、URI、一组Predicate、一组Filter组成
【过滤器】路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容
断言工厂:根据配置的断言规则对当前请求进行匹配,成功则跳转到指定路由,失败则返回错误信息
* AfterRoutePredicateFactory 请求时间在配置的时间之后
* BeforeRoutePredicateFactory 请求时间在配置的时间之前
* BetweenRoutePredicateFactory 请求时间在配置的时间之间
* CookieRoutePredicateFactory 请求携带的Cookie满足配置的值
* HeaderRoutePredicateFactory 请求携带的Header满足配置的值
* HostRoutePredicateFactory 请求的Host满足配置的值
* MethodRoutePredicateFactory 请求Method满足配置的值
* PathRoutePredicateFactory 请求路径满足配置的值
* QueryRoutePredicateFactory 请求参数满足配置的值
* RemoteAddrRoutePredicateFactory 请求地址满足配置的值
过滤器:断言成功后跳转到指定的路由,在路由处理之前需要经过“pre”类型的过滤器处理,处理返回响应后需要经过“post”类型的过滤器处理
“pre”类型的过滤器可以实现参数校验、权限校验、流量监控、日志输出、协议转发
“post”类型的过滤器可以做响应内容、响应头的修改、日志输出、流量监控
1、全局过滤器:作用在所有路由上,不需要在yml文件中配置
2、网关过滤器:作用在当前路由上,需要在yml文件中配置,默认内置了19种,还可以自定义网关过滤器工厂
* AddRequestHeader GatewayFilter Factory 添加请求头网关过滤器工厂
* AdaRequestParameter Gateway Filter Factory 添加请求参数网关过滤器工厂
* AddResponsel Header GatewayFilter Factory 添加响应头网关过滤器工厂
* Hystrix GatewayFilter Factory Hystrix熔断的网关过滤器工厂
* PrefixPath GatewayFilter Factory PrefixPath的网关过滤器工厂
* PreserveHostHeader GiatcwayFilter Faclory 保留原请求头的过滤器工厂
* RequestRateLimiter GatewayFilter Factory 请求限流的网关过滤器工厂(常用)
* RedirectTo GatewayFilter Factory 重定向的网关过滤器工厂
* RemoveRequestHcader GatewayFilter Factory 剥除请求头的网关过滤器工厂
* RemoveResponscHeadcr GatewayFilter Factory 删除响应头的网关过滤器工厂
* RewritePath GatewayFilter Factory 重写路径的网关过滤器工厂(常用)
* SaveSession GatewayFilter Factory 保存会话的网关过滤器工厂
* SecureHcaders GatewayFilter Factory 安全头的网关过滤器工厂
* SetPath GatewayFilter Factory 设置路径的网关过滤器工厂
* SetResponscHeader CiatcwayFilter Factory 设置响应的网关过滤器工厂
* SetStatus GatewayFilter Factory 设置状态的网关过滤器工厂
* StripPrefix GatewayFilter Factory StripPrefix的网关过滤器工厂(常用)
* Retry GatewayFilter Factory 重试的网关过滤器工厂
使用场景:
路由转发:将所有服务的API接口统一封装后对外提供访问,避免了外界直接访问服务的真实地址
全局跨域:
统一授权:
日志、流量监控:
接口限流:
熔断器
Hystrix
避免某个服务的阻塞(网络问题、代码问题)导致整个服务链的阻塞:
预处理机制:当该API接口请求处理失败的次数大于设定的阈值时,Hystrix会认为该接口出现故障并打开熔断机制,则此时该API接口的请求会执行fallback回调函数,这样就不会造成请求该API的线程阻塞
自我修复机制:一段时间后会处于半打开状态,将一定数量的请求执行业务逻辑(若执行失败,则打开熔断器,如成功则关闭熔断器),剩余的请求执行fallback回调函数
- Hystrix实现熔断降级
通过线程池隔离的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本
Sentinel
-
通过并发线程数进行限制
通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要预先分配线程池的大小 -
通过响应时间对资源进行降级
通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复
负载均衡
Feign
Feign通过声明式注解(@FeignClient)将Java Http客户端进行封装,简化了Http的请求过程,默认基于HttpURLConnection实现网络请求,也可以自定义HttpClient或OkHttp来实现网络请求实现服务的高可用
Ribbon通过LoadBalanceClient 从服务注册中心加载服务列表到本地缓存,根据本地注册列表信息选择不同的服务实例实现负载均衡,默认基于RestTemplate实现网络的请求