springcloud
五大组件
springclound的5大组件包括,
- 服务中心
用户实现服务治理,常用的是eureka和Nacos,服务架构中的三个核心角色包括服务注册中心、服务提供者和服务消费者。
Nacos是阿里巴巴集团的开源平台,专门为动态服务发现、配置和服务管理设计。 - 负载均衡
用于提供客户侧的软件负载均衡算法,常见的有Netfix的Ribbion组件。 - 熔断降级
hystrix用于防止因服务调用失败导致的连锁反应,如大量请求涌入导致服务瘫痪。断路器模式允许应用程序检测故障是否已解决,并在问题解决后尝试再次调用操作,以保证服务的高可用性。 - 网关
通常指的是Zuul和gateway - 分布式配置管理
支持分布式系统中外部化配置的管理,当配置文件发生变化时,会自动刷新配置。这可以通过Spring Cloud Config实现
Netflix Eurek(服务发现)
相当于zk,提供服务注册与发现功能。
eureka客户端每隔30秒发送一次心跳来续约,通过续约来告知eurkea该eurkea客户端仍然存在,没有出现问题;正常情况下,如果eureka server在90秒内没有收到客户端的续约,他会将实例从其注册表中删除。
Netflix Ribbon(客户端负载均衡)
概念
- ribbon是一个实现了客户端侧负载均衡的组件,Netflix开源的,主要功能提供客户端侧负载均衡。
- 服务调用过程中的负载均衡一般使用springclound的ribbon组件实现,feign的底层已经自动集成了ribbon,使用起来非常简单。
- ribbon默认的负载均衡策略有七种:
- RoundRobinRule
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 - 权重策略(WeightedResponseTimeRule)
根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大 - 随机策略(RandomRule)
从服务提供者的列表中随机选择一个服务实例 - 最小连接数策略BestAvailableRule
最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。 - 重试策略:RetryRule
重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。此策略的配置设置如下: - 可用性敏感策略(AvailabilityFilteringRule)
先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例 - 区域敏感策略(ZoneAvoidanceRule)
区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。
Netflix Hystrix(熔断器)
Netflix Zuul(gateway效率更高)
定义
zuul是spring clound中的微服务网关,是spring cloud 组件之一,用于提供动态路由、请求过滤和负载均衡等功能。
作用
- 路由(Routing)
zuul可以根据路由规则将请求转发到不同的后端服务,通过配置路由规则,并将请求发送到相应的服务实例上。 - 过滤 filtering
过滤器可以对请求进行预处理或者后处理,从而实现请求的定制化处理和保护。
通过定义过滤器,可以在请求的不同阶段进行操作,比如身份验证、请求日志记录、性能监控等。 - 负载均衡(Load Balancing)
zuul可以与负载均衡组件ribbon集成,实现请求的负载均衡。
通过配置负载均衡规则,zuul可以将请求平均的分发到后端的多个服务实例上,提高系统的可用性和性能。 - 容错和故障转移(Fault Tolerance)
zuul集成了Hystrix来提供容错和故障转移的能力,当后端服务发生故障和超时时,zuul能够使用断路器模式和熔断来保护整个系统不受影响。
总之,zuul作为服务网关提供了动态路由、请求过
滤、负载均衡、容错和故障转移功能。
Gateway
gateway限流
- 计数器算法:以QPS为100举例,如果1秒钟内钱200ms请求数量到达了100,后面800ms中的请求都会被拒绝,这种情况称为”突刺现象“
- 漏桶算法:可以解决突刺现象。比如创建一个很大的队列来接收请求,一个较小的线程池来处理请求。但是也有极限情况,当队列满了时, 请求也会拒绝掉。
- 令牌桶算法:可以说是漏桶算法的改进。在桶中放令牌,请求获取令牌后才能继续执行。如果桶中无令牌,请求可以选择进行等待或直接拒绝。
gateway网关负载均衡策略
uri的配置为协议为lb,表示启用gateway的负债均衡功能。如lb://seviceName为spricloud gateway在微服务中自动为我们创建的负债均衡的uri。
- 轮询策略 (Round Robin)
最简单的负载策略,将请求一次分配给各个服务器,能实现请求的平均分配。
此策略使用与服务器性能比较均衡的场景,假如服务器性能有的好有的差,可能导致某些服务器负担过重。 - 加权轮询策略 (Weighted Round Robin)
在轮询策略的基础上加了权重的概念,每个服务器都有一个权重值,权重值越高的服务器会被分配更多的请求,动态地调整权重值。 - 最少连接数(Least Connections)
根据服务器当前的连接数来决定请求的分派。动态选择当前连接数最少的服务器来处理请求,以确保服务器的负载相对均衡。 - IP哈希策略
根据请求的源IP地址进行散列运算,将相同源IP地址的请求分发给同一台服务器,从而确保来自同一客户端的请求能被发送到同一台服务器上,提高请求处理效率。
手工指定策略
gateway逐渐取代zuul的原因
- gateway是基于非阻塞和响应式编程的webflux框架构建,相比zuul,使用少量的线程处理大量的并发请求,性能更好。
- gateway提供了更灵活的路由配置方式,更多的过滤器选项以及更强大的自定义能力
- gateway使用基于springboot的注解配置,可以充分利用spring框架的便利性和灵活性。
Spring Cloud Config
spring feign
feign如何实现负载均衡
通过配置
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public RoundRobinRule myRule() {
return new RoundRobinRule();//轮询策略
// return new RandomRule();//随机策略
// return new AvailabilityFilteringRule();//首先会过滤掉故障机或者并发链,接数超过阈值的服务器.剩余的机器轮询配置
// new WeightedResponseTimeRule();//服务器影响时间越快,则权重越高
// new BestAvailableRule();//最大可用策略,即先过滤出故障服务器后,选择一个当前并发请求数最小的
}
}