Hystrix服务熔断

suaxi
2020-12-31 / 0 评论 / 181 阅读 / 正在检测是否收录...

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

当整个微服务调用出现问题时,前端反馈给用户的信息不是错误代码,而是熔断后的备选方法中定义的信息(即快速返回出现错误的响应信息)。

用户正常查询信息:

4.正常查询.png

查询数据库中不存在的信息,即服务调用出现异常:

5.查询数据库中不存在的信息.png

0

评论 (0)

取消