<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>http-client on </title>
    <link>/tags/http-client/</link>
    <description>Recent content in http-client on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sat, 25 Apr 2026 10:00:00 +0800</lastBuildDate><atom:link href="/tags/http-client/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Spring Boot 3.5 BFF 出站 HTTP 客户端：连接池、超时与 HTTP/2 实战</title>
      <link>/posts/bff-http-client-pool-timeout-and-h2c-2026/</link>
      <pubDate>Sat, 25 Apr 2026 10:00:00 +0800</pubDate>
      
      <guid>/posts/bff-http-client-pool-timeout-and-h2c-2026/</guid>
      <description>配套阅读：shop-starter-http-client 设计 介绍完整的 starter 设计；本文专注于其中&amp;quot;连接配置&amp;quot;这一块的细节决定。
1. 问题场景 典型的 BFF 模式：
graph LR BFF[buyer-bff] --&gt; M[marketplace-service] BFF --&gt; O[order-service] BFF --&gt; L[loyalty-service] BFF --&gt; P[promotion-service] BFF --&gt; S[search-service] BFF -. 偶尔 .-&gt; EXT[第三方支付 API] 每个下游的特征可能完全不同：marketplace 响应 50ms，搜索可能要 5s；payment 是外部 HTTPS API，order 是内部 cleartext；某个服务上了 HTTP/2，其他还是 HTTP/1.1。
三个绕不开的问题：
不同下游应该共用一个连接池，还是每个独立？ connectTimeout / readTimeout 怎么按服务定制？ 内部服务用 HTTP/2（h2c）值不值得开？怎么避坑？ 下面逐个讲清楚。
2. 连接池：共享还是隔离？ 我通常会先共享一个 java.net.http.HttpClient 实例。
2.1 为什么很多时候先不需要隔离 HttpClient 的连接复用天然按 origin 收敛 Oracle 的 HttpClient API 文档明确写了“一个 HttpClient 实例通常管理自己的连接池”；连接对同一 origin 复用、不同 origin 分开这一点，可以再配合 OpenJDK 源码 一起看。对 marketplace-service:80 和 order-service:80 的连接不会混在一个全局 bucket 里，所以“共享一个 HttpClient 实例”并不等于“所有下游抢同一组 socket”：</description>
    </item>
    
  </channel>
</rss>
