springcloud(hystrix,config,zuul)

    科技2025-05-03  15

    文章目录

    Hystrix加入pom依赖创建Hystrix服务修改服务调用方修改服务提供方HystrixCommand的配置扩展使用类全局配置 Openfeign集成Hystrix开启OpenFeign的Hystrix配置FeignClient服务超时配置FeignClient的fallbackFactory sentinel流量防卫兵Config基本原理创建config服务端给启动类加注解修改配置文件访问测试 客户端连接 Config引入pom依赖修改配置文件 Zuul创建zuul服务创建zuul服务端Zuul服务的一些常用配置

    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

    基本原理

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

    创建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类中。超时配置有两种情况:

    当zuul使用了服务注册中心时,会有ribbon组件负责连接。开发者需要设置ribbon.ReadTimeout 和ribbon.SocketTimeout两项配置属性当使用了zuul节点和url映射时,需要配置 zuul.host.connect-timeout-millis和zuul.host.socket-timeout-milli属性

    连接超时配置

    Ribbon超时设置

    Processed: 0.212, SQL: 8