Spring Cloud - 5 (Spring Cloud Netflix Hystrix)

本文详细介绍了Spring Cloud中Hystrix的熔断机制,包括如何启用和服务短路的概念。探讨了QPS和TPS的计算方法,并通过示例展示了Hystrix的注解和编程式使用方式。此外,还涉及了熔断保护的激活方法及Hystrix仪表板的配置。

Spring Cloud Netflix Hystrix)


服务短路(CircuitBreaker)

  • QPS:Query Per Second
  • TPS:Transaction Per Second
  • QPS:经过全链路压测,计算单机极限QPS,集群QPS=单机PQS*集群机器数量*可靠性比率
  • 全链路压测,除了压极限QPS,还有错误数量
  • 全链路:一个完整的业务流程操作
  • JMeter:可调整型比较灵活

Spring Cloud Hystrix Client


官网:https://github.com/Netflix/Hystrix

Reactive Java框架:

  • java9 Flow API
  • Reactor
  • RxJava(Reactive X)

激活Hystrix

通过@EnableHystrix激活

配置信息wiki:https//github.com/Netflix/Hystrix/wiki/Configuration

Hystrix

    1. 注解方式

@HystrixCommand(defaultFallback= "errorContent",commandProperties = 
        {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value= "100")})
    @GetMapping("/user/count")
    public String userCount() throws InterruptedException {
        Random random = new Random();
        int nextInt = random.nextInt(200);
        System.out.println("random time > "+nextInt);
        Thread.sleep(nextInt);
        return userService.userCount();
    }
    
    public String errorContent() {
        System.out.println("超时了");
        return "-1";
    }

   2.  编程方式

    @GetMapping("/user/count2")
    public String userCount2() {
        return new MyHystrixCommand().execute();
    }
    
    private class MyHystrixCommand extends com.netflix.hystrix.HystrixCommand<String>{

        protected MyHystrixCommand() {
            super(HystrixCommandGroupKey.Factory.asKey(""),    100);
            
        }

        @Override
        protected String run() throws Exception {
            Random random = new Random();
            int nextInt = random.nextInt(200);
            System.out.println("random time > "+nextInt);
            Thread.sleep(nextInt);
            return "OK";
        }
        
        @Override
        protected String getFallback() {
            return UserServiceProviderRestApiController.this.errorContent();
        }
        
    }

对比其他Java执行方式:

Feature


public class FutrueDemo {
    
    public static void main(String[] args) {
        Random random = new Random();
        
        ExecutorService service = Executors.newFixedThreadPool(1);
        
        Future<String> futrue = service.submit(() -> {
            int value = random.nextInt(200);
            
            System.out.print("睡眠"+value+"ms.");
            
            Thread.sleep(value);
            
            return "OK";
        });
        
        try {
            futrue.get(100,TimeUnit.MILLISECONDS);
        }catch (Exception e) {
            System.out.println("超时保护...");
        }
        
        service.shutdown();
    }

}

Health Endpoint (/actuator/health)

{
    "status": "UP",
    "details": {
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 140382552064,
                "free": 7376781312,
                "threshold": 10485760
            }
        },
        "refreshScope": {
            "status": "UP"
        },
        "discoveryComposite": {
            "status": "UP",
            "details": {
                "discoveryClient": {
                    "status": "UP",
                    "details": {
                        "services": ["user-service-consumer", "user-service-provider", "eureka-server"]
                    }
                },
                "eureka": {
                    "description": "Remote status from Eureka server",
                    "status": "UP",
                    "details": {
                        "applications": {
                            "USER-SERVICE-CONSUMER": 1,
                            "EUREKA-SERVER": 2,
                            "USER-SERVICE-PROVIDER": 2
                        }
                    }
                }
            }
        },
        "hystrix": {
            "status": "UP"
        }
    }
}

激活熔断保护

@EnableCircuitBreaker 激活:@EnableHystrix + Spring Cloud功能

@EnableHystrix 激活,没有一些Spring Cloud功能,如 /hystrix.stream

hystrix Endpoint(/actuator/hystrix.stream)

data: {
	"type": "HystrixCommand",
	"name": "MyHystrixCommand",
	"group": "",
	"currentTime": 1563720628038,
	"isCircuitBreakerOpen": false,
	"errorPercentage": 50,
	"errorCount": 2,
	"requestCount": 4,
	"rollingCountBadRequests": 0,
	"rollingCountCollapsedRequests": 0,
	"rollingCountEmit": 0,
	"rollingCountExceptionsThrown": 0,
	"rollingCountFailure": 0,
	"rollingCountFallbackEmit": 0,
	"rollingCountFallbackFailure": 0,
	"rollingCountFallbackMissing": 0,
	"rollingCountFallbackRejection": 0,
	"rollingCountFallbackSuccess": 1,
	"rollingCountResponsesFromCache": 0,
	"rollingCountSemaphoreRejected": 0,
	"rollingCountShortCircuited": 0,
	"rollingCountSuccess": 2,
	"rollingCountThreadPoolRejected": 0,
	"rollingCountTimeout": 1,
	"currentConcurrentExecutionCount": 0,
	"rollingMaxConcurrentExecutionCount": 1,
	"latencyExecute_mean": 0,
	"latencyExecute": {
		"0": 0,
		"25": 0,
		"50": 0,
		"75": 0,
		"90": 0,
		"95": 0,
		"99": 0,
		"99.5": 0,
		"100": 0
	},
	"latencyTotal_mean": 0,
	"latencyTotal": {
		"0": 0,
		"25": 0,
		"50": 0,
		"75": 0,
		"90": 0,
		"95": 0,
		"99": 0,
		"99.5": 0,
		"100": 0
	},
	"propertyValue_circuitBreakerRequestVolumeThreshold": 20,
	"propertyValue_circuitBreakerSleepWindowInMilliseconds": 5000,
	"propertyValue_circuitBreakerErrorThresholdPercentage": 50,
	"propertyValue_circuitBreakerForceOpen": false,
	"propertyValue_circuitBreakerForceClosed": false,
	"propertyValue_circuitBreakerEnabled": true,
	"propertyValue_executionIsolationStrategy": "THREAD",
	"propertyValue_executionIsolationThreadTimeoutInMilliseconds": 100,
	"propertyValue_executionTimeoutInMilliseconds": 100,
	"propertyValue_executionIsolationThreadInterruptOnTimeout": true,
	"propertyValue_executionIsolationThreadPoolKeyOverride": null,
	"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests": 10,
	"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests": 10,
	"propertyValue_metricsRollingStatisticalWindowInMilliseconds": 10000,
	"propertyValue_requestCacheEnabled": true,
	"propertyValue_requestLogEnabled": true,
	"reportingHosts": 1,
	"threadPool": ""
}

Spring Cloud Hystrix Dashboard


使用@EnableHystrixDashboard激活


@SpringBootApplication
@EnableHystrixDashboard
public class SpringCloudHystrixDashboardApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudHystrixDashboardApplication.class, args);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值