class HystrixMethodHandler extends MicroserviceMethodHandler {

   @Override
   public Object invoke(final Method method, final Object... args) throws Exception {
      String serviceName = getProxyBean().getMicroserviceName();
      String methodName = method.getName();

      MethodConfig methodConfig = serviceConfig.getMethodConfig(method);
      if (methodConfig == null) {
         methodConfig = serviceConfig.getDefaultConfig();
      }

      // call the method without using Hystrix if it is not microservice method or no Hystrix annotation has been found
      if (method.getDeclaringClass() == Object.class || methodConfig == null || !methodConfig.isHystrixActive()) {
         return methodHandler.invoke(method, args);
      }

      Setter setter = methodConfig.getHystrixCommandSetter();

      String cacheKey = createCacheKey(serviceName, methodName, methodConfig, args);

      Callable<Object> fallback = fallbackService != null ? () -> method.invoke(fallbackService, args) : null;

      HystrixCommand<Object> hystrixCommand = new Builder<>(setter, () -> methodHandler.invoke(method, args))
            .cacheKey(cacheKey)
            .fallback(fallback)
            .ignoredExceptions(methodConfig.getIgnoredExceptions())
            .build();

      try {
         return hystrixCommand.execute();
      } catch (HystrixBadRequestException ex) {
         throw unwrapException(ex);
      }
   }

   public  HystrixMethodHandler(final MicroserviceMethodHandler methodHandler);
     HystrixMethodHandler(final MicroserviceMethodHandler methodHandler, final ServiceConfig serviceConfig);

}