2020import com .netflix .client .ClientRequest ;
2121import com .netflix .client .IResponse ;
2222import com .netflix .client .RequestSpecificRetryHandler ;
23- import com .netflix .client .RetryHandler ;
2423import com .netflix .client .config .CommonClientConfigKey ;
2524import com .netflix .client .config .IClientConfig ;
2625import com .netflix .loadbalancer .ILoadBalancer ;
2928import java .net .URI ;
3029import java .util .Arrays ;
3130import java .util .Collection ;
31+ import java .util .Collections ;
3232import java .util .LinkedHashMap ;
33+ import java .util .LinkedHashSet ;
3334import java .util .Map ;
35+ import java .util .Set ;
3436
3537import feign .Client ;
3638import feign .Request ;
37- import feign .RequestTemplate ;
3839import feign .Response ;
3940import feign .Util ;
4041
@@ -44,21 +45,34 @@ public final class LBClient extends
4445 private final int connectTimeout ;
4546 private final int readTimeout ;
4647 private final IClientConfig clientConfig ;
48+ private final Set <Integer > retryableStatusCodes ;
4749
4850 public static LBClient create (ILoadBalancer lb , IClientConfig clientConfig ) {
4951 return new LBClient (lb , clientConfig );
5052 }
5153
54+ static Set <Integer > parseStatusCodes (String statusCodesString ) {
55+ if (statusCodesString == null || statusCodesString .isEmpty ()) {
56+ return Collections .emptySet ();
57+ }
58+ Set <Integer > codes = new LinkedHashSet <Integer >();
59+ for (String codeString : statusCodesString .split ("," )) {
60+ codes .add (Integer .parseInt (codeString ));
61+ }
62+ return codes ;
63+ }
64+
5265 LBClient (ILoadBalancer lb , IClientConfig clientConfig ) {
5366 super (lb , clientConfig );
5467 this .clientConfig = clientConfig ;
5568 connectTimeout = clientConfig .get (CommonClientConfigKey .ConnectTimeout );
5669 readTimeout = clientConfig .get (CommonClientConfigKey .ReadTimeout );
70+ retryableStatusCodes = parseStatusCodes (clientConfig .get (LBClientFactory .RetryableStatusCodes ));
5771 }
5872
5973 @ Override
6074 public RibbonResponse execute (RibbonRequest request , IClientConfig configOverride )
61- throws IOException {
75+ throws IOException , ClientException {
6276 Request .Options options ;
6377 if (configOverride != null ) {
6478 options =
@@ -69,6 +83,10 @@ public RibbonResponse execute(RibbonRequest request, IClientConfig configOverrid
6983 options = new Request .Options (connectTimeout , readTimeout );
7084 }
7185 Response response = request .client ().execute (request .toRequest (), options );
86+ if (retryableStatusCodes .contains (response .status ())) {
87+ response .close ();
88+ throw new ClientException (ClientException .ErrorType .SERVER_THROTTLED );
89+ }
7290 return new RibbonResponse (request .getUri (), response );
7391 }
7492
0 commit comments