Spring Cloud Feign / Ribbon与企业代理

时间:2017-05-09 06:28:34

标签: spring-boot proxy netflix netflix-feign netflix-ribbon

我想在公司代理后面使用来自外部世界的REST服务进行身份验证。

如何配置Spring Boot + Spring Cloud Feign / Ribbon以使用我们的代理?

3 个答案:

答案 0 :(得分:5)

我相信你正在寻找这样的东西:

import feign.Feign;
import okhttp3.OkHttpClient;
import java.net.InetSocketAddress;
import java.net.Proxy;
...
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy-url", 1234));
OkHttpClient okHttpClient = new OkHttpClient.Builder().proxy(proxy).build();
Feign.builder()
    .client(new feign.okhttp.OkHttpClient(okHttpClient))
    .target(...);

您只需要在项目中另外添加compile 'io.github.openfeign:feign-okhttp:9.5.0'

target子句包含您定义的接口。进一步参考:https://github.com/OpenFeign/feign

答案 1 :(得分:1)

事实证明,实际上有一个更简单的解决方案。

以下信息将对您有所帮助(对于更高级的用例):

OpenFeign客户端可以与多个HTTP客户端一起运行。 默认情况下,它使用java.net.URLConnection,但是您也可以使用ApacheHttpClientOkHttpClient

使用Apache Http客户端

这是您可以使用ApacheHttpClient设置代理的方法:

  1. 在pom.xml中添加以下两个依赖项:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Dependency to switch HttpClient implementation from java.net.URLConnection to Apache HTTP Client -->
<!-- See also: FeignAutoConfiguration for details. -->
<!-- See also: https://cloud.spring.io/spring-cloud-commons/reference/html/#http-clients -->
<!-- See also: https://cloud.spring.io/spring-cloud-openfeign/reference/html/#spring-cloud-feign-overriding-defaults -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-httpclient</artifactId>
</dependency>

在您的应用中公开以下bean:

// see: https://cloud.spring.io/spring-cloud-commons/reference/html/#http-clients
@Bean
public HttpClientBuilder proxiedHttpClient() {
  String proxyHost   = "client-envoy";
  Integer proxyPort  = 80
  String proxyScheme = "http";

  return HttpClientBuilder.create()
                          .setProxy(new HttpHost(proxyHost, proxyPort, proxyScheme));
}

就这样-application.yaml不需要配置其他任何内容,因为ApacheHttpClient如果在类路径上,则默认使用。

使用Ok Http客户端

要使用OkHttpClient设置代理,您可以执行类似的操作:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>

在您的application.yml中,请确保启用OkHttpClient并禁用ApacheHttpClient:

spring:
 cloud:
   httpclientfactories:
     ok:
       enabled: true
     apache:
       enabled: false

feign:
 okhttp:
   enabled: true
 httpclient:
   enabled: false

公开HttpClientBuilder类型的bean而不是OkHttpClient.Builder

答案 2 :(得分:0)

Spring cloud feign 支持三种底层实现:

  1. 默认
  2. Apache HttpClient
  3. OkHttpClient

如果使用默认值:

创建这个 spring bean(比如通过使用 @Configuration 注释定义内部类),不需要在应用程序属性/yml 中进行更改:

  @Bean
  public Client feignClient() {
    return new Client.Proxied(
        null, null, new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)));
  }

如果使用 Apache HttpClient:

<块引用>

这意味着您的 feign.httpclient.enabled: trueapplication.yml 中有 pom.xml 及以下:

build.gradle

创建这个 spring bean(比如通过使用 pom.xml <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency> build.gradle implementation 'io.github.openfeign:feign-httpclient' 注释定义内部类):

@Configuration

如果使用 OkHttpClient:

<块引用>

这意味着您的 @Bean public CloseableHttpClient feignClient() { return HttpClientBuilder.create().setProxy(new HttpHost(proxyHost, proxyPort)).build(); } feign.okhttp.enabled: true 中有 application.yml 及以下:

pom.xml

创建这个 spring bean(比如通过使用 build.gradle 注释定义内部类):

pom.xml
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>

build.gradle
implementation 'io.github.openfeign:feign-okhttp'