Spring Cloud 主要提供了如下核心的功能:
- Distributed/versioned configuration 分布式/版本化的配置管理
- Service registration and discovery 服务注册与服务发现
- Routing 路由
- Service-to-service calls 端到端的调用
- Load balancing 负载均衡
- Circuit Breakers 断路器
- Global locks 全局锁
- Leadership election and cluster state 选举与集群状态管理
- Distributed messaging 分布式消息
脑图如下:
由于 Spring Cloud Netflix 要进入维护模式,下面是一些可以替代组件
Netflix | 阿里 | 其它 | |
---|---|---|---|
注册中心 | Eureka | Nacos | Zookeeper、Consul、Etcd |
熔断器 | Hystrix | Sentinel | Resilience4j |
网关 | Zuul | 暂无 | Spring Cloud Gateway |
负载均衡 | Ribbon | Dubbo | spring-cloud-loadbalancer |
- Spring Boot 专注于快速方便的开发单个个体微服务。
- Spring Cloud 是关注全局的微服务协调整理治理框架以及一整套的落地解决方案,它将 Spring Boot 开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理,服务发现,断路器,路由,微代理,事件总线等的集成服务。
- Spring Boot 可以离开 Spring Cloud 独立使用,但是 Spring Cloud 离不开 Spring Boot ,属于依赖的关系。
总结:
- Spring Boot ,专注于快速,方便的开发单个微服务个体。
- Spring Cloud ,关注全局的服务治理框架。
在 Spring Cloud 中,能够使用的注册中心,还是比较多的,如下:
spring-cloud-netflix-eureka-server
和spring-cloud-netflix-eureka-client
,基于 Eureka 实现。spring-cloud-alibaba-nacos-discovery
,基于 Nacos 实现。spring-cloud-zookeeper-discovery
,基于 Zookeeper 实现。- … 等等
以上的实现,都是基于 spring-cloud-commons
的 discovery
的 DiscoveryClient 接口,实现统一的客户端的注册发现。
- 服务启动时会生成服务的基本信息对象InstanceInfo,然后再启动时注册到服务治理中心
- 服务注册完成后,会从服务治理中心拉取所有的服务信息,缓存在本地
- 之后服务会根据配置的指定间隔时间发送一个心跳信息,续约服务
- 如果服务治理中心在90s内没有收到一个服务的续约,就会认为服务已经挂了,会把服务注册信息删除
- 服务停止前,会主动发送一个停止请求,服务治理中心会删除这个服务的信息
- 如果Eureka收到的心跳包不足正常值的85%(可配置)就会进入自我保护模式,这种模式,Eureka不会删除任何服务信息
此处,也很容易引申出一个问题,为什么 Eureka 被设计成 AP 的系统,答案可以看看 《为什么不应该使用 ZooKeeper 做服务发现》 。
[《Spring Cloud] Eureka 的自我保护模式及相关问题》
在 Spring Cloud 中,能够使用的负载均衡,如下:
spring-cloud-netflix-ribbon
,基于 Ribbon 实现。spring-cloud-loadbalancer
,提供简单的负载均衡功能。
以上的实现,都是基于 spring-cloud-commons
的 loadbalancer
的 ServiceInstanceChooser 接口,实现统一的服务的选择。并且,负载均衡组件在选择需要调用的服务之后,还提供调用该服务的功能,具体方法见 LoadBalancerClient 接口的 #execute(...)
方法。
简单来说,随着业务的发展,单台服务无法支撑访问的需要,于是搭建多个服务形成集群。那么随之要解决的是,每次请求,调用哪个服务,也就是需要进行负载均衡。
目前负载均衡有两种模式:
- 客户端模式
- 服务端模式
在 Spring Cloud 中,我们使用前者,即客户端模式。
详细的内容,可以看看 《客户端负载均衡与服务端负载均衡》 。
在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
Feign的一个关键机制就是使用了动态代理。咱们一起来看看下面的图,结合图来分析:
- 首先,如果你对某个接口定义了
@FeignClient
注解,Feign 就会针对这个接口创建一个动态代理。 - 接着你要是调用那个接口,本质就是会调用 Feign 创建的动态代理,这是核心中的核心。
- Feign的动态代理会根据你在接口上的
@RequestMapping
等注解,来动态构造出你要请求的服务的地址。 - 最后针对这个地址,发起请求、解析响应。
Ribbon 和 Feign 都是使用于调用用其余服务的,不过方式不同。
- 启动类用的注解不同。
- Ribbon 使用的是
@RibbonClient
。 - Feign 使用的是
@EnableFeignClients
。
- Ribbon 使用的是
- 服务的指定位置不同。
- Ribbon 是在
@RibbonClient
注解上设置。 - Feign 则是在定义声明方法的接口中用
@FeignClient
注解上设置。
- Ribbon 是在
- 调使用方式不同。
- Ribbon 需要自己构建 Http 请求,模拟 Http 请求而后用 RestTemplate 发送给其余服务,步骤相当繁琐。
- Feign 采使用接口的方式,将需要调使用的其余服务的方法定义成声明方法就可,不需要自己构建 Http 请求。不过要注意的是声明方法的注解、方法签名要和提供服务的方法完全一致。
使用网关服务,我们实现统一的功能:
- 动态路由
- 灰度发布
- 健康检查
- 限流
- 熔断
- 认证: 如数支持 HMAC, JWT, Basic, OAuth 2.0 等常用协议
- 鉴权: 权限控制,IP 黑白名单,同样是 OpenResty 的特性
- 可用性
- 高性能
熔断是下层服务一旦产生故障就断掉;降级需要对服务进行分级,把产生故障的服务丢掉,换一个轻量级的方案。
分类:
1、 GatewayFilter,网关过滤器,只应用在单个路由或者一个分组的路由上
- AddRequestHeader:用于在请求头中添加自定义键值对
- AddRequestParameter:用于在请求中添加请求参数的键值对
- AddResponseHeader:用于在响应头中添加键值对
- Hystrix网关过滤工厂:用于将断路器引入网关路由中
- PrefixPath:用于使用简单的Prefix参数
- PreserveHostHeader:用于设置路由过滤器的请求属性,检查是否发送原始主机头或由HTTP客户端确定主机头
- RequestRateLimiter:用于确定当前请求是否允许继续,如果不允许,返回提示“HTTP 429 - Too Many Requests”
- RedirectTo:用于接收请求的状态和URL参数,该状态是一个重定向的300系列的HTTP代码,如301,URL是Location的头部值
- RemoveNonProxyHeaders:用于从转发的请求中删除请求头
- RemoveRequestHeader:用于删除请求头,需要请求头名
- RemoveResponseHeader:用于响应头,需要响应头名
- RewritePath:用于使用Java正则表达式重写请求路径
- SaveSession:用于在转发下游调用之前强制执行保存Session操作
- SecureHeaders:用于为响应添加安全头
- SetPath:允许通过路径的模版段来操作请求的路径,使用了Spring框架的URI模版,支持多种匹配
- SetResponseHeader:用于设置响应头,需要有一个Key-Value对
- SetStatus:用于设置请求响应状态,需要一个Status参数,该参数的值必须是有效的SpringHttpStatus,
- StripPrefix:用于剥离前缀,需要parts参数,表明在请求被发送到下游之前从请求路径中剥离的元素数量
- Retry:用于重试
- RequestSize:用于限制请求的大小,当请求超过限制时启用,限制请求到达下游服务,该过滤器将RequestSize作为参数
2、 GlobalFilter,全局过滤器,应用在所有的路由上
- Forward Routing Filter
- LoadBalancerClientFilter
- Netty Routing Filter
- Netty Write Response Filter
- RouteToRequestUrl Filter
- Websocket Routing Filter
- GateWay Metrics Filter 网关指标过滤器
- Combined Global Filter and GateWayFilter 组合式全局过滤器和网关过滤器排序
- Marking An Exchange As Routed 路由交换
详细见:Spring Cloud Gateway 参考指南_cloud: gateway: metrics: enabled: true-CSDN博客