SpringCloud-微服务组件

服务注册

Eureka

  • Netflix公司产品

  • Eureka包含两个组件

    1. Eureka Server

      • Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

    2. 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


版权声明:本文为m0_57254201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。