1.CloseableHttpClient (Apache HttpClient)
特点:
java
// 创建示例 CloseableHttpClient httpClient = HttpClients.custom() .setConnectionTimeToLive(30, TimeUnit.SECONDS) .setMaxConnTotal(100) .setMaxConnPerRoute(20) .build(); // 使用 HttpGet request = new HttpGet("https://api.example.com/data"); try (CloseableHttpResponse response = httpClient.execute(request)) { String result = EntityUtils.toString(response.getEntity()); }优势:
底层控制强:完全控制HTTP连接的每个细节
性能优秀:连接池管理精细,适合高并发
功能全面:支持HTTP/1.1和HTTP/2,支持代理、重试等
社区活跃:Apache项目,持续更新
缺点:
API复杂:使用繁琐,需要手动处理很多细节
配置繁琐:连接池、超时等需要手动配置
异常处理复杂:需要处理多种异常类型
2.RestTemplate (Spring)
特点:
java
// Spring Boot自动配置或手动创建 @Bean public RestTemplate restTemplate() { return new RestTemplate(); } // 使用 String result = restTemplate.getForObject( "https://api.example.com/data", String.class ); // 或 ResponseEntity<User> response = restTemplate.exchange( "https://api.example.com/users/{id}", HttpMethod.GET, null, User.class, userId );优势:
Spring生态集成:与Spring MVC无缝集成
API简洁:模板方法,使用简单
自动序列化:自动处理JSON/XML转换
声明式异常处理:
RestClientException体系
缺点:
性能较差:默认实现基于HttpURLConnection
配置不灵活:底层连接控制有限
已过时:Spring官方已标记为deprecated(Spring 5.0+)
3.WebClient (Spring WebFlux - 官方推荐)
特点:
java
// 创建 WebClient webClient = WebClient.builder() .baseUrl("https://api.example.com") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); // 使用(响应式) Mono<User> userMono = webClient.get() .uri("/users/{id}", userId) .retrieve() .bodyToMono(User.class); // 或(阻塞式) User user = webClient.get() .uri("/users/{id}", userId) .retrieve() .bodyToMono(User.class) .block();优势:
响应式支持:支持Reactive编程
非阻塞IO:高并发性能好
函数式API:流式API设计
Spring官方推荐:替代RestTemplate
支持HTTP/2
4.OkHttp (Square)
特点:
java
// 创建 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build(); // 使用 Request request = new Request.Builder() .url("https://api.example.com/data") .build(); try (Response response = client.newCall(request).execute()) { String result = response.body().string(); }优势:
性能优秀:默认支持连接池、GZIP压缩
简洁高效:API设计简洁
HTTP/2支持:自动升级到HTTP/2
拦截器机制:强大的拦截器支持
缺点:
功能相对简单:相比HttpClient功能较少
需要手动序列化:没有内置的JSON支持
5.Feign (OpenFeign)
特点:
java
// 声明式接口 @FeignClient(name = "user-service", url = "${user-service.url}") public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable("id") Long id); @PostMapping("/users") User createUser(@RequestBody User user); } // Spring Boot自动生成实现 @Autowired private UserClient userClient; User user = userClient.getUser(1L);优势:
声明式编程:只需定义接口
与Spring Cloud集成:微服务场景最佳
自动编码解码:支持多种编码格式
负载均衡:与Ribbon集成
6.Retrofit (Square)
特点:
java
// 定义接口 public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); } // 创建实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); GitHubService service = retrofit.create(GitHubService.class); Call<List<Repo>> repos = service.listRepos("octocat");优势:
接口优雅:类似Feign的声明式风格
性能优秀:基于OkHttp
Android首选:Android开发标准
强类型安全:编译时检查
7.详细对比表格
| 特性 | HttpClient | RestTemplate | WebClient | OkHttp | Feign | Retrofit |
|---|---|---|---|---|---|---|
| 所属项目 | Apache | Spring | Spring | Square | OpenFeign | Square |
| API风格 | 命令式 | 模板方法 | 响应式/函数式 | 命令式 | 声明式 | 声明式 |
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 易用性 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Spring集成 | 需配置 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 需配置 | ⭐⭐⭐⭐⭐ | 需配置 |
| HTTP/2 | ✓ | ✗ | ✓ | ✓ | 依赖底层 | ✓ |
| 异步支持 | ✓ | ✓(AsyncRestTemplate) | ✓ | ✓ | ✓ | ✓ |
| 连接池 | 精细控制 | 简单控制 | 依赖底层 | 自动管理 | 依赖底层 | 依赖底层 |
8.选型建议
场景1:Spring Boot项目
yaml
# 新项目 → WebClient implementation 'org.springframework.boot:spring-boot-starter-webflux' # 老项目维护 → RestTemplate(逐步迁移) implementation 'org.springframework.boot:spring-boot-starter-web' # 微服务 → OpenFeign implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
场景2:高性能要求
java
// 方案1:OkHttp(简单高性能) <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.10.0</version> </dependency> // 方案2:Apache HttpClient(复杂控制) <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.2.1</version> </dependency>
场景3:Android开发
kotlin
// Retrofit + OkHttp是标准组合 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0'
9.现代最佳实践
Spring Boot 2.x+ 推荐架构:
java
@Configuration public class HttpClientConfig { // 主推荐:WebClient @Bean public WebClient webClient() { return WebClient.builder() .clientConnector(new ReactorClientHttpConnector( HttpClient.create() .responseTimeout(Duration.ofSeconds(30)) )) .build(); } // 备选:OkHttp + RestTemplate @Bean public RestTemplate restTemplate() { return new RestTemplate(new OkHttp3ClientHttpRequestFactory()); } }微服务场景:
java
// 使用Feign + 负载均衡 @FeignClient(name = "order-service", configuration = FeignConfig.class) public interface OrderClient { @GetMapping("/orders/{orderId}") Order getOrder(@PathVariable String orderId); } // 配置OkHttp作为底层 public class FeignConfig { @Bean public okhttp3.OkHttpClient okHttpClient() { return new okhttp3.OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); } }10.性能对比数据参考
| 客户端 | QPS | 平均延迟 | 内存占用 | 适用场景 |
|---|---|---|---|---|
| Apache HttpClient | 8500 | 11ms | 中 | 高并发后台服务 |
| OkHttp | 9000 | 9ms | 低 | 移动端/高并发API |
| WebClient | 8000 | 12ms | 中 | 响应式应用 |
| RestTemplate | 3000 | 32ms | 高 | 传统Spring应用 |
总结建议:
新项目:优先考虑WebClient(Spring)或OkHttp(非Spring)
微服务:使用Feign
Android:使用Retrofit + OkHttp
极致性能控制:使用Apache HttpClient
老项目维护:继续使用RestTemplate,逐步迁移