当前位置: 首页 > news >正文

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


文章目录

    • OpenFeign集成OkHttp
      • 添加依赖
      • 配置连接池
      • yml配置


OpenFeign集成OkHttp

OpenFeign本质是HTTP来进行服务调用的,也就是需要集成一个Http客户端。

使用的是Client接口来进行请求的

public interface Client {// request是封装的请求方式、参数、返回值类型// options 是连接超时、读取超时等的配置项Response execute(Request request, Options options) throws IOException;
}

默认是HttpURLConnection方式,也就是jdk中提供的最原始的那个

public static class Default implements Client {@Overridepublic Response execute(Request request, Options options) throws IOException {HttpURLConnection connection = convertAndSend(request, options);return convertResponse(connection).toBuilder().request(request).build();}
}

HTTP连接需要进行TCP三次握手,是一个比较耗时的操作,一般我们不直接使用HttpURLConnection,而是使用HttpClient/okHttp等支持连接池的客户端工具,以Feign集成OkHttp为例

添加依赖

        <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId></dependency>

其包内有一个Client的实现类OkHttpClient,

public final class OkHttpClient implements Client {@Overridepublic feign.Response execute(feign.Request input, feign.Request.Options options)throws IOException {okhttp3.OkHttpClient requestScoped;if (delegate.connectTimeoutMillis() != options.connectTimeoutMillis()|| delegate.readTimeoutMillis() != options.readTimeoutMillis()) {requestScoped = delegate.newBuilder().connectTimeout(options.connectTimeoutMillis(), TimeUnit.MILLISECONDS).readTimeout(options.readTimeoutMillis(), TimeUnit.MILLISECONDS).followRedirects(options.isFollowRedirects()).build();} else {requestScoped = delegate;}Request request = toOkHttpRequest(input);Response response = requestScoped.newCall(request).execute();return toFeignResponse(response, input).toBuilder().request(input).build();}
}

配置连接池

import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.net.ssl.*;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;@Configuration
public class OkHttpConfig {/*** OkHttp 客户端配置** @return OkHttp 客户端配*/@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory(), x509TrustManager()).hostnameVerifier(hostnameVerifier()).retryOnConnectionFailure(false)    //是否开启缓存.connectionPool(pool())             //连接池.connectTimeout(15L, TimeUnit.SECONDS) // 连接超时时间.readTimeout(15L, TimeUnit.SECONDS) // 读取超时时间.followRedirects(true) // 是否允许重定向.build();}/*** 忽略证书校验** @return 证书信任管理器*/@Beanpublic X509TrustManager x509TrustManager() {return new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}};}/*** 信任所有 SSL 证书** @return*/@Beanpublic SSLSocketFactory sslSocketFactory() {try {TrustManager[] trustManagers = new TrustManager[]{x509TrustManager()};SSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, trustManagers, new SecureRandom());return sslContext.getSocketFactory();} catch (NoSuchAlgorithmException | KeyManagementException e) {e.printStackTrace();}return null;}/*** 连接池配置** @return 连接池*/@Beanpublic ConnectionPool pool() {// 最大连接数、连接存活时间、存活时间单位(分钟)return new ConnectionPool(200, 5, TimeUnit.MINUTES);}/*** 信任所有主机名** @return 主机名校验*/@Beanpublic HostnameVerifier hostnameVerifier() {return (s, sslSession) -> true;}
}

yml配置

要开启OkHttp ,还需要在YML 中添加开启配置项,默认是关闭的

feign:okhttp:enabled: true

至于为什么需要配这个,看一下FeignAutoConfiguration中装配OkHttp的条件

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnProperty("feign.okhttp.enabled")
protected static class OkHttpFeignConfiguration

参考文献

  • OpenFeign集成OkHttp

相关文章:

  • 【C++算法】8.双指针_三数之和
  • 初识Linux · O(1)调度算法
  • 什么是IIC通信协议?
  • 【网络安全】内部应用中的多重漏洞利用
  • 01---java面试八股文——springboot---10题
  • Java中的Junit、类加载时机与机制、反射、注解及枚举
  • XSS | XSS 常用语句以及绕过思路
  • 【自然语言处理】词嵌入模型
  • docker相关命令
  • Golang | Leetcode Golang题解之第449题序列化和反序列化二叉搜索树
  • vue框架学习-- 父子页面 参数方法调用
  • 执行力怎么培养?
  • 1.1.4 计算机网络的分类
  • 【C++打怪之路Lv4】-- 类和对象(中)
  • Find My汽车钥匙|苹果Find My技术与钥匙结合,智能防丢,全球定位
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 2017-08-04 前端日报
  • Angular4 模板式表单用法以及验证
  • exif信息对照
  • github指令
  • GitUp, 你不可错过的秀外慧中的git工具
  • go语言学习初探(一)
  • Javascript弹出层-初探
  • js学习笔记
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • markdown编辑器简评
  • PhantomJS 安装
  • SOFAMosn配置模型
  • uva 10370 Above Average
  • vue--为什么data属性必须是一个函数
  • 高程读书笔记 第六章 面向对象程序设计
  • 基于 Babel 的 npm 包最小化设置
  • 基于HAProxy的高性能缓存服务器nuster
  • 来,膜拜下android roadmap,强大的执行力
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 追踪解析 FutureTask 源码
  • #android不同版本废弃api,新api。
  • #nginx配置案例
  • #vue3 实现前端下载excel文件模板功能
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ${factoryList }后面有空格不影响
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2.2w字)前端单元测试之Jest详解篇
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (九)信息融合方式简介