Hystrix服务熔断
服务熔断:
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当某个微服务不可用或响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误的响应信息”,当该节点的调用恢复正常之后注册中心将其恢复至调用链路。Spring Cloud的熔断机制通过Hystrix
实现,它会监控微服务间的调用状况,当失败的调用到一定阈值(缺省5秒内20次调用失败),就会启动熔断机制。
具体实例:
1、导入依赖
<dependencies>
<!--需要拿到实体类,配置api module-->
<dependency>
<groupId>com.sw</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>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--actuator监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
2、dao
package com.sw.springcloud.dao;
import com.sw.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author suaxi
* @Date 2020/12/28 21:34
*/
@Mapper
@Repository
public interface DeptDao {
public boolean addDept(Dept dept);
public Dept findDept(Long id);
public List<Dept> findAll();
}
3、Service接口
package com.sw.springcloud.service;
import com.sw.springcloud.pojo.Dept;
import java.util.List;
/**
* @Author suaxi
* @Date 2020/12/28 21:34
*/
public interface DeptService {
public boolean addDept(Dept dept);
public Dept findDept(Long id);
public List<Dept> findAll();
}
Service实现:
package com.sw.springcloud.service;
import com.sw.springcloud.dao.DeptDao;
import com.sw.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author suaxi
* @Date 2020/12/28 21:42
*/
@Service
public class DeptServiceImpl implements DeptService{
@Autowired
private DeptDao deptDao;
@Override
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
}
@Override
public Dept findDept(Long id) {
return deptDao.findDept(id);
}
@Override
public List<Dept> findAll() {
return deptDao.findAll();
}
}
4、controller
注:hystrix熔断需开启注解@HystrixCommand(fallbackMethod = "hystrixGet")
,且提供熔断后的备选方法
package com.sw.springcloud.controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.sw.springcloud.pojo.Dept;
import com.sw.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Author suaxi
* @Date 2020/12/28 21:44
* 提供RestFul服务
*/
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGet")
public Dept get(@PathVariable("id")Long id){
Dept dept = deptService.findDept(id);
if (dept==null){
throw new RuntimeException("不存在id为"+id+"的用户,或者信息无法找到");
}
return dept;
}
//熔断后的备选方法
public Dept hystrixGet(@PathVariable("id")Long id){
Dept dept = deptService.findDept(id);
return new Dept()
.setDeptno(id)
.setDname("不存在id为"+id+"的用户,或者信息无法找到,null-->@Hystrix")
.setDb_source("No message in MySQL");
}
}
5、SpringBoot启动类开启Hystrix注解支持
package com.sw.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @Author suaxi
* @Date 2020/12/28 21:49
*/
@SpringBootApplication
@EnableEurekaClient //服务启动后自动注册到Eureka中
@EnableDiscoveryClient //开启服务发现
@EnableCircuitBreaker //开启熔断器支持
public class DeptProviserHystrix_8088 {
public static void main(String[] args) {
SpringApplication.run(DeptProviserHystrix_8088.class,args);
}
}
6、appliction.yml配置(此处以单个节点配置为例,实际开发中的微服务节点不止一个)
server:
port: 8088
#mybatis配置
mybatis:
type-aliases-package: com.sw.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
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.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&character=UFT-8
username: root
password: 123456
#配置Eureka,配置服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: springcloud-provider_dept-hystrix_8088 #修改Eureka默认描述信息
#info配置
info:
app.name: springcloud-demo
company.name: suaxi
当整个微服务调用出现问题时,前端反馈给用户的信息不是错误代码,而是熔断后的备选方法中定义的信息(即快速返回出现错误的响应信息
)。
用户正常查询信息:
查询数据库中不存在的信息,即服务调用出现异常:
评论 (0)