Hystrix实现了断路器模式

Hystrix实现了断路器模式

Netflix创建了一个名为Hystrix的库,实现了断路器模式。在微服务体系结构中,通常有多层服务调用,

如下例所示:

较低级别服务中的服务故障可能会导致级联故障一直到用户。当对特定服务的调用超过circuitBreaker.requestVolumeThreshold(默认值:20个请求)

并且在metrics.rollingStats.timein毫秒(默认值:10秒)

定义的滚动窗口中失败百分比大于circuitBreaker.errorThresholdPercentage(默认值:>50%)时,

电路将打开并且不会进行调用。在出现错误和开路的情况下,开发人员可以提供后备。

 

如何包含HySTRX

spring-cloud-starter-netflix-hystrix

@SpringBootApplication
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

@Component
public class StoreIntegration {

    @HystrixCommand(fallbackMethod = "defaultStores")
    public Object getStores(Map parameters) {
        //do stuff that might fail
    }

    public Object defaultStores(Map parameters) {
        return /* something useful */;
    }
}

@HystrixCommand由一个名为“javanica”的Netflix contrib库提供。Spring Cloud会自动将带有该注释的Spring beans包装在连接到Hystrix断路器的代理中。断路器计算何时打开和关闭电路,以及发生故障时应采取的措施。

 

如果希望某些线程本地上下文传播到@HystrixCommand中,则默认声明不起作用,因为它在线程池中执行命令(以防超时)。您可以通过配置或直接在注释中切换Hystrix以使用与调用者相同的线程,方法是要求它使用不同的“隔离策略”。下面的示例演示如何在批注中设置线程

官网例子

@HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)
...

如果您使用的是@SessionScope或@RequestScope,同样的情况也适用。如果遇到运行时异常,该异常表示找不到作用域上下文,则需要使用相同的线程。

您还可以选择将hystrix.shareSecurityContext属性设置为true。这样做会自动配置一个Hystrix并发策略插件挂钩,以便将SecurityContext从主线程传输到Hystrix命令使用的线程。Hystrix不允许注册多个Hystrix并发策略,因此可以通过将自己的Hystrix concurrency策略声明为Spring be an来使用扩展机制。Spring Cloud在Spring上下文中查找您的实现,并将其包装在自己的插件中。

连接的断路器的状态也暴露在调用应用程序的/health端点中,如下例所示

{
    "hystrix": {
        "openCircuitBreakers": [
            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"
}

要启用Hystrix度量流

请包含对spring boot starter执行器的依赖,并设置management.endpoints.web.exposure.include:Hystrix.stream。这样做会将/actuator/hystrix.stream作为管理端点公开,如下例所示:

    
        org.springframework.boot
        spring-boot-starter-actuator
    

Hystrix仪表板

Hystrix实现了断路器模式_第1张图片

Hystrix超时和功能区客户端

 创建一个空的Maven库 

Hystrix实现了断路器模式_第2张图片

 

失败隔离了

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.dachan.demo.HystrixDemo.run(HystrixDemo.java:18)
    at com.dachan.demo.HystrixDemo.run(HystrixDemo.java:9)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
    at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.Observable.unsafeSubscribe(Observable.java:10151)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
    at rx.Observable.unsafeSubscribe(Observable.java:10151)
    at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
    at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
    at rx.Observable.unsafeSubscribe(Observable.java:10151)
    at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
    at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
    at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
    at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
 error !!!

 

get Data
大成进入熔断世界:hystrix-MyGroup-1
大成进入熔断世界:hystrix-MyGroup-1

 

 

你可能感兴趣的:(spring实践大全)