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>
实现文件
- Feign Client接口:
BaiduApi
@FeignClient(value = "baidu", path = "/")
public interface BaiduApi {
@GetMapping("/index.html")
String index();
}
- 启动程序:
ProxyApplication
@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);
}
}
- 有代理能力的http客户端:
ProxyOkHttpClientFactory
这里是重点:扩展DefaultOkHttpClientFactory,实现了OkHttpClient的代理能力
主要是这一行代码:builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(httpClientProperties.getHost(), httpClientProperties.getPort())));
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;
}
}
- 加载自定义
ProxyOkHttpClientFactory
@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);
}
}
}
- 配置类
HttpClientProperties
@Data
@ConfigurationProperties(
prefix = "feign.httpclient.proxy"
)
public class HttpClientProperties {
private String host;
private int port;
}
- 配置文件
application.yml
# 不依赖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