项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw 
提取码:3j4a 

问题答疑:

Hystrix服务保护框架,在微服务中Hystrix能够为我们解决哪些问题?
        1.断路器
        2.服务降级
        3.服务熔断
        4.服务隔离机制
        5.服务雪崩效应 连环雪崩效应 如果严重的话,可能会导致整个微服务接口无法访问,所有服务器都会瘫痪.

基于Hystrix解决服务雪崩效应原理:
        服务降级
            1.在高并发的情况下,防止用户一直等待.使用服务降级方式(返回一个友好的提示直接给客户端,不会去处理请求,调用fallBack)
                  目的是为了用户体验.
            2.场景:秒杀-----当前请求人数过多,请稍后尝试. (在tomcat中没有线程进行处理客户端请求的时候,不应该让用户一直转圈等待)
            3.如果调用其他接口超时的时候(默认是1秒时间),如果在一秒钟没有及时响应返回的话,(默认情况下业务逻辑是可以执行的)则直接执行服务降级.
        服务隔离机制
            服务熔断目的是为了保护服务,在高并发情况下,如果请求达到了一定的极限(可以自己设置阈值).如果流量
            超出了设置的阈值,自动开启保护服务功能,使用服务降级方式返回友好提示.熔断机制和服务降级一起使用.
        服务熔断
            隔离方式线程池和信号量隔离.
            线程池隔离:每个服务接口都有自己独立的线程池,每个线程池互不影响,缺点:CPU占用率非常高.不是所有
                       的接口都去采用线程池隔离,核心关键接口.

源码地址 : 链接:https://pan.baidu.com/s/17-cFGA3fJFLF8gcnDZdWXg 
提取码:1q9z   具体见解压说明文件

1.先说常用和推荐使用的一种方式: 定义统一fallback接口

    1.pom.xml依赖 

<!--Hystrix断路器-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

     2.application.properties配置文件

#指定运行端口
server.port=8200
#服务名称
spring.application.name=order
#获取注册实例列表
eureka.client.fetch-registry=true
#注册到Eureka的注册中心
eureka.client.register-with-eureka=true
#配置注册中心地址
#eureka.client.zhang.service-url.defaultZone=http://localhost:8001/eureka/
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

#feign客户端建立连接超时时间
feign.client.config.default.connect-timeout=10000
#feign客户端建立连接后读取资源超时时间
feign.client.config.default.read-timeout=10000

#开启Hystrix断路器
feign.hystrix.enabled=true
#配置Hystrix 超时时间   超时关闭
#hystrix.command.default.execution.timeout.enabled=false
#超时时间(默认1000ms)在调用方配置,被该调用方的所有方法的超时时间都是该值,优先级低于下边的指定配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
#在调用方配置,被该调用方的指定方法(HystrixCommandKey方法名)的超时时间是该值
hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds=4000
#线程池核心线程数 默认为10
hystrix.threadpool.default.coreSize=10
#最大排队长度。默认-1  如果要从-1换成其他值则需重启,即该值不能动态调整,若要动态调整,需要使用到下边这个配置
hystrix.threadpool.default.maxQueueSize=100
#排队线程数量阈值,默认为5,达到时拒绝,如果配置了该选项,队列的大小是该队列
hystrix.threadpool.default.queueSizeRejectionThreshold=5
# 简言之,10s内请求失败数量达到20个,断路器开。  当在配置时间窗口内达到此数量的失败后,进行短路。默认20个
hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
#短路多久以后开始尝试是否恢复,默认5s
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
#出错百分比阈值,当达到此阈值后,开始短路。默认50%
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
#调用线程允许请求HystrixCommand.GetFallback()的最大数量,默认10。超出时将会有异常抛出,注意:该项配置对于THREAD隔离模式也起作用
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50000

  3.定义Feign调用接口,和新建统一fallback处理类并实现Feign调用接口

@FeignClient(value = "member",fallback = MemberServiceFallback.class)
public interface MemberServiceFeign extends IMemberService {
    
    //此处为方便调用member服务的接口,采用直接继承member服务接口  不易写错且减少代码量
    //@FeignClient(value = "member",fallback = MemberServiceFallback.class)
    //value值为被调用服务名   fallback 值为 统一定义的fallback 类

}
@Component
public class MemberServiceFallback implements MemberServiceFeign {

    @Override
    public UserEntity getMember(String name) {
        return null;
    }

    //服务降级友好提示
    @Override
    public ResultVO getUserinfo() {
        return new ResultVO(StatusCode.RESULT_SUCCESS,"服务器忙!请稍后重试!!!");
    }
}

4.启动类

@SpringBootApplication
@EnableEurekaClient  //开启eureka客户端
@EnableFeignClients //开启feign调用
@EnableHystrix  //开启hystrix
public class AppOrder {
    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);
    }
}

5.Feign调用服务降级测试接口(被调用member服务接口实现,睡眠5秒,配置超时3秒,故会超时)

@RestController
public class OrderServcieImpl implements IOrderService {

    @Autowired
    private MemberServiceFeign memberServiceFeign;

    //hystrix第二种写法,使用类方式
    @RequestMapping("/orderToMemberUserInfoHystrixDemo02")
    public ResultVO orderToMemberUserInfoHystrixDemo02() {
        System.out.println("orderToMemberUserInfoHystrixDemo02: 线程池名称:"+Thread.currentThread().getName());
        return memberServiceFeign.getUserinfo();
    }
}
@Override
@RequestMapping("/getUserinfo")
public ResultVO getUserinfo() {
    try {
       Thread.sleep(5000);
    }catch (Exception e){
       e.printStackTrace();
    }
    return new ResultVO(StatusCode.RESULT_SUCCESS,"订单服务接口调用会员服务接口成功...."+serverPort);
    }
}

6.启动eureka member  order 等服务,测试

2.@HystrixCommand注解方式

  1.pom.xml文件  application.properties配置文件  启动类   同方法一   Feign调用服务接口 不要fallback

  2.测试代码 

    //解决服务雪崩效应  hystrix有两种方式配置保护服务 通过注解和接口形式
    //fallbackMethod 方法的作用:服务降级执行
    //@HystrixCommand 默认开启了线程池隔离方式 ,服务降级,服务熔断
    @HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallbackMethod")
    @RequestMapping("/orderToMemberUserInfoHystrix")
    public ResultVO orderToMemberUserInfoHystrix() {
        System.out.println("orderToMemberUserInfoHystrix: 线程池名称:"+Thread.currentThread().getName());
        return memberServiceFeign.getUserinfo();
    }
    
    //服务降级处理方法
    public ResultVO orderToMemberUserInfoHystrixFallbackMethod(){
        return new ResultVO(StatusCode.RESULT_SUCCESS,"返回友好提示:服务降级 !!! 服务器忙,请稍后重试!!!!");
    }

  3.启动服务,调用接口测试

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐