Hystrix 的熔断使用及配置

HystrixCommandProperties这个类中要有默认的配置属性
@HystrixCommand注解
可以看看里面的属性,过多了

改 hystrix 8001的项目的service

package home.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import home.entity.MyResult;
import home.entity.Pay;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import javax.naming.Name;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class PaySer {
     
    @Value("${server.port}"

    )
    String port;

    public String ok(int id) {
     
        return "线程:" + Thread.currentThread().getName() + "ok:" + id + "o(∩_∩)o 哈哈";


    }

    @HystrixCommand(fallbackMethod = "notokHandler", commandProperties = {
     @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})
    public String notok(int id) {
     
        int n = 5;
        try {
     
            TimeUnit.SECONDS.sleep(n);
        } catch (InterruptedException e) {
     
            e.printStackTrace();
        }

        return "线程:" + Thread.currentThread().getName() + "notok:" + id + "o(∩_∩)o 哈哈" + "耗时" + n + "秒";
//        int num = 10/0;
//        return "线程:" + Thread.currentThread().getName() + "notok:" + id + "o(∩_∩)o 哈哈" + "耗时";


    }


    public String notokHandler(int id) {
     
        return "线程:" + Thread.currentThread().getName() + "notokhandler:" + id + "(┬_┬)";

    }
@HystrixCommand(fallbackMethod ="errerCircuitBreaker",commandProperties = {
     
        @HystrixProperty(name="circuitBreaker.enabled",value = "true"),//是否开启断路器
        @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "5"),//请求次数
        @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间范围
        @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "10")//失败率
}

)
    public String CircuitBreaker(@PathVariable("id") int id) {
     
        if (id < 0) {
     
            throw new RuntimeException("id不能是负数");
        }
        String idstr = UUID.randomUUID().toString();
        return  Thread.currentThread().getName()+":调用成功,流水号是:"+idstr;

    }

    public String errerCircuitBreaker(int id) {
     
        return "id不能是负数,你怎么搞得,重新填 (┬_┬) id:"+id;
    }
}

加了最后一个方法。

改controller

package home.controller;

        import home.entity.MyResult;
        import home.entity.Pay;
        import home.service.PaySer;
        import lombok.extern.slf4j.Slf4j;
        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.*;

        import java.util.Arrays;
        import java.util.List;
        import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class PayCon {
     
    @Autowired
    PaySer paySer;

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping(value = "/hystrix/ok/{id}")
    public String ok(@PathVariable(value = "id") int id) {
     
        return paySer.ok(id);

    }

    @GetMapping(value = "/hystrix/notok/{id}")
    public String notok(@PathVariable(value = "id") int id) {
     
        return paySer.notok(id);
    }
    @GetMapping(value = "/hystrix/circuit/{id}")
    public String CircuitBreaker(@PathVariable("id") int id){
     
        return paySer.CircuitBreaker(id);
    }
}

也是用的最后的一个方法,我们直接启动7001 和8001 ,访问8001的controller ,根据设置是10秒中内如果次数超过5次,并且失败率超过10% 我们就熔断,然后用正确的访问,也是失败的。过一会儿又慢慢的回复正常了。
参数解析,最近的多少秒。
在以上条件下满足访问此树5
统计失败率。
断开之后的5秒,会用一个请求试试,如果成功了,就连接上。继续服务。

还有很多属性可以以配置

Command属性主要用来控制HystrixCommand命令的行为,它主要分下面的类别

1 Execution:用来控制HystrixCommand.run()的执行

execution.isolation.strategy:该属性用来设置HystrixCommand.run()执行的隔离策略。默认为THREAD。
execution.isolation.thread.timeoutInMilliseconds:该属性用来配置HystrixCommand执行的超时时间,单位为毫秒。
execution.timeout.enabled:该属性用来配置HystrixCommand.run()的执行是否启用超时时间。默认为true。
execution.isolation.thread.interruptOnTimeout:该属性用来配置当HystrixCommand.run()执行超时的时候是否要它中断。
execution.isolation.thread.interruptOnCancel:该属性用来配置当HystrixCommand.run()执行取消时是否要它中断。
execution.isolation.semaphore.maxConcurrentRequests:当HystrixCommand命令的隔离策略使用信号量时,该属性用来配置信号量的大小。当最大并发请求达到该设置值时,后续的请求将被拒绝。
2 Fallback:用来控制HystrixCommand.getFallback()的执行

fallback.isolation.semaphore.maxConcurrentRequests:该属性用来设置从调用线程中允许HystrixCommand.getFallback()方法执行的最大并发请求数。当达到最大并发请求时,后续的请求将会被拒绝并抛出异常。
fallback.enabled:该属性用来设置服务降级策略是否启用,默认是true。如果设置为false,当请求失败或者拒绝发生时,将不会调用HystrixCommand.getFallback()来执行服务降级逻辑。
3 Circuit Breaker:用来控制HystrixCircuitBreaker的行为。

circuitBreaker.enabled:确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。默认为true。
circuitBreaker.requestVolumeThreshold:用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到19个请求,即使这19个请求都失败了,断路器也不会打开。
circuitBreaker.sleepWindowInMilliseconds:用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器设置为“半开”状态,尝试熔断的请求命令,如果依然时候就将断路器继续设置为“打开”状态,如果成功,就设置为“关闭”状态。
circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。默认值为50,表示在滚动时间窗中,在请求值超过requestVolumeThreshold阈值的前提下,如果错误请求数百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态。
circuitBreaker.forceOpen:该属性默认为false。如果该属性设置为true,断路器将强制进入“打开”状态,它会拒绝所有请求。该属性优于forceClosed属性。
circuitBreaker.forceClosed:该属性默认为false。如果该属性设置为true,断路器强制进入“关闭”状态,它会接收所有请求。如果forceOpen属性为true,该属性不生效。
4 Metrics:该属性与HystrixCommand和HystrixObservableCommand执行种捕获的指标相关。

metrics.rollingStats.timeInMilliseconds:该属性用来设置滚动时间窗的长度,单位为毫秒。该时间用于断路器判断健康度时需要收集信息的持续时间。断路器在收集指标信息时会根据设置的时间窗长度拆分成多个桶来累计各度量值,每个桶记录了一段时间的采集指标。例如,当为默认值10000毫秒时,断路器默认将其分成10个桶,每个桶记录1000毫秒内的指标信息。
metrics.rollingStats.numBuckets:用来设置滚动时间窗统计指标信息时划分“桶”的数量。默认值为10。
metrics.rollingPercentile.enabled:用来设置对命令执行延迟是否使用百分位数来跟踪和计算。默认为true,如果设置为false,那么所有的概要统计都将返回-1。
metrics.rollingPercentile.timeInMilliseconds:用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
metrics.rollingPercentile.numBuckets:用来设置百分位统计滚动窗口中使用桶的数量。
metrics.rollingPercentile.bucketSize:用来设置每个“桶”中保留的最大执行数。
metrics.healthSnapshot.intervalInMilliseconds:用来设置采集影响断路器状态的健康快照的间隔等待时间。
5 Request Context:涉及HystrixCommand使用HystrixRequestContext的设置。

requestCache.enabled:用来配置是否开启请求缓存。
requestLog.enabled:用来设置HystrixCommand的执行和事件是否打印到日志的HystrixRequestLog中。

限流,就是用sentinal
来实现,后序再说。

你可能感兴趣的:(cloud)