上一编我们做了局部降级,但是局部降级有一个缺点,就是如果需要做降级的方法一两个还好说,但是一旦多了,就会造成大量的重复代码,看着非常杂乱,今天我们来做一个全局降级来解决
这里我们接着上一篇写的,所以有好多就不在做了
来,我们在消费者里边加入hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
现在我们需要给启动类上加上开启全局降级的注解
修改我们的controller
给我们提供者里边做个异常
启动测试一下,有异常情况下是这样的
做了降级是这样的
全局降级测试成功,接下来我们来做Hystix熔断器,首先呢我们先需要了解一下什么是熔断器,干什么用的
我们在访问服务器的时候,有的时候访问的是健康的,有的时候访问的是有异常或者是超时的,但是服务器里边的某个方法不可能一直是有异常或者是一直连接超时,这时我们就需要让它进行判断,在指定的时间里,有几次请求,这几次请求有几次失败的,根据我们设定的访问成功率判断它到底是否正常
来,我们还在这个8001上的项目测试,这里我们设置了10秒之内发送10次请求,有6次错误就会熔断,熔断之后不管什么请求就都会拦截,以免对服务器造成阻塞
我们测试一下,这是正常情况下
这是请求错误的情况下,来我们快速点10次,然后在请求正确的会怎么样
我们可以看出,一旦熔断的情况下,正常访问也会阻止在外面,但是它会自动恢复,并不是一直阻止在外面不能访问,它默认是5秒自动熔合,到底是不是呢?我们等五秒在试一下
可以看出这会恢复正常了
这就是Hystix熔断器,能断开,能熔合
接下来我们来写Getway网关
导入相关的依赖
<dependencies>
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client gateWay作为网关,也要注册进服务中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- gateway和web不能同时存在,即web相关jar包不能导入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>org.example</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
配置文件
server:
port: 9527
spring:
application:
name: cloud-gateway
## GateWay配置
cloud:
gateway:
routes:
- id: payment_routh # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/** # 断言,路径相匹配的进行路由
- id: payment_routh2 # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路由
# 注册进 eureka Server
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
register-with-eureka: true
fetch-registry: true
网关前是这样的
网关后是这样的,把我们真实的端口号给隐藏起来,以保证安全
好了,今天太晚了,先到此结束,明天见