Spring Cloud是一个基于Spring Boot实现的云原生应用开发工具,它为基于JVM的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

场景介绍:当我们在网上购物时,下订单后,后台需要调用支付服务支付,然后调用库存服务减库存,然后调用积分服务给用户加积分,最后返回订单完成。一个操作需要后台很多服务共同完成。




spring 接口熔断如何配置_spring 接口熔断如何配置


接下来针对这个业务场景,来一一讲解一下springcloud是如何优雅的解决这个问题的。

  • 核心组件

Eureka:

注册中心,所有的服务都会在这里注册,注册中心统一维护一个服务列表,当需要调用别的服务时,注册中心返回给你可用服务。


spring 接口熔断如何配置_spring_02


Eureka Client:负责将这个服务的信息注册到Eureka Server中,包括服务的ip和端口号

Eureka Server :负责维护所有的服务列表。

Ribbon:

它的作用就是用来负载均衡,当用户很多时,我们的单个服务已经承受不住时就需要部署多个服务来缓解压力,Ribbon就是负责负载均衡的。由于Feign集成了Ribbon,在这里就不单独讲了,后面会讲到。

Feign:

这个组件就是用来解决服务间调用的,想象一下,我们服务A调用服务B时,是不是需要先建立网络连接,再构造请求,发送请求,最后接收返回结果等这一系列操作,难道每次调用都要这么干嘛,多麻烦。Feign就是把这一系列的过程封装起来然后我们用的时候只需要一个注解就搞定了整个操作。

Feign采用的是动态代理的机制,先对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理;调用时也是调用这个动态代理,Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务的地址,最后针对这个地址,发起请求、解析响应。


spring 接口熔断如何配置_spring 接口熔断如何配置_03


通过@FeignClien、@RequestMapping、@RequestParam就可以构造出请求的地址和参数,然后发送请求。

Feign通过服务名称从注册中心Eureka中获取服务列表,如果该服务部署了多个,由于Feign已经集成了Ribbon的负载均衡,默认会采用轮询机制依次访问服务列表中的服务。

Hystrix:

Hystrix的作用就是在服务调用时,一个服务异常时不会导致调用方一直阻塞。我们想象一下,当服务A调用服务B时,服务B异常了,这时有很多这样的调用过来,然后全都阻塞,这会导致服务A也会阻塞,最终会导致系统雪崩。Hystrix就是在服务调用异常时,我们自行处理这个异常,比如将此次异常记录下来,让整个调用过程不至于阻塞住,然后再空闲时处理这些异常。

来一张网上的图解释一下这个熔断机制


spring 接口熔断如何配置_springcloud集成熔断_04


Zuul

当前端调用后端服务时,需要知道后端服务的服务名,当服务很多时,总不能让前端都记住吧,所以就需要一个网关来转发这些请求,前台调用时只需要知道一个统一的地址就行了。zuul组件就是做了这么一件事。


spring 接口熔断如何配置_springcloud集成熔断_05


接下来针对上述的场景创建一个springcloud的工程来看看这些组件都是如何用的。

0.创建父工程springcloud-master


spring 接口熔断如何配置_springcloud 熔断不生效_06


直接创建不需要引任何的依赖。

1、创建注册中心springcloud-eureka

右键父工程创建子模块


spring 接口熔断如何配置_springcloud五大组件?注解_07


需要引入这个依赖


spring 接口熔断如何配置_springcloud五大组件?注解_08


加上注解以及配置


spring 接口熔断如何配置_spring_09


server:
  port: 8520 # 端口
spring:
  application:
    name: eureka-server # 应用名称,会在Eureka中显示
eureka:
  client:
    register-with-eureka: false # 是否注册自己的信息到EurekaServer,默认是true
    fetch-registry: false # 是否拉取服务列表,默认是true
    service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
      defaultZone: http://127.0.0.1:${server.port}/eureka
  server:
    #清理无效节点的时间间隔,默认60000毫秒
    eviction-interval-timer-in-ms: 10000


注册中心创建完成

2.依次创建订单服务模块、支付服务模块、库存服务模块、积分服务模块。这些都类似,这里以订单服务模块为例。

添加一下依赖


spring 接口熔断如何配置_springcloud集成熔断_10


加上注解和配置


spring 接口熔断如何配置_spring 接口熔断如何配置_11


eureka:
  client:
    serviceUrl:
      #向注册中心注册服务
      defaultZone: http://127.0.0.1:8520/eureka/
server:
  port: 8521
spring:
  application:
    #服务名
    name: springcloud-order
  boot:
    admin:
      client:
        #向springboot admin注册该服务,springboot admin是一个监控springboot工程的一个工具
        url: http://localhost:8526
#开启熔断机制
feign:
  hystrix:
    enabled: true
#springboot admin展示信息配置
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: ALWAYS


3.创建springboot admin,用来监控我们每个服务的状态

引入依赖


spring 接口熔断如何配置_spring 接口熔断如何配置_12


加上注解和配置


spring 接口熔断如何配置_spring 接口熔断如何配置_13


spring:
  application:
    name: admin-server
server:
  port: 8526


最终创建的目录结构如下:


spring 接口熔断如何配置_spring 接口熔断如何配置_14


先启动注册中心和监控服务,然后再启动其他服务。

访问 http://localhost:8520/ ,下面就是服务列表


spring 接口熔断如何配置_springcloud五大组件?注解_15


再看看负载均衡的轮询机制,我们有两个库存服务,分别访问下订单接口,返回如下:


spring 接口熔断如何配置_springcloud五大组件?注解_16


spring 接口熔断如何配置_springcloud集成熔断_17


关闭掉积分服务,看看熔断机制:


spring 接口熔断如何配置_springcloud五大组件?注解_18



整个过程是我作为一个初学者的理解,可能会有一些不合理的地方,希望大家能指出来,本菜鸟虚心求教。