Spencer Gibb
10 years ago
6 changed files with 95 additions and 134 deletions
@ -1,115 +0,0 @@
@@ -1,115 +0,0 @@
|
||||
/* |
||||
* Copyright 2013-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.cloud.netflix.feign.ribbon; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
|
||||
import javax.net.ssl.HostnameVerifier; |
||||
import javax.net.ssl.HttpsURLConnection; |
||||
import javax.net.ssl.SSLSocketFactory; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import org.springframework.cloud.netflix.feign.ribbon.RibbonLoadBalancer.RibbonRequest; |
||||
import org.springframework.cloud.netflix.ribbon.SpringClientFactory; |
||||
import org.springframework.util.ReflectionUtils; |
||||
|
||||
import com.netflix.client.ClientException; |
||||
import com.netflix.client.config.IClientConfig; |
||||
import com.netflix.loadbalancer.ILoadBalancer; |
||||
|
||||
import dagger.Lazy; |
||||
import feign.Client; |
||||
import feign.Request; |
||||
import feign.Response; |
||||
|
||||
/** |
||||
* @author Julien Roy |
||||
* @author Spencer Gibb |
||||
*/ |
||||
public class FeignRibbonClient implements Client { |
||||
|
||||
private Client defaultClient = new Default(new LazySSLSocketFactory(), |
||||
new LazyHostnameVerifier()); |
||||
|
||||
private SpringClientFactory factory; |
||||
|
||||
public FeignRibbonClient(SpringClientFactory factory) { |
||||
this.factory = factory; |
||||
} |
||||
|
||||
@Override |
||||
public Response execute(Request request, Request.Options options) throws IOException { |
||||
try { |
||||
URI asUri = URI.create(request.url()); |
||||
String clientName = asUri.getHost(); |
||||
URI uriWithoutSchemeAndPort = URI.create(request.url().replace( |
||||
asUri.getScheme() + "://" + asUri.getHost(), |
||||
asUri.getScheme() + "://")); |
||||
RibbonLoadBalancer.RibbonRequest ribbonRequest = new RibbonRequest(request, |
||||
uriWithoutSchemeAndPort); |
||||
LBClient client = getClient(clientName); |
||||
return client.getLoadBalancer() |
||||
.executeWithLoadBalancer(ribbonRequest, client.config).toResponse(); |
||||
} |
||||
catch (ClientException ex) { |
||||
if (ex.getCause() instanceof IOException) { |
||||
throw IOException.class.cast(ex.getCause()); |
||||
} |
||||
ReflectionUtils.rethrowRuntimeException(ex); |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
@Data |
||||
private class LBClient { |
||||
private final IClientConfig config; |
||||
private final RibbonLoadBalancer loadBalancer; |
||||
} |
||||
|
||||
private LBClient getClient(String clientName) { |
||||
IClientConfig config = this.factory.getClientConfig(clientName); |
||||
ILoadBalancer lb = this.factory.getLoadBalancer(clientName); |
||||
RibbonLoadBalancer loadBalancer = new RibbonLoadBalancer(this.defaultClient, lb, |
||||
config); |
||||
return new LBClient(config, loadBalancer); |
||||
} |
||||
|
||||
public void setDefaultClient(Client defaultClient) { |
||||
this.defaultClient = defaultClient; |
||||
} |
||||
|
||||
private static class LazySSLSocketFactory implements Lazy<SSLSocketFactory> { |
||||
|
||||
@Override |
||||
public SSLSocketFactory get() { |
||||
return (SSLSocketFactory) SSLSocketFactory.getDefault(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private static class LazyHostnameVerifier implements Lazy<HostnameVerifier> { |
||||
|
||||
@Override |
||||
public HostnameVerifier get() { |
||||
return HttpsURLConnection.getDefaultHostnameVerifier(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
/* |
||||
* Copyright 2013-2015 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.cloud.netflix.feign.ribbon; |
||||
|
||||
import com.netflix.client.config.IClientConfig; |
||||
import com.netflix.loadbalancer.ILoadBalancer; |
||||
import feign.ribbon.LBClient; |
||||
import feign.ribbon.LBClientFactory; |
||||
import org.springframework.cloud.netflix.ribbon.SpringClientFactory; |
||||
|
||||
/** |
||||
* @author Spencer Gibb |
||||
*/ |
||||
public class SpringLBClientFactory implements LBClientFactory { |
||||
|
||||
private final SpringClientFactory factory; |
||||
|
||||
public SpringLBClientFactory(SpringClientFactory factory) { |
||||
this.factory = factory; |
||||
} |
||||
|
||||
@Override |
||||
public LBClient create(String clientName) { |
||||
IClientConfig config = factory.getClientConfig(clientName); |
||||
ILoadBalancer lb = factory.getLoadBalancer(clientName); |
||||
return LBClient.create(lb, config); |
||||
} |
||||
} |
Loading…
Reference in new issue