服务注册
Eureka
Netflix公司产品
Eureka包含两个组件
Eureka Server
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Eureka Client
是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器
应用启动后,会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性
自我保护机制
某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存
Eureka内部集成了Ribbon
Zookeeper
雅虎公司产品
基于观察者模式设计的分布式服务管理框架,负责存储和管理数据,接受观察者的注册,一旦数据发生变化,zookeeper就将负责通知已经在zookeeper上注册的观察者做出反应
由一个Leader和多个Follower组成,集群中只要有半数以上节点存活,zookeeper就能正常工作。
崩溃恢复包括两部分:
Leader选举:一个Leader多个Follower,奇数台机器。每台机器启动时,先投自己一票,若此机器票数没有半数以上,则把投给自己的票转给zxid大的机器;若票数达到总机器数半数以上,则选取自己当Leader;
数据恢复:Leader把数据同步到Follower
Consul
HashiCorp公司产品
分布式、高可用、可横向扩展的用于实现分布式系统服务的服务发现与配置
Nacos
Spring Cloud Alibaba子项目
Nacos = Eureka + Config + Bus
Nacos更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现
Nacos是一种去中心化去中心化的架构,属于CAP理论里的AP架构,支持最终一致性C,在分布式服务发现与注册场景下具有很好的性能
Nacos支持几乎所有的主流类型的服务的发现
服务调用
Ribbon
Netflix公司产品
基于某种规则实现客户端的负载均衡组件,用来做客户端负载均衡
Eureka、OpenFeign、Hystrix都集成了Ribbon
LoadBalancer
Spring Cloud子项目
负载均衡器,使用RestTemplate进行远程访问时加上@LoadBalancer实现负载均衡
服务调用2
Feign
Netflix公司,不再使用...
OpenFeign
Spring Cloud子项目
一种声明式RESTful风格的HTTP客户端,同时支持SpringMVC的注解,可进行远程访问时的服务调用
内部集成了Ribbon
服务降级
Hystrix
Netflix公司产品
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免会调用失败,比如超时、异常,Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
服务降级:
“断路器”本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控(类似熔断保险丝,服务熔断),向调用方返回一个符合预期的、可处理的备选响应(fallback,服务降级),而不是长时间等待或抛出调用方法无法处理的异常,这样保证了服务调用的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩
服务降级的注解为@HystrixCommand
服务熔断
应对服务雪崩效应的一种服务链路保护机制。当扇出链路的某个微服务出错不可用或相应时间太长时,进行服务降级,进熔断该节点微服务的调用,快速返回错误的相应信息
熔断通过Hystrix实现,Hystrix会监控服务间调用情况,当失败的调用到一定的阈值,缺省是5秒内20此调用失败,就会启动熔断机制。
触发熔断机制后,会慢慢自动恢复链路
熔断机制过程:打开 -> 半开 -> 关闭
打开:请求不在进行调用当前服务,内部设置时钟一般为MTTR(平均故障时间),打开时长达到设定时钟就进入半熔断状态
半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务回复正常,关闭熔断
关闭:熔断关闭不会对服务进行熔断
熔断机制的注解为@HystrixCommand
服务限流:高并发情况下,为了防止某一时刻请求过多,设置某一时刻最大访问数
Hystrix内部集成了Ribbon
Resilience4j
国外用的多,国内基本不用
Sentienl
Spring Cloud Alibaba子项目
把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保持服务的稳定性
解决的问题:服务雪崩、服务降级、服务熔断、服务限流
Sentinel与Hystrix的区别:Sentinel断路器在1.7版本没有半开状态,1.8版本后有半开状态
流控规则:
资源名:唯一名称,默认请求路径
针对来源:Sentinel可针对调用者进行限流,填写微服务名,默认dufault(不区分来源)
阈值类型/单机阈值:
QPS(每秒请求量):当调用该API的QPS达到阈值时,进行限流
线程数:当调用该API的线程数达到阈值的时候,进行限流
是否需要集群
流控模式:
直接:API达到限流条件时,直接限流
关联:当关联的资源达到阈值时,限流自己
链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就限流)
流控效果:
快速失败:直接失败,抛异常
Warm up:根据coderFactor(冷加载因子,默认3)的值,从阈值/coderFactor,经过预热时长,才达到设置的QPS阈值
排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效
降级规则:
RT(平均响应时间,秒)
平均响应时间超出阈值且在时间窗口内通过的请求》=5,两个条件同时满足后触发降级
窗口过期后关闭断路器
RT最大4900
异常比例(秒)
QPS>=5,且异常比例(秒)超过阈值,触发降级;时间窗口结束后,关闭降级
异常数(分种)
出现异常的数量(分钟)超过阈值,触发降级;时间窗口结束后,关闭降级
服务网关
Zuul
Netflix公司产品,不再使用
Zuul2
Netflix公司产品,...
Gateway
SpringCloud子项目
基于Spring5.0 + SpringBoot2.0 + Project Reactor技术开发的网关,为微服务架构提供一种简单有效的统一API路由管理方式
Getway作为SpringCloud生态系统中的网关,目标是替代Zuul,在SpringCloud2.0以上版本中,没有对Zuul2.0以上最新高性能版本进行集成,仍然用的是Zuul1.0非Reactor模式的版本。为了提升网关性能,SpringCloud Getway是基于WebFlux框架实现的,而Webflux框架底层使用了高性能的Reactor模式通信框架Netty
Getway的目标提供统一的路由方式且基于Filter链的方式提供了网关的基本功能,如:安全、监控/指标、限流
SpringCloud Getway基于异步非阻塞模型
服务配置
Config
SpringCloud子项目
解决分布式系统的配置管理方案
在分布式环境中,很多服务都是集群部署,则这些集群部署的服务都需要相同的配置文件,此时可使用config组件进行众多的配置文件的统一管理
Nacos
Spring Cloud Alibaba子项目
Nacos = Eureka + Config + Bus
服务总线
Bus
SpringCloud子项目
用来管理和传播分布式系统的消息,像一个分布式执行器,可用于广播状态更改、事件推送,也可以当作微服务间的通信通道
总线:微服务架构中,一般使用轻量级的消息代理构建一个公用的消息主题,并让系统中所有微服务实例连接上来。由于该主题中产生的消息会被所有实例监听和消费,因此称它为消息总线。在总线上的各个实例,都可以方便的广播一些需要让其他连接在该主题上的实例都知道的消息
原理:Config实例都监听MQ中同一个topic。当一个服务刷新数据时,它会把这个信息放入topic,这样其它监听同一topic的服务就能得到通知,然后去更新自己的配置
只支持两种消息代理:RabbitMQ和Kafka
Nacos
Spring Cloud Alibaba子项目
Nacos = Eureka + Config + Bus