11package feign .ribbon ;
22
33import com .netflix .client .ClientException ;
4- import com .netflix .client .ClientFactory ;
54import com .netflix .client .config .CommonClientConfigKey ;
65import com .netflix .client .config .DefaultClientConfigImpl ;
7- import com .netflix .client .config .IClientConfig ;
8- import com .netflix .loadbalancer .ILoadBalancer ;
96
107import java .io .IOException ;
118import java .net .URI ;
2017import feign .Response ;
2118
2219/**
23- * RibbonClient can be used in Fiegn builder to activate smart routing and resiliency capabilities
20+ * RibbonClient can be used in Feign builder to activate smart routing and resiliency capabilities
2421 * provided by Ribbon. Ex.
22+ *
2523 * <pre>
26- * MyService api = Feign.builder.client(new RibbonClient()).target(MyService.class,
27- * " http://myAppProd" );
24+ * MyService api = Feign.builder.client(RibbonClient.create ()).target(MyService.class,
25+ * " http://myAppProd" );
2826 * </pre>
27+ *
2928 * Where {@code myAppProd} is the ribbon client name and {@code myAppProd.ribbon.listOfServers}
3029 * configuration is set.
3130 */
3231public class RibbonClient implements Client {
3332
3433 private final Client delegate ;
34+ private final LBClientFactory lbClientFactory ;
3535
36+
37+ public static RibbonClient create () {
38+ return builder ().build ();
39+ }
40+
41+ public static Builder builder () {
42+ return new Builder ();
43+ }
44+
45+ /**
46+ * @deprecated Use the {@link RibbonClient#create()}
47+ */
48+ @ Deprecated
3649 public RibbonClient () {
37- this . delegate = new Client .Default (
50+ this ( new Client .Default (
3851 new Lazy <SSLSocketFactory >() {
3952 public SSLSocketFactory get () {
4053 return (SSLSocketFactory ) SSLSocketFactory .getDefault ();
@@ -45,11 +58,20 @@ public HostnameVerifier get() {
4558 return HttpsURLConnection .getDefaultHostnameVerifier ();
4659 }
4760 }
48- );
61+ )) ;
4962 }
5063
64+ /**
65+ * @deprecated Use the {@link RibbonClient#create()}
66+ */
67+ @ Deprecated
5168 public RibbonClient (Client delegate ) {
69+ this (delegate , new LBClientFactory .Default ());
70+ }
71+
72+ RibbonClient (Client delegate , LBClientFactory lbClientFactory ) {
5273 this .delegate = delegate ;
74+ this .lbClientFactory = lbClientFactory ;
5375 }
5476
5577 @ Override
@@ -58,7 +80,8 @@ public Response execute(Request request, Request.Options options) throws IOExcep
5880 URI asUri = URI .create (request .url ());
5981 String clientName = asUri .getHost ();
6082 URI uriWithoutHost = URI .create (request .url ().replace (asUri .getHost (), "" ));
61- LBClient .RibbonRequest ribbonRequest = new LBClient .RibbonRequest (request , uriWithoutHost );
83+ LBClient .RibbonRequest ribbonRequest =
84+ new LBClient .RibbonRequest (delegate , request , uriWithoutHost );
6285 return lbClient (clientName ).executeWithLoadBalancer (ribbonRequest ,
6386 new FeignOptionsClientConfig (options )).toResponse ();
6487 } catch (ClientException e ) {
@@ -70,9 +93,7 @@ public Response execute(Request request, Request.Options options) throws IOExcep
7093 }
7194
7295 private LBClient lbClient (String clientName ) {
73- IClientConfig config = ClientFactory .getNamedConfig (clientName );
74- ILoadBalancer lb = ClientFactory .getNamedLoadBalancer (clientName );
75- return new LBClient (delegate , lb , config );
96+ return lbClientFactory .create (clientName );
7697 }
7798
7899 static class FeignOptionsClientConfig extends DefaultClientConfigImpl {
@@ -94,4 +115,40 @@ public void loadDefaultValues() {
94115
95116 }
96117
118+ public static final class Builder {
119+
120+ Builder () {
121+ }
122+
123+ private Client delegate ;
124+ private LBClientFactory lbClientFactory ;
125+
126+ public Builder delegate (Client delegate ) {
127+ this .delegate = delegate ;
128+ return this ;
129+ }
130+
131+ public Builder lbClientFactory (LBClientFactory lbClientFactory ) {
132+ this .lbClientFactory = lbClientFactory ;
133+ return this ;
134+ }
135+
136+ public RibbonClient build () {
137+ return new RibbonClient (
138+ delegate != null ? delegate : new Client .Default (
139+ new Lazy <SSLSocketFactory >() {
140+ public SSLSocketFactory get () {
141+ return (SSLSocketFactory ) SSLSocketFactory .getDefault ();
142+ }
143+ },
144+ new Lazy <HostnameVerifier >() {
145+ public HostnameVerifier get () {
146+ return HttpsURLConnection .getDefaultHostnameVerifier ();
147+ }
148+ }
149+ ),
150+ lbClientFactory != null ? lbClientFactory : new LBClientFactory .Default ()
151+ );
152+ }
153+ }
97154}
0 commit comments