场景:
如果在你的服务(程序)请求第三方接口时,有权限问题,这个时候我们可以通过代理的方式请求到代理机(有权限访问第三方),由代理机器访问第三方服务器。
软件:
jdk1.8+feign(okhttp)+cow(代理软件)
feign版本:3.5.0
okhttp版本用的10.0
简单介绍下cow,cow是一个可以通过设置白名单来请求代理机器的,意思就是在这个白名单内的第三方域名才经过代理机。
留下cow相关资料:https://github.com/cyfdecyf/cow
cow 文件配置
1:rc文件
listen = http://127.0.0.1:7777
logFile = ./log.txt
estimateTarget = *
proxy = 代理机器IP
2: blocked文件,在此文件中的路径会经代理,比如
www.baidu.com
3:feign代码
@FeignClient(value = "feignClient", configuration = FeignClient.Configuration.class, fallbackFactory = FeignClientFallbackFactory.class) public interface FeignClient { @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}) Object notifyPayStatus(URI uri, Map<String, ?> params); class Configuration { @Bean @Primary public OkHttpClientFactory okHttpClientFactory(OkHttpClient.Builder builder, ProxyConfig proxyConfig) { String proxyIp = proxyConfig.getProxyIp(); Integer port = proxyConfig.getProxyPort(); builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, port))); return new ProxyOkHttpClientFactory(builder); } @Bean Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) { return new SpringFormEncoder(new SpringEncoder(converters)); } @Bean Client client(OkHttpClientFactory factory) { OkHttpClient.Builder builder = factory.createBuilder(false); return new feign.okhttp.OkHttpClient(builder.build()); //return new Client.Default(null, null); } } }
@Slf4j public class ProxyOkHttpClientFactory extends DefaultOkHttpClientFactory { public ProxyOkHttpClientFactory(OkHttpClient.Builder builder) { super(builder); } // Constructor, imports and foo omitted for better readability @Override public OkHttpClient.Builder createBuilder(boolean disableSslValidation) { OkHttpClient.Builder builder = super.createBuilder(false); builder.connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .retryOnConnectionFailure(false); return builder; } }