Java-hystrixは限流と溶断を実現
8505 ワード
Hystrixは、溶断、隔離、Fallback、cache、モニタリングなどの機能を提供し、1つ以上の依存が同時に問題が発生した場合でもシステムが使用可能であることを保証します.サービスのインタフェースをhystrixスレッドプールで隔離し、限流と溶断の効果を実現します.スカイボートプラットフォームが提供するSpringCloudConfigコンフィギュレーションセンターに合わせて、サービスを再起動せずにhystrixストリーム制限のパラメータを動的に調整できます.
Springbootエンジニアリングhystrixを使用する構成手順:1.pom.xml:
Springbootエンジニアリングhystrixを使用する構成手順:1.pom.xml:
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
2.hystrixおよびhystrixDashboardをオンにします. ,@EnableHystrix,@EnableHystrixDashboard
@SpringBootApplication
@EnableHystrix
@EnableHystrixDashboard
public class ContestDemoApplication{
public static void main(String[] args) {
SpringApplication.run(ContestDemoApplication.class, args);
}
}
3.@HystrixCommand注記:@HystrixCommand , 。
, /hello hystrix , 5。
, , , 503
@RestController
@RequestMapping(value = "/contest/demo")
public class HelloController {
// controller hystrix ,
@HystrixCommand(
commandKey = "helloCommand",//
threadPoolKey = "helloPool",//
fallbackMethod = "fallbackMethod",// ,
commandProperties = {
//
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
},
threadPoolProperties = {
// , 10
@HystrixProperty(name = "coreSize", value = "5")
}
)
@RequestMapping(
value = "/hello",
method = RequestMethod.GET
)
public String sayHello(HttpServletResponse httpServletResponse){
return "Hello World!:00000";
}
/**
* , 503
* , , Throwable ,
*/
public String fallbackMethod(HttpServletResponse httpServletResponse,Throwable e){
httpServletResponse.setStatus(HttpStatus.SERVICE_UNAVAILABLE.value());
return e.getMessage();
}
}
hystrixのプロパティ構成: @HystrixCommand , ( CoreSize) , 。 hystrix
@HystrixCommand(
commandProperties = {
//execution
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
@HystrixProperty(name = "execution.timeout.enabled", value = "true"),
@HystrixProperty(name = "execution.isolation.thread.interruptOnTimeout", value = "true"),
@HystrixProperty(name = "execution.isolation.thread.interruptOnCancel", value = "false"),
@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"),
//fallback
@HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "10"),
@HystrixProperty(name = "fallback.enabled", value = "true"),
//circuit breaker
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
@HystrixProperty(name = "circuitBreaker.forceClosed", value = "false"),
@HystrixProperty(name = "circuitBreaker.forceOpen", value = "false"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
//Metrics
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000"),
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"),
@HystrixProperty(name = "metrics.rollingPercentile.enabled", value = "true"),
@HystrixProperty(name = "metrics.rollingPercentile.timeInMilliseconds", value = "60000"),
@HystrixProperty(name = "metrics.rollingPercentile.numBuckets", value = "6"),
@HystrixProperty(name = "metrics.rollingPercentile.bucketSize", value = "100"),
@HystrixProperty(name = "metrics.healthSnapshot.intervalInMilliseconds", value = "500"),
//request context
@HystrixProperty(name = "requestCache.enabled", value = "true"),
@HystrixProperty(name = "requestLog.enabled", value = "true")},
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "10"),
@HystrixProperty(name = "maximumSize", value = "10"),
@HystrixProperty(name = "maxQueueSize", value = "-1"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "5"),
@HystrixProperty(name = "keepAliveTimeMinutes", value = "1"),
@HystrixProperty(name = "allowMaximumSizeToDivergeFromCoreSize", value = "false"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000"),
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10")
}
)
, hystrix 。
4つの異なる優先度の構成(優先度が低いものから高いものまで).≪グローバル構成プロパティ|Global Configuration Properties|oem_src≫:コンフィギュレーション・ファイルでグローバル属性値を定義し、適用開始時またはSpring Cloud Configおよびサービス自体の動的リフレッシュ・インタフェースで実現できる動的リフレッシュ構成機能の下で、「≪グローバル・デフォルト|Global Defaults|oem_src≫」のオーバーライドおよび実行時の「≪グローバル・デフォルト|Global Defaults|ldap≫」の動的調整を実現します. threadpool command , default
#hystrix
hystrix:
threadpool:
default: # @HystrixCommand threadPoolKey , default
coreSize: 50 #
command:
default: # @HystrixCommand commandKey , default
execution:
isolation:
thread:
timeoutInMilliseconds: 1000 #
fallback:
isolation:
semaphore:
maxConcurrentRequests: 1000 # 。 fallback
≪インスタンスのデフォルト|Instance Defaults|oem_src≫:インスタンスのデフォルト値をコードで定義します.インスタンスのプロパティ値をコードで設定することで、デフォルトのグローバル構成を上書きします. :
@HystrixCommand(
commandKey = "helloCommand",//
threadPoolKey = "helloPool",//
fallbackMethod = "fallbackMethod",// ,
commandProperties = {
//
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
},
threadPoolProperties = {
// , 10
@HystrixProperty(name = "coreSize", value = "5")
}
)
@RequestMapping(
value = "/hello",
method = RequestMethod.GET
)
public String sayHello(HttpServletResponse httpServletResponse){
return "Hello World!:00000";
}
≪インスタンス構成プロパティ|Instance Configuration Properties|emdw≫:指定したインスタンスのプロパティ構成をプロファイルで行い、前の3つのデフォルト値を上書きします.Spring Cloud Configとサービス自体の動的リフレッシュインタフェースで実現される動的リフレッシュ構成機能も使用でき、特定のインスタンス構成の動的調整を実現できます. /hello , commandKey=helloCommand threadPoolKey=helloPool,
#hystrix
hystrix:
threadpool:
helloPool: # threadPoolKey , defualt
coreSize: 20
command:
helloCommand: # commandKey ,
execution:
isolation:
thread:
timeoutInMilliseconds: 4000 #