Spring Cloud全分析:服务调用之OpenFeign集成OkHttp

[复制链接]
发表于 2026-1-14 10:37:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×




OpenFeign集成OkHttp

OpenFeign本质是HTTP来举行服务调用的,也就是须要集成一个Http客户端。
使用的是Client接口来举行哀求的
  1. public interface Client {
  2. // request是封装的请求方式、参数、返回值类型
  3.   // options 是连接超时、读取超时等的配置
  4.   Response execute(Request request, Options options) throws IOException;
  5. }
复制代码
默认是HttpURLConnection方式,也就是jdk中提供的最原始的谁人
  1. public static class Default implements Client {
  2.   @Override
  3.   public Response execute(Request request, Options options) throws IOException {
  4.     HttpURLConnection connection = convertAndSend(request, options);
  5.     return convertResponse(connection).toBuilder().request(request).build();
  6.   }
  7. }
复制代码
HTTP毗连须要举行TCP三次握手,是一个比力耗时的使用,一样平常我们不直接使用HttpURLConnection,而是使用HttpClient/okHttp等支持毗连池的客户端工具,以Feign集成OkHttp为例
添加依赖

  1.         <dependency>
  2.             <groupId>io.github.openfeign</groupId>
  3.             <artifactId>feign-okhttp</artifactId>
  4.         </dependency>
复制代码
其包内有一个Client的实现类OkHttpClient,
  1. public final class OkHttpClient implements Client {
  2.   @Override
  3.   public feign.Response execute(feign.Request input, feign.Request.Options options)
  4.       throws IOException {
  5.     okhttp3.OkHttpClient requestScoped;
  6.     if (delegate.connectTimeoutMillis() != options.connectTimeoutMillis()
  7.         || delegate.readTimeoutMillis() != options.readTimeoutMillis()) {
  8.       requestScoped = delegate.newBuilder()
  9.           .connectTimeout(options.connectTimeoutMillis(), TimeUnit.MILLISECONDS)
  10.           .readTimeout(options.readTimeoutMillis(), TimeUnit.MILLISECONDS)
  11.           .followRedirects(options.isFollowRedirects())
  12.           .build();
  13.     } else {
  14.       requestScoped = delegate;
  15.     }
  16.     Request request = toOkHttpRequest(input);
  17.     Response response = requestScoped.newCall(request).execute();
  18.     return toFeignResponse(response, input).toBuilder().request(input).build();
  19.   }
  20. }
复制代码
设置毗连池

  1. import okhttp3.ConnectionPool;
  2. import okhttp3.OkHttpClient;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import javax.net.ssl.*;
  6. import java.security.KeyManagementException;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.security.SecureRandom;
  9. import java.security.cert.X509Certificate;
  10. import java.util.concurrent.TimeUnit;
  11. @Configuration
  12. public class OkHttpConfig {
  13.     /**
  14.      * OkHttp 客户端配置
  15.      *
  16.      * @return OkHttp 客户端配
  17.      */
  18.     @Bean
  19.     public OkHttpClient okHttpClient() {
  20.         return new OkHttpClient.Builder()
  21.                 .sslSocketFactory(sslSocketFactory(), x509TrustManager())
  22.                 .hostnameVerifier(hostnameVerifier())
  23.                 .retryOnConnectionFailure(false)    //是否开启缓存
  24.                 .connectionPool(pool())             //连接池
  25.                 .connectTimeout(15L, TimeUnit.SECONDS) // 连接超时时间
  26.                 .readTimeout(15L, TimeUnit.SECONDS) // 读取超时时间
  27.                 .followRedirects(true) // 是否允许重定向
  28.                 .build();
  29.     }
  30.     /**
  31.      * 忽略证书校验
  32.      *
  33.      * @return 证书信任管理器
  34.      */
  35.     @Bean
  36.     public X509TrustManager x509TrustManager() {
  37.         return new X509TrustManager() {
  38.             @Override
  39.             public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
  40.             }
  41.             @Override
  42.             public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
  43.             }
  44.             @Override
  45.             public X509Certificate[] getAcceptedIssuers() {
  46.                 return new X509Certificate[0];
  47.             }
  48.         };
  49.     }
  50.     /**
  51.      * 信任所有 SSL 证书
  52.      *
  53.      * @return
  54.      */
  55.     @Bean
  56.     public SSLSocketFactory sslSocketFactory() {
  57.         try {
  58.             TrustManager[] trustManagers = new TrustManager[]{x509TrustManager()};
  59.             SSLContext sslContext = SSLContext.getInstance("SSL");
  60.             sslContext.init(null, trustManagers, new SecureRandom());
  61.             return sslContext.getSocketFactory();
  62.         } catch (NoSuchAlgorithmException | KeyManagementException e) {
  63.             e.printStackTrace();
  64.         }
  65.         return null;
  66.     }
  67.     /**
  68.      * 连接池配置
  69.      *
  70.      * @return 连接池
  71.      */
  72.     @Bean
  73.     public ConnectionPool pool() {
  74.         // 最大连接数、连接存活时间、存活时间单位(分钟)
  75.         return new ConnectionPool(200, 5, TimeUnit.MINUTES);
  76.     }
  77.     /**
  78.      * 信任所有主机名
  79.      *
  80.      * @return 主机名校验
  81.      */
  82.     @Bean
  83.     public HostnameVerifier hostnameVerifier() {
  84.         return (s, sslSession) -> true;
  85.     }
  86. }
复制代码
yml设置

要开启OkHttp ,还须要在YML 中添加开启设置项,默认是关闭的
  1. feign:
  2.   okhttp:
  3.     enabled: true
复制代码
至于为什么须要配这个,看一下FeignAutoConfiguration中装配OkHttp的条件
  1. @Configuration(proxyBeanMethods = false)
  2. @ConditionalOnClass(OkHttpClient.class)
  3. @ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
  4. @ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
  5. @ConditionalOnProperty("feign.okhttp.enabled")
  6. protected static class OkHttpFeignConfiguration
复制代码
参考文献


  • OpenFeign集成OkHttp

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表