`
田田万558
  • 浏览: 14405 次
社区版块
存档分类
最新评论

SpringCloud 第二十篇:Spring Cloud 之 okhttp

 
阅读更多

 

1. 什么是 okhttp ?

okhttp 是由 square 公司开源的一个 http 客户端。在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。大部分 Java 程序都选择使用 Apache 的开源项目 HttpClient 作为 HTTP 客户端。Apache HttpClient 库的功能强大,使用率也很高。(了解源码可+WX:  haiwabbc)

2. 为什么要使用 okhttp ?

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 ,如图:

 

SpringCloud系列教程 | 第二十篇:Spring Cloud 之 okhttp
 

 

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 来进行访问的。

分享到:
评论

相关推荐

    okhttp-3.14.9-API文档-中英对照版.zip

    赠送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-all20201220.rar" 的压缩包很可能是包含了一个或多个与 Spring Cloud 相关的项目或者库的集合,发布于2020年12月20日。 Spring Cloud 的核心组件包括: 1. **Spring Cloud Config**:配置...

    okhttp-2.7.1-API文档-中英对照版.zip

    赠送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...

    okhttp-3.14.9-API文档-中文版.zip

    赠送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-...

    okhttp-2.4.0-API文档-中文版.zip

    赠送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最新版okhttp-3.9.0.jar下载

    OkHttp旨在通过减少网络延迟和减少内存使用来提高应用程序的性能。这个版本的发布可能包含了性能优化、新功能、bug修复或对先前版本的改进。 描述中提到的"okio-1.6.0.jar"是OkHttp依赖的一个重要库,Okio是一个...

    springcloud2.0文档

    SpringCloud是基于Spring Boot实现的一套微服务框架,它提供了在分布式系统中配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等多种功能。Spring...

    okhttp-spring-boot:OkHttp的Spring Boot启动程序

    okhttp-spring-boot-starter (别名为okhttp3-spring-boot-starter ) 使用Gradle dependencies { compile " io.freefair.okhttp-spring-boot:okhttp3-spring-boot-starter: $v ersion " } 使用Maven ...

    okhttp-3.11.0-API文档-中文版.zip

    赠送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.10.0.jar

    作为 Android 开发者的常用工具之一,理解并掌握 OkHttp 的使用对于提升应用质量至关重要。不过,值得注意的是,尽管开源社区提供了很多资源,但有些资源可能需要积分才能获取,这可能是描述中提到的“找半天都要...

    okhttp-2.7.5-API文档-中文版.zip

    赠送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-3.8.1-API文档-中文版.zip

    赠送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

    【SpringCloud之Feign】是Spring Cloud生态体系中一个重要的组件,主要用于服务间的调用,实现了声明式的服务调用,极大地简化了微服务之间的通信。Feign基于Netflix Hystrix进行了整合,支持服务熔断,提高了系统的...

    okhttp-3.11.0-API文档-中英对照版.zip

    赠送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+okio1.14.1

    版本号 "okhttp3.12.1" 指的是 OkHttp 库的特定稳定版本,它包含了各种优化和改进,确保在 Android 4.4 及以上系统上能够良好运行。"okio1.14.1" 是 OkHttp 的依赖库,用于提供高效的数据处理和流管理功能。 **...

    okhttp-2.7.5-API文档-中英对照版.zip

    赠送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...

    android之http工具: okhttp-master

    在Android开发中,HTTP通信是应用与服务器交互的重要方式之一,OkHttp作为高效的网络请求库,因其优秀的性能和易用性而备受开发者喜爱。本文将深入探讨OkHttp的基础知识、特性以及如何在Android项目中使用它。 ...

    okhttp-4.9.1.jar

    OkHttp是一款十分好用的Android网络框架,尽管官方提供了UrlConnection,但是OkHttp依然是最为广泛使用的网络请求方式。如果有一定程度的英语阅读能力,建议直接去官网阅读官方文档。前往Okhttp官网

    最新资源OkHttp下载包含okhttp-3.8.1.jar,okio-1.9.0.jar

    本资源包含的是OkHttp的3.8.1版本的jar包,以及与之匹配的Okio的1.9.0版本。 OkHttp的核心特性包括: 1. **连接池**:OkHttp维护了一个持久的连接池,可以重用先前建立的TCP连接,减少了握手和TLS协商的时间,从而...

    okhttp-3.3.1-API文档-中文版.zip

    赠送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信息:...

Global site tag (gtag.js) - Google Analytics