┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────┐ ┌───────────────────────────────────┐ ┌─────────────────────────────────┐ │LoadBalancedRetryFactory │ ┌─────────────────────────────────────────────────────────────────────────────┐ │ServiceInstanceChooser │ │LoadBalancerRequest │ │LoadBalancedRetryContext │ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │LoadBalancerRequestTransformer │ ├───────────────────────────────────────────┤ ├───────────────────────────────────┤ ├─────────────────────────────────┤ │+ LoadBalancedRetryPolicy createRetryPolicy(String service, ServiceInstanceChooser serviceInstanceChooser)│ ├─────────────────────────────────────────────────────────────────────────────┤ │+ ServiceInstance choose(String serviceId);│ │+ T apply(ServiceInstance instance)│ │- HttpRequest request; │ │+ RetryListener[] createRetryListeners(String service) │ │+ HttpRequest transformRequest(HttpRequest request, ServiceInstance instance)│ └───────────────────────────────────────────┘ └───────────────────────────────────┘ │- ServiceInstance serviceInstance│ │+ BackOffPolicy createBackOffPolicy(String service) │ └─────────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────┘ └──────────────────────────────────────────────────────────────────────────────────────────────────────────┘ | | ┌───────────────────────────────────────────────────────────────────────────────┐ ┌───────────────────────────────────────────────────────────────────────────────────────────────────┐ │LoadBalancedRetryPolicy │ │LoadBalancerClient │ ├───────────────────────────────────────────────────────────────────────────────┤ ├───────────────────────────────────────────────────────────────────────────────────────────────────┤ │+ boolean canRetrySameServer(LoadBalancedRetryContext context) │ │+ T execute(String serviceId, LoadBalancerRequest request); │ │+ boolean canRetryNextServer(LoadBalancedRetryContext context) │ │+ T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest request);│ │+ void close(LoadBalancedRetryContext context) │ │+ URI reconstructURI(ServiceInstance instance, URI original); │ │+ void registerThrowable(LoadBalancedRetryContext context, Throwable throwable)│ └───────────────────────────────────────────────────────────────────────────────────────────────────┘ │+ boolean retryableStatusCode(int statusCode) │ └───────────────────────────────────────────────────────────────────────────────┘