okhttp 是由 square 公司開源的一個 http 客戶端。在 Java 平臺上,Java 標準庫提供了 HttpURLConnection 類來支持 HTTP 通訊。不過 HttpURLConnection 本身的 API 不夠友好,所提供的功能也有限。大部分 Java 程序都選擇使用 Apache 的開源項目 HttpClient 作為 HTTP 客戶端。Apache HttpClient 庫的功能強大,使用率也很高。
okhttp 的設計初衷就是簡單和高效,這也是我們選擇它的重要原因之一。它的優勢如下:
首先介紹一下工程結構,本演示工程包含 provider-server、consumer-server、eureka-server 和 zuul-server 。
代碼清單: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 ,如圖:代碼清單:chapter19/consumer-server/src/main/resources/application.yml
***
feign:
httpclient:
enabled: false
okhttp:
enabled: true
代碼清單: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 分鐘不活動之后被清除。代碼清單:
***
@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。遠程 Feign 調用代碼略過,有需要的讀者可以訪問 Github 倉庫獲取。
代碼清單:chapter19/zuul-server/pom.xml
***
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
代碼清單:chapter19/zuul-server/src/main/resources/application.yml
***
ribbon:
http:
client:
enabled: false
okhttp:
enabled: true
我們修改 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 來進行訪問的。
示例代碼-Github
示例代碼-Gitee
。轉載請注明來源地址:黑帽SEO http://www.790079.com 專注于SEO培訓,快速排名(黑帽seo技術,網站快速排名,蜘蛛池加速收錄,目錄程序定制)
掃一下添加微信: