Feigh with Proxy

2021-05-09  本文已影响0人  十毛tenmao

服务部署或者开发时,有时候需要通过代理才可以访问到特定的服务,但是feign本身是没有代理设置,本文通过扩展OkHttpClient实现代理

jar包引入

主要是要引入feign-okhttp

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.10.1</version>
</dependency>
<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-core</artifactId>
    <version>0.7.6</version>
</dependency>

实现文件

@FeignClient(value = "baidu", path = "/")
public interface BaiduApi {
    @GetMapping("/index.html")
    String index();
}
@EnableFeignClients
@SpringBootApplication
public class ProxyApplication implements CommandLineRunner {
    @Resource
    private BaiduApi baiduApi;

    public static void main(String[] args) {
        SpringApplication.run(ProxyApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        String ping = baiduApi.ping();
        System.out.println(ping);
    }
}
import okhttp3.OkHttpClient.Builder;
import org.springframework.cloud.commons.httpclient.DefaultOkHttpClientFactory;

import java.net.InetSocketAddress;
import java.net.Proxy;

public class ProxyOkHttpClientFactory extends DefaultOkHttpClientFactory {

    private HttpClientProperties httpClientProperties;

    public ProxyOkHttpClientFactory(Builder builder, HttpClientProperties httpClientProperties) {
        super(builder);
        this.httpClientProperties = httpClientProperties;
    }

    @Override
    public Builder createBuilder(boolean disableSslValidation) {
        Builder builder = super.createBuilder(disableSslValidation);
        # 配置代理信息
        builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(httpClientProperties.getHost(), httpClientProperties.getPort())));
        return builder;
    }
}
@Configuration
@EnableConfigurationProperties(HttpClientProperties.class)
public class HttpClientConfiguration {

    @Configuration
    @ConditionalOnProperty(name = "httpclientfactories.ok.enabled", matchIfMissing = true)
    @ConditionalOnClass(OkHttpClient.class)
    static class OkHttpClientConfiguration {

        @Bean
        @ConditionalOnMissingBean
        public OkHttpClientFactory okHttpClientFactory(Builder builder, HttpClientProperties okHttpClientProperties) {
            return new ProxyOkHttpClientFactory(builder, okHttpClientProperties);
        }
    }
}
@Data
@ConfigurationProperties(
        prefix = "feign.httpclient.proxy"
)
public class HttpClientProperties {
    private String host;
    private int port;
}
# 不依赖eureka
eureka:
  client:
    enabled: false
# feign client使用okhttp
feign:
  okhttp:
    enabled: true
  httpclient:
    proxy:
      host: 127.0.0.1
      port: 8899
# 配置feign client for baidu
baidu:
  ribbon:
    listOfServers: http://www.baidu.com

参考

上一篇 下一篇

猜你喜欢

热点阅读