前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Feigh with Proxy

Feigh with Proxy

作者头像
十毛
发布2021-05-11 10:41:20
1.6K0
发布2021-05-11 10:41:20
举报
文章被收录于专栏:用户1337634的专栏

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

jar包引入

主要是要引入feign-okhttp

代码语言:javascript
复制
<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
代码语言:javascript
复制
@FeignClient(value = "baidu", path = "/")
public interface BaiduApi {
    @GetMapping("/index.html")
    String index();
}
  • 启动程序: ProxyApplication
代码语言:javascript
复制
@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())));
代码语言:javascript
复制
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
代码语言:javascript
复制
@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
代码语言:javascript
复制
@Data
@ConfigurationProperties(
        prefix = "feign.httpclient.proxy"
)
public class HttpClientProperties {
    private String host;
    private int port;
}
  • 配置文件application.yml
代码语言:javascript
复制
# 不依赖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

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • jar包引入
  • 实现文件
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档