Spring Cloud
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用 Spring Boot 的开发风格做到一键启动和部署。
Spring Cloud Consul
有了Spring Cloud Consul,我们可以轻松的将基于Spring Boot的微服务应用注册到 Consul上。
Consul是什么
Consul是一个服务网格解决方案,提供了一个具有服务发现、配置和细分功能的全功能控制平面。
Spring Cloud Netflix
它主要提供的模块包括:服务发现 Eureka,断路器 Hystrix,网关 Zuul,客户端负载均衡 Ribbon 等
Spring Cloud Eureka
服务注册与发现模块,包含:
- 注册中心服务
- 服务提供者
- 服务消费者
注册之后,服务消费者可以使用注册在服务中心的服务名当作域名直接访问,不用记录对方IP。
restTemplate.getForObject("http://eureka-client-user-service/user/hello", String.class);
Spring Cloud Ribbon
负载均衡模块
目前主流的负载方案分为以下两种:
- 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。
- 客户端自己做负载均衡,根据自己的请求情况做负载,Ribbon 就属于客户端自己做负载。
在RestTemplate的Bean方法上加上@LoadBalanced注解就可以实现,也可以重写LoadBalanced接口实现新的负载方法。默认的负载均衡策略是轮询策略。
Spring Cloud Netflix Ribbon负载均衡策略介绍
- BestAvailabl
选择一个最小的并发请求的 Server,逐个考察 Server,如果 Server 被标记为错误,则跳过,然后再选择 ActiveRequestCount 中最小的 Server。 - AvailabilityFilteringRule
过滤掉那些一直连接失败的且被标记为 circuit tripped 的后端 Server,并过滤掉那些高并发的后端 Server 或者使用一个 AvailabilityPredicate 来包含过滤 Server 的逻辑。其实就是检查 Status 里记录的各个 Server 的运行状态。 - ZoneAvoidanceRule
使用 ZoneAvoidancePredicate 和 AvailabilityPredicate 来判断是否选择某个 Server,前一个判断判定一个 Zone 的运行性能是否可用,剔除不可用的 Zone(的所有 Server),AvailabilityPredicate 用于过滤掉连接数过多的 Server。 - RandomRule
随机选择一个 Server。 - RoundRobinRule
轮询选择,轮询 index,选择 index 对应位置的 Server。 - RetryRule
对选定的负载均衡策略机上重试机制,也就是说当选定了某个策略进行请求负载时在一个配置时间段内若选择 Server 不成功,则一直尝试使用 subRule 的方式选择一个可用的 Server。 - ResponseTimeWeightedRule
作用同 WeightedResponseTimeRule,ResponseTime-Weighted Rule 后来改名为 WeightedResponseTimeRule。 - WeightedResponseTimeRule
根据响应时间分配一个 Weight(权重),响应时间越长,Weight 越小,被选中的可能性越低。
@Bean
public IRule irule() {
// 实现随机的负载均衡策略
return new RandomRule();
}
Spring Cloud Hystrix
降级
服务压力突然增加,为保证核心功能,选择性的降低或关闭一些辅助功能。例如关闭注册功能保证核心业务功能。
熔断
服务A依赖服务B,服务B性能突然降低,导致服务A的性能也降低。关闭调用服务B的功能,直接返回Error信息,保证了服务A其他功能正常使用。
限流
每秒只接受一定数量的请求,其余的请求直接拒绝掉。
Spring Cloud Zuul
Zuul 的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:
- 动态路由
- 请求监控
- 认证鉴权
- 灰度发布