文章目录
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超时设置