一、spring cloud组件

一、服务注册中心
  1. Eureka(停更)
  2. Zookeeper
  3. Consul
  4. Nacos(重点)
二、服务调用(负载均衡)
  1. Ribbon
  2. LoadBalancer
三、服务调用2
  1. Feign(停更)
  2. OpenFeign(重点)
四、服务降级
  1. Hystrix(停更)
  2. resilience4j(国外)
  3. sentinl(国内)
五、服务网关
  1. Zuul(停更)
  2. gateway(重点)
六、服务配置
  1. Config(停更)
  2. Nacos
七、服务总线
  1. Bus(停更)
  2. Nacos

二、微服务模块

  1. 建module
  2. 改pom
  3. 写YML
  4. 主启动
  5. 业务类

三、各个组件详解

  1. Euraka

  2. 服务治理:管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

  3. 服务注册与发现
    Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
    在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)
    服务注册:将服务信息注册进注册中心
    服务发现:从注册中心上获取服务信息

  4. Eureka包含两个组件:Eureka Server和Eureka Client

    1. Eureka Server提供服务注册服务:各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到
    2. EurekaClient通过注册中心进行访问:它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
  5. Eureka集群原理

    1. 先启动eureka注主册中心
    2. 支付服务启动后会把自身信息(比如服务地址以别名方式注册进eureka)
    3. 消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址
    4. 消去者导调用地址后,底屋实际是利用HttpClient技术实现远程调用
    5. 消费者实癸导服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新—次服务调用地址
  6. Eureka自我保护理论知识

    1. 自我保护模式:默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式
      在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例
    2. 概述:保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务
  7. Eureka工作流程
    1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息
    2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务
    3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常
    4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例
    5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端
    6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式
    7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地
    8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存
    9、Eureka Client 获取到目标服务器信息,发起服务调用
    10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

  8. Zookeeper

  9. zookeeper是一个分布式协调工具,可以实现注册中心功能;zookeeper服务器取代Eureka服务器,zk作为服务注册中心

     <!-- SpringBoot整合zookeeper客户端 -->
      <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
           <!--先排除自带的zookeeper3.5.3 防止与3.4.9起冲突-->
           <exclusions>
               <exclusion>
                   <groupId>org.apache.zookeeper</groupId>
                   <artifactId>zookeeper</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
       <!--添加zookeeper3.4.9版本-->
       <dependency>
           <groupId>org.apache.zookeeper</groupId>
           <artifactId>zookeeper</artifactId>
           <version>3.4.9</version>
       </dependency>
    
  10. ZooKeeper的服务节点是临时节点,没有Eureka那含情脉脉

  11. 具体流程

    1. 在服务器安装zookeeper,关闭Linux服务器防火墙后,启动zookeeper服务器
    2. 将服务注册进zookeeper
    3. 验证测试
  12. Consul

  13. Consul是一套开源的分布式服务发现和配置管理系统,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。

  14. 它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查,同时支持HTTP和DNS协议支持跨数据中心的WAN集群提供图形界面跨平台,支持Linux、Mac、Windows

  15. 运行consul:
    打开有consul.exe文件夹,打开cmd,进入命令窗口=>查看版本consul -v,开发模式启动consul agent -dev=>浏览器输入 - http://localhost:8500/ - 打开Consul控制页

组件名 语言CAP 服务健康检查 对外暴露接口 Spring Cloud集成
Eureka Java AP 可配支持 HTTP
Consul Go CP 支持 HTTP/DNS
Zookeeper Java CP 支持客户端 已集成

CAP:

  • C:Consistency (强一致性)
  • A:Availability (可用性)
  • P:Partition tolerance (分区容错性)
  1. Ribbon

  2. Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用

  3. 负载均衡就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用),常见的负载均衡有软件Nginx,LVS,硬件F5等

  4. Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
    -Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
    -Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术

  5. Ribbon在工作时分成两步:

    • 第一步先选择EurekaServer ,它优先选择在同一个区域内负载较少的server。
    • 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
  6. Ribbon默认自带的负载规则

    lRule:根据特定算法中从服务列表中选取一个要访问的服务

    • RoundRobinRule 轮询
    • RandomRule 随机
    • RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重传
    • WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
    • BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    • AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
    • ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
  7. OpenFeign

  8. Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解

  9. Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

  10. OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@Feignclient可以解析SpringMVc的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

  11. 服务调用:接口+注解:微服务调用接口 + @FeignClient
    @Component
    @FeignClient(value = “CLOUD-PAYMENT-SERVICE”)
    public interface PaymentFeignService
    {
    @GetMapping(value = “/payment/get/{id}”)
    public CommonResult getPaymentById(@PathVariable(“id”) Long id);

    }
    
  12. Hystrix

  13. 分布式系统面临的问题:复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败

  14. 服务雪崩:当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩

  15. Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性

  16. 服务降级 :服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
    什么情况会降级?

    • 程序运行导常
    • 超时
    • 服务熔断触发服务降级
    • 线程池/信号量打满也会导致服务降级
  17. 服务熔断 :类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。
    服务的降级 -> 进而熔断 -> 恢复调用链路

  18. 服务限流 :秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

  • 服务降级fallback

    1. 业务类启用 - @HystrixCommand报异常后如何处理,—旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法

    @Service
    public class PaymentService{

      @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler"/*指定善后方法名*/,commandProperties = {
              @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000")
      })
      public String paymentInfo_TimeOut(Integer id)
      {
          //int age = 10/0;
          try { TimeUnit.MILLISECONDS.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
          return "线程池:  "+Thread.currentThread().getName()+" id:  "+id+"\t"+"O(∩_∩)O哈哈~"+"  耗时(秒): ";
      }
    
      //用来善后的方法
      public String paymentInfo_TimeOutHandler(Integer id)
      {
          return "线程池:  "+Thread.currentThread().getName()+"  8001系统繁忙或者运行报错,请稍后再试,id:  "+id+"\t"+"o(╥﹏╥)o";
      }
    

    }

  1. 服务端:主启动类添加新注解@EnableCircuitBreaker

  2. 客户端:主启动类添加新注解@EnableHystrix

    #开启hystrix服务
    feign:
      hystrix:
        enabled: true
    
  • 服务降级DefaultProperties

    1. 1:1每个方法配置一个服务降级方法,技术上可以,但是不聪明
      1:N除了个别重要核心业务有专属,其它普通的可以通过@DefaultProperties(defaultFallback = “”)统一跳转到统一处理结果页面
      通用的和独享的各自分开,避免了代码膨胀,合理减少了代码量
  • 服务降级FeignFallback

    1. 服务降级,客户端去调用服务端,碰上服务端宕机或关闭

    @Component
    @FeignClient(value = “CLOUD-PROVIDER-HYSTRIX-PAYMENT” ,//
    fallback = PaymentFallbackService.class)//指定PaymentFallbackService类
    public interface PaymentHystrixService
    {
    @GetMapping(“/payment/hystrix/ok/{id}”)
    public String paymentInfo_OK(@PathVariable(“id”) Integer id);

      @GetMapping("/payment/hystrix/timeout/{id}")
      public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
    

    }

  • 熔断机制概述 :熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路

    //=====服务熔断
    @HystrixCommand(fallbackMethod = “paymentCircuitBreaker_fallback”,commandProperties = {
    @HystrixProperty(name = “circuitBreaker.enabled”,value = “true”),// 是否开启断路器
    @HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”,value = “10”),// 请求次数
    @HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”,value = “10000”), // 时间窗口期
    @HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”,value = “60”),// 失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable(“id”) Integer id) {

    }

涉及到断路器的三个重要参数:

  • 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
  • 请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次7,即使所有的请求都超时或其他原因失败,断路器都不会打开。
  • 错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开

断路器开启或者关闭的条件

到达以下阀值,断路器将会开启:

  • 当满足一定的阀值的时候(默认10秒内超过20个请求次数)
  • 当失败率达到一定的时候(默认10秒内超过50%的请求失败)
  • 当开启的时候,所有请求都不会进行转发
  • 一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。

断路器打开之后

1:再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

2:原来的主逻辑要如何恢复呢?

对于这一问题,hystrix也为我们实现了自动恢复功能。

当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时

  1. GateWay

  2. Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等

  3. 特性

    1. 基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
    2. 动态路由:能够匹配任何请求属性;
    3. 可以对路由指定Predicate (断言)和Filter(过滤器);
    4. 集成Hystrix的断路器功能;
    5. 集成Spring Cloud 服务发现功能;
    6. 易于编写的Predicate (断言)和Filter (过滤器);
    7. 请求限流功能;
    8. 支持路径重写。
  4. 三大核心

    1. Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
    2. Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
    3. Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
      predicate就是我们的匹配条件;而fliter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了
  5. 核心逻辑:路由转发 + 执行过滤器链

    1. Linux下进入MySQL命令行:
      mysql -uroot -p123456
  6. sentinel

  7. sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性

  8. 流控规则

    资源名:唯一名称,默认请求路径。
    针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
    阈值类型/单机阈值:
    QPS(每秒钟的请求数量)︰当调用该API的QPS达到阈值的时候,进行限流。
    线程数:当调用该API的线程数达到阈值的时候,进行限流。
    是否集群:不需要集群。
    流控模式:
    直接:API达到限流条件时,直接限流。
    关联:当关联的资源达到阈值时,就限流自己。
    链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
    流控效果:
    快速失败:直接失败,抛异常。
    Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈 值/codeFactor,经过预热时长,才达到设置的QPS阈值。
    排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

  9. 降级
    1.
    2. 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一

  10. sentinel热点key
    1.
    2. 希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制,热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效
    3. @GetMapping(“/testHotKey”)
    @SentinelResource(value = “testHotKey”,blockHandler/兜底方法/ = “deal_testHotKey”)
    public String testHotKey(@RequestParam(value = “p1”,required = false) String p1,
    @RequestParam(value = “p2”,required = false) String p2) {
    //int age = 10/0;
    return “------testHotKey”;
    }

           /*兜底方法*/
           public String deal_testHotKey (String p1, String p2, BlockException exception) {
               return "------deal_testHotKey,o(╥﹏╥)o";  //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
           }
    
    1. @SentinelResource - 处理的是sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理
  11. sentinel服务熔断

    1. 配置fallback:负责业务异常,有兜底方法进行处理
      @SentinelResource(value = “fallback”, fallback = “handlerFallback”)
    2. 配置blockHandler:负责sentinel控制台配置违规,有兜底方法进行处理
      @SentinelResource(value = “fallback”,blockHandler = “blockHandler”)
  12. OpenFeign

    1. Feign组件一般在消费侧
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐