Java-hystrixは限流と溶断を実現


Hystrixは、溶断、隔離、Fallback、cache、モニタリングなどの機能を提供し、1つ以上の依存が同時に問題が発生した場合でもシステムが使用可能であることを保証します.サービスのインタフェースをhystrixスレッドプールで隔離し、限流と溶断の効果を実現します.スカイボートプラットフォームが提供するSpringCloudConfigコンフィギュレーションセンターに合わせて、サービスを再起動せずにhystrixストリーム制限のパラメータを動的に調整できます.
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 #