springcloud(hystrix,config,zuul)

本文详细介绍了如何在微服务架构中实现服务容错和流量控制,包括使用Hystrix进行服务熔断、超时配置和服务降级,Sentinel的流量防卫兵原理以及配置,以及Config服务配置和客户端连接。此外,还探讨了Zuul的路由、监控和负载均衡功能及其配置。通过这些技术,可以有效防止雪崩效应,提高系统的稳定性和健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hystrix

  • 服务熔断:释放资源,减轻服务器压力。当某一个环节的微服务调用失败后,它将会导致上一层服务失败,服务访问越大则失败率越高,而这一连串的失败就是雪崩效益,下层失败导致上层所有服务崩溃。
    在这里插入图片描述

  • 官方架构图示意: 当API调用远程服务,而远程服务报错时,Hystrix将执行fallback方法来返回给api调用。

加入pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
创建Hystrix服务
  • 启动类加入Hystrix注解:在order服务中直接加入@EnableCircuitBreaker 来启用Hystrix。
// 也可以直接使用@SpringCloudApplication 注解
// 来代替@SpringBootApplication、@EnableDiscoveryClient和@EnableCircuitBreaker注解

//@SpringBootApplication
//@EnableEurekaClient
//@EnableCircuitBreaker
@EnableFeignClients
@SpringCloudApplication
修改服务调用方

在这里插入图片描述

  • 使用@HystrixCommand注解标记在需要熔断的方法上,使用fallbackMethod声明当接口熔断时需要调用的方法。该方法可以返回一个默认提示文案或者默认对象,且该方法的入参参数列表必须与接口方法的参数列表保持一致。
修改服务提供方

在这里插入图片描述

  • 修改User服务的UserController,在对外开放的接口中加入抛出错误和模拟超时的线程睡眠。
  • 抛出错误是为了测试服务调用方的服务降级。
  • 线程睡眠是为了测试服务调用时的请求超时。
HystrixCommand的配置扩展

在这里插入图片描述

  • 超时配置:连接超时时间,单位毫秒,默认为1秒。

在这里插入图片描述

  • 熔断机制设置:
    • circuitBreaker.requestVolumeThreshold:默认值20,表示10秒内20个请求为一个轮回。
    • circuitBreaker.errorThresholdPercentage:默认值是50,表示50%的错误率。
    • circuitBreaker.sleepWindowInMilliseconds:默认值是5000,表示熔断后,拒绝所有请求5秒。

注意,Hystrix在熔断期间会对服务进行一次请求测试,如果服务能够正常访问,则会重新关闭熔断。

使用类全局配置

在这里插入图片描述

  • 使用@DefaultProperties即可完成全局声明。

注意:@DefaultProperties 和 @HystrixCommand可以共存,后者的优先级大于前者。

Openfeign集成Hystrix

Openfeign组件中默认是由集成Hystrix的,只需要在配置文件中开启即可使用Hystrix的功能。使用集成功能不需要像手动创建Hystrix服务那样繁琐,使用@DefaultProperties 和 @HystrixCommand注解,而是直接在@FeignClient上标记Hystrix的fallback,在yml中对Hystrix进行配置即可。

开启OpenFeign的Hystrix
feign:
  #开启feign的hystrix
  hystrix:
    enabled: true
配置FeignClient
  • 创建fallback类
    在这里插入图片描述

  • 修改FeignClient
    在这里插入图片描述

    • 在服务调用端(Order)中修改FeignClient,加入fallback属性,并赋值定义好的fallback类。

在开发大型的项目,我们会提供一个公共的数据model来进行数据装载这样会更加利于后续的判断。所有的Controller都必须基于该model进行数据返回。

服务超时配置
  • 在@HystrixCommand中可以进行超时时间配置,在OpenFeign集成Hystrix环境中可以通过yml对超时做额外的配置。
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 4000
FeignClient的fallbackFactory
  • 创建fallbackFactory类
    在这里插入图片描述

  • 修改FeignClient
    在这里插入图片描述

  • fallbackFactory类需要实现FallbackFactory接口和当前实现的具体类型,fallbackFactory的作用与fallback类似,只是前者会获取client端的报错信息。

sentinel流量防卫兵

  • 下载sentinel jar包,并运行,占用8080端口;
  • 客户端引入依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel</artifactId>
    <version>0.2.1.RELEASE</version>
</dependency>
  • yml文件配置
spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: 192.168.14.241:8080
  • 访问接口之后,地址栏输入本机ip+8080,进入sentinel页面,账号密码都是sentinel,可以手动进行流控\降级等的配置。
    在这里插入图片描述

Config

基本原理

在这里插入图片描述

  1. 将所有的配置文件保存至版本管理工具
  2. 将配置中心的远程配置地址设置为版本控制地址,配置中心会从版本控制中拉取对应的配置文件并加载至本地。
  3. 将配置中心注册到Eureka完成服务注册。配置中心注册到注册中心之后,即可完成配置中心的高可用。
  4. 将所有的微服务配置改为链接Eureka发现配置中心,拉取指定配置中心的版本的配置文件。
  5. 修改微服务的配置文件为启动预加载。

创建config服务端

由于config本身提供高可用集群方案,而这个集群方案需要依赖Eureka Server,所以在创建Config服务时,需要引入Eureka客户端,同时引入Config连接SVN需要的依赖库。

  • 使用向导创建项目
    在这里插入图片描述

  • 加入svn依赖

<dependency>
	<groupId>org.tmatesoft.svnkit</groupId>
    <artifactId>svnkit</artifactId>
    <version>1.9.3</version>
</dependency>
  • 上传配置文件至版本控制工具
    将其他客户端的配置文件上传至版本控制工具,这里以svn举例。

在这里插入图片描述

  • 分支文件夹中的文件说明
    svn作为版本协同工具,拥有创建多个分支的功能,多个分支标记着多个版本环境。用于在线服务回滚。

    • url可作为config连接的地址
    • 分支版本可在config端连接时指定,默认是trunk目录
      在这里插入图片描述
  • 分支文件夹下存放所有的客户端的配置文件,这里存放了三个版本的文件。分别是userService.yml、userService-dev.yml(开发环境)、userService-pro.yml(生产环境)。

    • 这三个文件又有各自不同的作用域。其中两个通过名称很好理解。
    • userService-dev.yml 用于开发测试环境,后缀dev可以随意自定义。
    • userService-pro.yml 用于正式生产环境,后缀pro 可以随意自定义。
    • userService.yml 用来存放不同环境的公共配置信息(可省略)。
给启动类加注解

控制中心需要实现高可用,除了SpringBoot规范中的开启配置中心服务注解以外,还需要加入Eureka客户端连接的注解
在这里插入图片描述

修改配置文件

在这里插入图片描述

属性详解:

  • spring.cloud.config.server.svn 配置svn相关的属性
    • uri :svn地址
    • username : svn账户
    • password :svn密码
    • basedir :下载的配置文件本地存放路径
    • default-label :引用分支,默认为trunk。若需要使用其他的分支需要声明属性并指定值
  • spring.profiles.active = subversion 指定配置中心使用svn
访问测试
  • userService.yml(存放微服务的注册中心配置信息,不带后缀的文件,config是当做公共配置使用的,无法直接访问。)
    在这里插入图片描述

  • userService-dev.yml(开发环境)在这里插入图片描述

  • userService-pro.yml(生产环境)
    在这里插入图片描述

注意:这里只是为了测试才将两个文件的应用名设置为不同,在后续真正开发的过程中,一定要将所有的相同的服务设置为相同的应用名。

  • 访问userService-dev.yml(访问开发环境配置文件,config会将公共配置文件同样引入进来。)
    在这里插入图片描述

  • 访问userService-pro.yml(生产环境)
    在这里插入图片描述

客户端连接 Config

引入pom依赖
  • 在原有的Eureka依赖下,加入Spring Cloud Config相关依赖
    在这里插入图片描述
修改配置文件

在这里插入图片描述

  • spring.application.name : 应用名(注意,在连接了配置中心的情况下,这里指配置中心的文件名)
  • spring.cloud.config.discovery.enabled : 开启配置中心。(true为开启,false为不开启,默认为false)
  • spring.cloud.config.discovery.service-id :配置中心在Eureka注册中心的名称
  • spring.cloud.config.profile :引用配置再配置中心的后缀。
  • 也就是说当前配置中由spring.application.name+ spring.cloud.config.profile组成了文件名(当前示例的结果为 :userService-dev)

  • SpringCloud所有的组件都是依赖SpringBoot进行二次封装的,默认的配置文件是application.properties。项目在启动时会按照启动类赋予的功能加载配置文件中的属性。但是目前的配置文件是一个远程地址,需要先拉取配置再加载,所以配置文件需要在SpringBoot加载配置内容前就拿到具体配置。这里就需要预加载。

    • 重命名配置文件为:bootstrap.yml/properties

Zuul

Spring Cloud Zuul 是一套边缘服务,它能实现动态路由、监控、负载和流量管理等功能。简单来说,Zuul就是服务应用端的一套负载均衡器。它是由一个核心ZuulServlet和一些列的过滤器组成。

在这里插入图片描述

创建zuul服务

在这里插入图片描述

Zuul是单独的一个服务,需要重新创建一个新项目,除了加入Zuul相关依赖以外,还需要加入Config客户端和Eureka客户端依赖。
Zuul可以通过Config拉取配置文件,并注册至Eureka直接完成高可用,这个过程不需要任何配置信息。

创建zuul服务端

在这里插入图片描述

  • 配置信息
    在这里插入图片描述

与配置中心客户端连接一样,连接配置中心,起名为api-config,同时在版本控制工具中上传对应的配置文件。配置文件可以参考Config示例创建同样的三个配置文件,并命名为api-config.yml、api-config-dev.yml、api-config-pro.yml。

在这里插入图片描述

  • api-gateway.yml
    在这里插入图片描述
  • api-gateway-dev.yml、api-gateway-pro.yml

在这里插入图片描述

在当前版本中,启动完Zuul服务直接访问zuul服务并加上需要访问的ServiceId(注册在Eureka的Application名)和请求路径即可完成转发。
在这里插入图片描述

从测试结果中可以看到,通过zuul服务地址+服务实例+接口地址 就可以完成请求转发的功能。整个过程如下图所示:

在这里插入图片描述

Zuul服务的一些常用配置
  • 通过指定serviceId的方式自定义路径(通过实例名:映射路径 可以简洁的声明实例名和映射路径)
    在这里插入图片描述

  • 禁用所有默认映射的服务
    在这里插入图片描述

  • 连接及超时配置
    Zuul的连接数,超时等常见配置在ZuulProperties的内部类Host类中。超时配置有两种情况:

  1. 当zuul使用了服务注册中心时,会有ribbon组件负责连接。开发者需要设置ribbon.ReadTimeout 和ribbon.SocketTimeout两项配置属性
  2. 当使用了zuul节点和url映射时,需要配置
    zuul.host.connect-timeout-millis和zuul.host.socket-timeout-milli属性
  • 连接超时配置
    在这里插入图片描述

  • Ribbon超时设置
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值