1. 什么是 okhttp ?
okhttp 是由 square 公司开源的一个 http 客户端。在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。大部分 Java 程序都选择使用 Apache 的开源项目 HttpClient 作为 HTTP 客户端。Apache HttpClient 库的功能强大,使用率也很高。
2. 为什么要使用 okhttp ?(了解源码可+WX: haiwabbc)
okhttp 的设计初衷就是简单和高效,这也是我们选择它的重要原因之一。它的优势如下:
- 支持 HTTP/2 协议。
- 允许连接到同一个主机地址的所有请求,提高请求效率。
- 共享Socket,减少对服务器的请求次数。
- 通过连接池,减少了请求延迟。
- 缓存响应数据来减少重复的网络请求。
- 减少了对数据流量的消耗。
- 自动处理GZip压缩。
3. 实战目标
- Feign 中使用 okhttp 替代 httpclient
- Zuul 中使用 okhttp 替代 httpclient
4. 在 Feign 中使用 okhttp
首先介绍一下工程结构,本演示工程包含 provider-server、consumer-server、eureka-server 和 zuul-server 。
4.1 consumer-server 依赖 pom.xml 如下:
代码清单:chapter19/consumer-server/pom.xml
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency> </dependencies>
-
feign-okhttp
这里无需指定版本,目前引入的feign-okhttp
版本为 10.2.3 ,而okhttp
的版本为 3.8.1 ,如图:
4.2 配置文件 application.yml
代码清单:chapter19/consumer-server/src/main/resources/application.yml
feign: httpclient: enabled: false okhttp: enabled: true
- 在配置文件中需关闭 feign 对 httpclient 的使用并开启 okhttp 。
4.3 配置类 OkHttpConfig.java
代码清单:chapter19/consumer-server/src/main/java/com/springcloud/consumerserver/config/OkHttpConfig.java
@Configuration @ConditionalOnClass(Feign.class) @AutoConfigureBefore(FeignAutoConfiguration.class) public class OkHttpConfig { @Bean public OkHttpClient okHttpClient(){ return new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .connectionPool(new ConnectionPool(10 , 5L, TimeUnit.MINUTES)) .addInterceptor(new OkHttpLogInterceptor()) .build(); } }
- 在配置类中将
OkHttpClient
注入 Spring 的容器中,这里我们指定了连接池的大小,最大保持连接数为 10 ,并且在 5 分钟不活动之后被清除。 - 笔者这里配置了一个 okhttp 的日志拦截器。
4.4 日志拦截器 OkHttpLogInterceptor.java
代码清单:
@Slf4j public class OkHttpLogInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { log.info("OkHttpUrl : " + chain.request().url()); return chain.proceed(chain.request()); } }
- 这里实现的接口是
okhttp3.Interceptor
,并不是 Spring Boot 中的 Interceptor。 - 笔者这里仅简单打印了 okhttp 请求的路径,如果有业务校验权限等需求可以放在拦截器中实现。
远程 Feign 调用代码略过,有需要的读者可以访问 Github 仓库获取。
5. 在 Zuul 中使用 okhttp
5.1 pom.xml 加入 okhttp 依赖
代码清单:chapter19/zuul-server/pom.xml
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
5.2 配置文件开启 okhttp
代码清单:chapter19/zuul-server/src/main/resources/application.yml
ribbon: http: client: enabled: false okhttp: enabled: true
- 因为 Zuul 的负载均衡实现是通过 Ribbon 实现的,所以 Http 客户端的配置自然也是对 Ribbon 组件的配置。
6. 测试
我们修改 idea 启动配置,分别在 8000 和 8001 端口启动 provider-server ,并且顺次启动其余工程,打开浏览器访问链接:http://localhost:8080/consumer/hello ,多次刷新,可以看到 Hello Spring Cloud! Port : 8000
和 Hello Spring Cloud! Port : 8001
交替书出现,可以证明负载均衡已经成功,可以查看 consumer-server 的日志,如下:
2019-09-23 23:15:27.097 INFO 10536 --- [nio-9000-exec-5] c.s.c.intercepter.OkHttpLogInterceptor : OkHttpUrl : http://host.docker.internal:8001/hello 2019-09-23 23:15:27.593 INFO 10536 --- [nio-9000-exec-6] c.s.c.intercepter.OkHttpLogInterceptor : OkHttpUrl : http://host.docker.internal:8000/hello 2019-09-23 23:15:27.942 INFO 10536 --- [nio-9000-exec-7] c.s.c.intercepter.OkHttpLogInterceptor : OkHttpUrl : http://host.docker.internal:8001/hello 2019-09-23 23:15:28.251 INFO 10536 --- [nio-9000-exec-9] c.s.c.intercepter.OkHttpLogInterceptor : OkHttpUrl : http://host.docker.internal:8000/hello 2019-09-23 23:15:47.877 INFO 10536 --- [nio-9000-exec-8] c.s.c.intercepter.OkHttpLogInterceptor : OkHttpUrl : http://host.docker.internal:8001/hello
可以看到我们刚才自定义的日志正常打印,证明现在访问确实是通过 okhttp 来进行访问的。
相关推荐
赠送jar包:okhttp-3.14.9.jar; 赠送原API文档:okhttp-3.14.9-javadoc.jar; 赠送源代码:okhttp-3.14.9-sources.jar; 赠送Maven依赖信息文件:okhttp-3.14.9.pom; 包含翻译后的API文档:okhttp-3.14.9-javadoc-...
这个名为 "spring-cloud-all20201220.rar" 的压缩包很可能是包含了一个或多个与 Spring Cloud 相关的项目或者库的集合,发布于2020年12月20日。 Spring Cloud 的核心组件包括: 1. **Spring Cloud Config**:配置...
赠送jar包:okhttp-2.7.1.jar; 赠送原API文档:okhttp-2.7.1-javadoc.jar; 赠送源代码:okhttp-2.7.1-sources.jar; 赠送Maven依赖信息文件:okhttp-2.7.1.pom; 包含翻译后的API文档:okhttp-2.7.1-javadoc-API...
赠送jar包:okhttp-3.14.9.jar; 赠送原API文档:okhttp-3.14.9-javadoc.jar; 赠送源代码:okhttp-3.14.9-sources.jar; 赠送Maven依赖信息文件:okhttp-3.14.9.pom; 包含翻译后的API文档:okhttp-3.14.9-javadoc-...
赠送jar包:okhttp-2.4.0.jar; 赠送原API文档:okhttp-2.4.0-javadoc.jar; 赠送源代码:okhttp-2.4.0-sources.jar; 赠送Maven依赖信息文件:okhttp-2.4.0.pom; 包含翻译后的API文档:okhttp-2.4.0-javadoc-API...
OkHttp旨在通过减少网络延迟和减少内存使用来提高应用程序的性能。这个版本的发布可能包含了性能优化、新功能、bug修复或对先前版本的改进。 描述中提到的"okio-1.6.0.jar"是OkHttp依赖的一个重要库,Okio是一个...
SpringCloud是基于Spring Boot实现的一套微服务框架,它提供了在分布式系统中配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等多种功能。Spring...
okhttp-spring-boot-starter (别名为okhttp3-spring-boot-starter ) 使用Gradle dependencies { compile " io.freefair.okhttp-spring-boot:okhttp3-spring-boot-starter: $v ersion " } 使用Maven ...
赠送jar包:okhttp-3.11.0.jar; 赠送原API文档:okhttp-3.11.0-javadoc.jar; 赠送源代码:okhttp-3.11.0-sources.jar; 赠送Maven依赖信息文件:okhttp-3.11.0.pom; 包含翻译后的API文档:okhttp-3.11.0-javadoc-...
作为 Android 开发者的常用工具之一,理解并掌握 OkHttp 的使用对于提升应用质量至关重要。不过,值得注意的是,尽管开源社区提供了很多资源,但有些资源可能需要积分才能获取,这可能是描述中提到的“找半天都要...
赠送jar包:okhttp-2.7.5.jar; 赠送原API文档:okhttp-2.7.5-javadoc.jar; 赠送源代码:okhttp-2.7.5-sources.jar; 赠送Maven依赖信息文件:okhttp-2.7.5.pom; 包含翻译后的API文档:okhttp-2.7.5-javadoc-API...
赠送jar包:okhttp-3.8.1.jar; 赠送原API文档:okhttp-3.8.1-javadoc.jar; 赠送源代码:okhttp-3.8.1-sources.jar; 赠送Maven依赖信息文件:okhttp-3.8.1.pom; 包含翻译后的API文档:okhttp-3.8.1-javadoc-API...
【SpringCloud之Feign】是Spring Cloud生态体系中一个重要的组件,主要用于服务间的调用,实现了声明式的服务调用,极大地简化了微服务之间的通信。Feign基于Netflix Hystrix进行了整合,支持服务熔断,提高了系统的...
赠送jar包:okhttp-3.11.0.jar; 赠送原API文档:okhttp-3.11.0-javadoc.jar; 赠送源代码:okhttp-3.11.0-sources.jar; 赠送Maven依赖信息文件:okhttp-3.11.0.pom; 包含翻译后的API文档:okhttp-3.11.0-javadoc-...
版本号 "okhttp3.12.1" 指的是 OkHttp 库的特定稳定版本,它包含了各种优化和改进,确保在 Android 4.4 及以上系统上能够良好运行。"okio1.14.1" 是 OkHttp 的依赖库,用于提供高效的数据处理和流管理功能。 **...
赠送jar包:okhttp-2.7.5.jar; 赠送原API文档:okhttp-2.7.5-javadoc.jar; 赠送源代码:okhttp-2.7.5-sources.jar; 赠送Maven依赖信息文件:okhttp-2.7.5.pom; 包含翻译后的API文档:okhttp-2.7.5-javadoc-API...
okhttp-digest okhttp的摘要身份验证器。 大多数代码是从Apache Http Client移植的。重要的该工件已从jcenter转移到了Maven Central! 坐标已从com.burgstaller:okhttp-digest:<version>到io.github.rburgst:okhttp-...
在Android开发中,HTTP通信是应用与服务器交互的重要方式之一,OkHttp作为高效的网络请求库,因其优秀的性能和易用性而备受开发者喜爱。本文将深入探讨OkHttp的基础知识、特性以及如何在Android项目中使用它。 ...
本资源包含的是OkHttp的3.8.1版本的jar包,以及与之匹配的Okio的1.9.0版本。 OkHttp的核心特性包括: 1. **连接池**:OkHttp维护了一个持久的连接池,可以重用先前建立的TCP连接,减少了握手和TLS协商的时间,从而...
赠送jar包:okhttp-3.3.1.jar; 赠送原API文档:okhttp-3.3.1-javadoc.jar; 赠送源代码:okhttp-3.3.1-sources.jar; 包含翻译后的API文档:okhttp-3.3.1-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...