Hystrix(服务熔断,服务降级)
分布式系统面临的服务雪崩问题
当用户发起请求时,假设处理请求的服务器1运行时需要调用到服务器2,服务器2运行时需要调用到服务器3,而如果服务器2因为某些原因始终不能正常调用到服务器3,这时候后面其他用户的请求也都会阻塞在服务器1,在并发量极大的情况下容易导致多个服务器崩溃已经许多其他级联问题的发生,这就是服务雪崩。
测试熔断机制,
为了方便后续复习,直接新建一个有熔断机制的provider8001模块:
步骤:导包->
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.example</groupId> <artifactId>springcloud</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.lian</groupId> <artifactId>springcloud-provider-dept-hystrix-8001</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.1.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.1.2.RELEASE</version> </dependency> <!-- #监视器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.4.RELEASE</version> </dependency> <!-- spring-boot-test--> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.1.4.RELEASE</version> <scope>test</scope> </dependency> <!-- jetty--> <!-- 热部署--> </dependencies> </project>
2.只测试一个get/id的方法,方便对比,在controller类添加备选方法,像我们原来如果没有添加这个备选方法,那么在用户请求不存在的id时,前端就会报错,现在我们有了这个备选方法,当用户请求不存在的id时,前端会打印出提示信息。
3。主启动类开启熔断注解
4.测试访问成功:
当我们访问不存在的id时前端打印提示信息
服务降级
客户端从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时在客户端,我们可以准备一个FallbackFactory,返回一个默认的值,整体的服务水平下降了,但是系统还能正常运行。注意:服务熔断是在服务端操作的,但是服务降级是在客户端操作的
1.springcloud-api写一个降级类
2.在springcloud-api模块的service目录下的接口要绑定我们写的降级类
3.在消费者模块的配置文件中增加服务降级的配置
4.启动测试
未关闭后端的provider时若前端访问空白的用户id,则网页没有报错只是空白
关闭后端的provider后的页面提示