public TableServiceClient getTableServiceClient() {
    validateTableServiceConfigs(azureCloudConfig);
    ProxyOptions proxyOptions = null;
    if (cloudConfig.vcrProxyHost != null && !cloudConfig.vcrProxyHost.isEmpty()) {
      logger.info("Using vcrProxyHost:vcrProxyPort {}:{}", cloudConfig.vcrProxyHost, cloudConfig.vcrProxyPort);
      proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP,
          new InetSocketAddress(cloudConfig.vcrProxyHost, cloudConfig.vcrProxyPort));
    } else {
      logger.info("No vcrProxyHost provided");
    }
    HttpClient client = new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build();
    RetryOptions retryOptions;
    switch (azureCloudConfig.azureRetryPolicy) {
      case FIXED:
        retryOptions =
            new RetryOptions(new FixedDelayOptions(azureCloudConfig.azureMaxTries,
                Duration.ofSeconds(azureCloudConfig.azureRetryDelayInSec)));
        break;
      case EXPONENTIAL:
        ExponentialBackoffOptions exponentialBackoffOptions = new ExponentialBackoffOptions();
        exponentialBackoffOptions.setBaseDelay(Duration.ofSeconds(azureCloudConfig.azureMaxRetryDelayInSec));
        exponentialBackoffOptions.setMaxDelay(Duration.ofSeconds(azureCloudConfig.azureMaxRetryDelayInSec));
        exponentialBackoffOptions.setMaxRetries(azureCloudConfig.azureMaxTries);
        retryOptions = new RetryOptions(exponentialBackoffOptions);
        break;
      default:
        throw new RuntimeException(String.format("Invalid azureRetryPolicy %s", azureCloudConfig.azureRetryPolicy));
    }
    return buildTableServiceClient(client, new ConfigurationBuilder().build(), retryOptions, azureCloudConfig);
  }
Create the {@link BlobServiceAsyncClient} object.
@return {@link BlobServiceAsyncClient} object.
ambry-cloud/src/main/java/com/github/ambry/cloud/azure/StorageClient.java