SpringCloud入門(四):Hystrixの概要と使用

12876 ワード

サービス雪崩
マイクロサービスアーキテクチャでは、システムは通常、複数のサービス層を含む.マイクロサービス間ではネットワークを介して通信が行われ,アプリケーションシステム全体を支えるため,サービス間の依存は避けられない.各マイクロサービスは、自分が常に100%利用できることを保証することはできません.1つのマイクロサービスが停止すると、他のマイクロサービスがこの停止したマイクロサービスを呼び出すことはできません.このような基礎サービス障害がカスケード障害を引き起こす現象を雪崩効果と呼ぶ.
簡単に言えば、サービスAはサービスBを呼び出し、サービスBはまたサービスC、サービスDを呼び出す(このような呼び出しプロセスはサービス扇出である).一方、あるセクタされたサービス呼び出しリンクには、応答時間プロセスまたは放出異常により、サービス呼び出し者がより多くのリソースを占有され、システム全体が崩壊するサービスがある.
ソリューション
雪崩効果を防ぐには、強力なフォールトトレランスメカニズムが必要だ.フォールトトレランスメカニズムは一般に以下の2点を実現する必要がある.
ネットワークリクエストのタイムアウトの設定:各ネットワークリクエストにタイムアウト時間を設定し、タイムアウトは待機せず、リソースをできるだけ早く解放します.
遮断器モードを使用:遮断器は家の自動ブレーキに相当します.リクエストエラーの失敗数が多い場合や、タイムアウトが多い場合は、マイクロサービスに対するリクエストが自動的に停止します.
 
Hystrixの概要
Hystrixはフォールトトレランス管理ツールであり、アプリケーション内のリモートシステムアクセス、サービスコール、サードパーティ依存パッケージのコールエントリをリソース制御によって隔離し、分散システムで失敗したカスケード方式の伝達を回避し、システムの弾力性と丈夫性を向上させることを目的としている.
Hystrixフォールトトレランス機構
Wrapリクエスト:HystrixCommandを使用して、依存する呼び出しロジックにWrapを注釈します.各コマンドは独立したスレッドで実行されます(コマンドモード).トリップメカニズム:あるサービスのエラー率が一定のしきい値を超えた場合、Hystrixは自動または手動でトリップし、そのサービスへのアクセスを停止することができる.リソース分離:Hystrixは、従来から小さなスレッドプールを維持してきました.スレッドプールが満たされている場合、キュー待ちではなく依存リクエストが拒否されます.失敗の判定を加速させる.モニタリング:Hystrixは、実行指標と構成の変化をリアルタイムでモニタリングできます.ロールバックメカニズム:要求が失敗し、タイムアウトし、拒否された場合、または遮断器が開かれたときにロールバックを実行するロジックであり、ロールバックのロジックは自分で提供することができる.自己修復:遮断器がしばらく開くと、自動的に半開状態になります.
Hystrix入門


    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix



public class OrderHystrixCommand extends HystrixCommand> {

    private String userId;

    private RestTemplate restTemplate;

    public OrderHystrixCommand(String commandGroupKey, RestTemplate restTemplate, String userId) {
        super(HystrixCommandGroupKey.Factory.asKey(commandGroupKey));
        this.restTemplate = restTemplate;
        this.userId = userId;
    }

    @Override
    protected List run() throws Exception {
        ResponseEntity responseEntity  =  restTemplate.getForEntity("http://MS-PROVIDER-ORDER/order/queryOrderByUserId/"+userId, List.class);
        List orderVoList = responseEntity.getBody();
        return orderVoList;
    }

    @Override
    protected List getFallback() {
        OrderVo orderVo = new OrderVo();
        orderVo.setOrderId(-1);
        orderVo.setUserId(-1);
        orderVo.setOrderMoney(new BigDecimal(0));

        List orderVos = new ArrayList<>();
        orderVos.add(orderVo);
        return orderVos;
    }
}



OrderHystrixCommand ohc =  new OrderHystrixCommand("orderGroupKey", restTemplate, userId);
List orderVoList = ohc.execute();

備考:Hystrixのサービス劣化について初歩的な理解を得るために、いくつかの簡単なテストを行うことができます.
ダウンタイムトリップ:MS-PROVIDER-ORDERサービスプロバイダを閉じて、どのような結果が出るかを試して、私たちのgetFallbackメソッドを呼び出すことができますか?
タイムアウトブレーキ:サービスプロバイダの呼び出された方法でスレッド睡眠時間を設定するとともに、ribbonパラメータを使用してサービス消費者のタイムアウトをタイムアウトし、タイムアウト時間を睡眠時間より小さくし、どのような結果が出るかを試してみます.
例外トリップ:存在しない受注シミュレーションをクエリーして例外を放出し、どのような結果が出るかを確認します.
タイムアウトブレーキ時の一般的な構成
#         
ribbon.ReadTimeout=1000
ribbon.ConnectTimeout=1000

#        ,        
ribbon.MaxAutoRetries=1
#         
ribbon.MaxAutoRetriesNextServer=1

#           (all          ,true      ,false get  )
#   True          
ribbon.OkToRetryOnAllOperations=true

#      (      )
spring.cloud.loadbalancer.retry.enabled=true

#    
       .ribbon.ConnectTimeout=1000
       .ribbon.ReadTimeout=1000
       .ribbon.OkToRetryOnAllOperations=true
       .ribbon.MaxAutoRetriesNextServer=1
       .ribbon.MaxAutoRetries=1

@HystrixCommandによるサービスダウングレード
fallbackMethodメソッドは、プライマリメソッドと同じパラメータが必要です.そうしないと、エラーが発生します.一般に、呼び出し頻度の高いインタフェース構成サービスのみがダウングレードされます.@HystrixCommandはHystrixCommandを継承するより便利ですが、実際にはあまり使われていません.構成が多すぎるとメンテナンスが難しいという問題があります.
@HystrixCommand(fallbackMethod="queryOrderFallBack")
@RequestMapping("testFallback/{userId}")
public EmployeeInfo testHystrixFallback(@PathVariable("userId") String userId){
    Employee employee = employeeService.findEmployeeById(userId);

    ResponseEntity responseEntity;
    responseEntity = restTemplate.getForEntity("http://MS-PROVIDER-ORDER/order/queryOrderbyUserId/" + userId, List.class);

    List orderVoList = responseEntity.getBody();

    EmployeeInfo employeeInfo = new EmployeeInfo();
    employeeInfo.setEmployeeName(employee.getName());
    employeeInfo.setOrderVoList(orderVoList);
    return employeeInfo;
}

protected EmployeeInfo queryOrderFallBack(String userId) {
    EmployeeInfo employeeInfo = new EmployeeInfo();
    employeeInfo.setEmployeeName("FallBack");
    employeeInfo.setOrderVoList(null);
    return employeeInfo;
}

Hystrix統合Feign


     org.springframework.cloud
     spring-cloud-starter-netflix-hystrix



    org.springframework.cloud
    spring-cloud-starter-openfeign



#  feign hystrix   ,      。
feign.hystrix.enabled=true



@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class HystrixProvider8006Application {

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


@FeignClient(name = "ms-provider-order", fallback = CustomFeignOrderApiFallBack.class, path = "/order")
public interface CustomFeignOrderApi {
    @RequestMapping("/queryOrdersByUserId/{userId}")
    List queryOrdersByUserId(@PathVariable("userId") String userId);

    @RequestMapping("/getRegisterInfo")
    String getRegisterInfo();
}

@Component
public class CustomFeignOrderApiFallBack implements MsCustomFeignOrderApi {
    @Override
    public List queryOrdersByUserId(String userId) {
        List orderVoList = new ArrayList<>();
        OrderVo orderVo = new OrderVo();
        orderVo.setUserId(userId);
        orderVo.setOrderId(-1);

        orderVoList.add(orderVo);
        return orderVoList;
    }

    @Override
    public String getRegisterInfo() {
        return "    ";
    }
}

備考:一緒に実験してもいいです.
 
Hystrixの一般的な構成
1.   Hystrix feign   
    :feign.hystrix.enabled=false(      )
    :
      ,        FeignBulider  :
public class CustomeFeignApiWithoutHystrixConfg {
    @Scope("prototype")
    @Bean
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}

 FeignClient      
@FeignClient(name = "MS-PROVIDER-ORDER",configuration = MsCustomeFeignApiWithoutHystrixConfg.class, path = "/order")

2.     
    :hystrix.command.default.circuitBreaker.enabled=false
    :hystrix.command..circuitBreaker.enabled: false
           HystrixCommandKey    ,       hystrix.stream      ,   Hystrix Dashboard   。

3.     
    :hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 1000
    :hystrix.command..execution.isolation.thread.timeoutInMilliseconds: 1000

4.     
    :hystrix.command.default.execution.timeout.enabled: false
    :hystrix.command..execution.timeout.enabled: false