导入hystrix依赖
<!--导入Hystrix依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.6.RELEASE</version> </dependency>调整yml配置文件
server: port: 8001 # mybatis配置 mybatis: # springcloud-api 模块下的pojo包 type-aliases-package: com.haust.springcloud.pojo # 本模块下的mybatis-config.xml核心配置文件类路径 config-location: classpath:mybatis/mybatis-config.xml # 本模块下的mapper配置文件类路径 mapper-locations: classpath:mybatis/mapper/*.xml # spring配置 spring: application: #项目名 name: springcloud-provider-dept datasource: # 德鲁伊数据源 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8 username: root password: root # Eureka配置:配置服务注册中心地址 eureka: client: service-url: # 注册中心地址7001-7003 defaultZone: :7001/eureka/,:7002/eureka/,:7003/eureka/ instance: instance-id: springcloud-provider-dept-hystrix-8001 #修改Eureka上的默认描述信息 prefer-ip-address: true #改为true后默认显示的是ip地址而不再是localhost #info配置 info: app.name: haust-springcloud #项目的名称 company.name: com.haust #公司的名称prefer-ip-address: false:
prefer-ip-address: true:
修改controller
/** * @Auther: csp1999 * @Date: 2020/05/17/22:06 * @Description: 提供Restful服务 */ @RestController public class DeptController { @Autowired private DeptService deptService; /** * 根据id查询部门信息 * 如果根据id查询出现异常,则走hystrixGet这段备选代码 * @param id * @return */ @HystrixCommand(fallbackMethod = "hystrixGet") @RequestMapping("/dept/get/{id}")//根据id查询 public Dept get(@PathVariable("id") Long id){ Dept dept = deptService.queryById(id); if (dept==null){ throw new RuntimeException("这个id=>"+id+",不存在该用户,或信息无法找到~"); } return dept; } /** * 根据id查询备选方案(熔断) * @param id * @return */ public Dept hystrixGet(@PathVariable("id") Long id){ return new Dept().setDeptno(id) .setDname("这个id=>"+id+",没有对应的信息,null---@Hystrix~") .setDb_source("在MySQL中没有这个数据库"); } }为主启动类添加对熔断的支持注解@EnableCircuitBreaker
/** * @Auther: csp1999 * @Date: 2020/05/17/22:09 * @Description: 启动类 */ @SpringBootApplication @EnableEurekaClient // EnableEurekaClient 客户端的启动类,在服务启动后自动向注册中心注册服务 @EnableDiscoveryClient // 服务发现~ @EnableCircuitBreaker // 添加对熔断的支持注解 public class HystrixDeptProvider_8001 { public static void main(String[] args) { SpringApplication.run(HystrixDeptProvider_8001.class,args); } }测试:
使用熔断后,当访问一个不存在的id时,前台页展示数据如下:
而不适用熔断的springcloud-provider-dept–8001模块访问相同地址会出现下面状况:
因此,为了避免因某个微服务后台出现异常或错误而导致整个应用或网页报错,使用熔断是必要的
8.5 服务降级 什么是服务降级?服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。说白了,就是尽可能的把系统资源让给优先级高的服务。