微服系列之Feign使用HttpClient和OkHttp网络请求框架

Feign实现了远程调用,底层默认使用的是HttpURLConnection网络请求框架

那Feign支不支持其他的网络请求框架呢,答案那是肯定的,Feign还支持HttpClient和OkHttp,

那Feign中怎么将请求框架切换到另外两种呢,首先我们先查看一下Feign配置类


@ConditionalOnClass({ILoadBalancer.class, Feign.class})
@Configuration
@AutoConfigureBefore({FeignAutoConfiguration.class})
public class FeignRibbonClientAutoConfiguration {
    public FeignRibbonClientAutoConfiguration() {
    }

    @Bean
    @Primary
    @ConditionalOnMissingClass({"org.springframework.retry.support.RetryTemplate"})
    public CachingSpringLoadBalancerFactory cachingLBClientFactory(SpringClientFactory factory) {
        return new CachingSpringLoadBalancerFactory(factory);
    }

    @Bean
    @Primary
    @ConditionalOnClass(
        name = {"org.springframework.retry.support.RetryTemplate"}
    )
    public CachingSpringLoadBalancerFactory retryabeCachingLBClientFactory(SpringClientFactory factory, LoadBalancedRetryPolicyFactory retryPolicyFactory) {
        return new CachingSpringLoadBalancerFactory(factory, retryPolicyFactory, true);
    }

    @Bean
    @ConditionalOnMissingBean
    public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) {
        return new LoadBalancerFeignClient(new Default((SSLSocketFactory)null, (HostnameVerifier)null), cachingFactory, clientFactory);
    }

    @Bean
    @ConditionalOnMissingBean
    public Options feignRequestOptions() {
        return LoadBalancerFeignClient.DEFAULT_OPTIONS;
    }

    @Configuration
    @ConditionalOnClass({OkHttpClient.class})
    @ConditionalOnProperty(
        value = {"feign.okhttp.enabled"},
        matchIfMissing = true
    )
    protected static class OkHttpFeignLoadBalancedConfiguration {
        @Autowired(
            required = false
        )
        private okhttp3.OkHttpClient okHttpClient;

        protected OkHttpFeignLoadBalancedConfiguration() {
        }

        @Bean
        @ConditionalOnMissingBean({Client.class})
        public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) {
            OkHttpClient delegate;
            if (this.okHttpClient != null) {
                delegate = new OkHttpClient(this.okHttpClient);
            } else {
                delegate = new OkHttpClient();
            }

            return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
        }
    }

    @Configuration
    @ConditionalOnClass({ApacheHttpClient.class})
    @ConditionalOnProperty(
        value = {"feign.httpclient.enabled"},
        matchIfMissing = true
    )
    protected static class HttpClientFeignLoadBalancedConfiguration {
        @Autowired(
            required = false
        )
        private HttpClient httpClient;

        protected HttpClientFeignLoadBalancedConfiguration() {
        }

        @Bean
        @ConditionalOnMissingBean({Client.class})
        public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) {
            ApacheHttpClient delegate;
            if (this.httpClient != null) {
                delegate = new ApacheHttpClient(this.httpClient);
            } else {
                delegate = new ApacheHttpClient();
            }

            return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
        }
    }
}

我们着重看一下方法名为:HttpClientFeignLoadBalancedConfiguration,从代码上来看@ConditionalOnClass({ApacheHttpClient.class})这个注解可以知道,只需要在pom文件中加上HttpClient的ClassPath即可,另外需要在配置文件application.yml或application.properties中配置上feign.httpclinet.enabled=true即可,从注解@ConditionalOnProperty注解可知,这个配置可以不写,因为在默认的情况下就是true,接下来实现:

在工程pom文件中添加feign-httpclient的依赖,Feign就会采用HttpClient作为网络请求框架,而不是默认的HttpURLConnection,依赖如下:

<dependency> 
        <groupId>com.netflix.feign</groupId> 
        <artifactid>feign-httpclient</artifactid> 
        <version>RELEASE</version> 
</dependency> 

同理,如果想使用Okhttp作为网络请求框架,只需要在pom中添加feign-okhttp的依赖即可,依赖如下:

<dependency> 
        <groupid>com.netflix.feign</groupid> 
        <artifactid>feign-okhttp</artifactid> 
        <version>RELEASE</version> 
</dependency> 


                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在选择feign中的httpclientokhttp之间,首先需要考虑的是使用场景和需要达到的目标。 如果你需要一个轻量级的、简单易用的Http客户端,那么httpclient是一个不错的选择。httpclient是Apache提供的一个开源的Http客户端库,它有着丰富的特性和灵活的配置选项。使用httpclient,你可以很方便地发送Http请求,处理响应,设置超时时间等。而且,httpclient被广泛应用于Java开发中,有很多相关的资料和文档可以参考,使用上也更加稳定。 另一方面,如果你对性能和扩展性有更高的要求,那么okhttp可能更适合你。okhttp是Square公司开发的一个优秀的Http客户端库,它被广泛用于Android开发中。okhttp具有较低的内存占用和更快的网络速度,支持连接池、异步请求、拦截器等一系列高级特性。它还可以与Retrofit等其他网络库无缝集成,提供更加便捷的网络请求和处理方式。如果你对网络性能有着严格的要求,并且想要更灵活地控制Http请求okhttp会是一个不错的选择。 总的来说,httpclientokhttp都有各自的优点和适用场景。选择哪个取决于你的具体需求和个人偏好。如果你更关注简单易用性和稳定性,那么httpclient可能更好;如果你更关注性能和灵活性,那么okhttp可能更合适。考虑到目前okhttp在市场上的广泛应用和较好的口碑,我个人更倾向于选择okhttp

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值