HttpClient正确设置Host的姿势(不需要自定义DNS解析类)

本文介绍如何通过设置虚拟主机解决Nginx反向代理中因Host头不同导致的问题,确保请求能正确路由到指定域名,而不受负载均衡的影响。

因为有负载均衡的考虑,前端用了nginx反向代理。

两个域名虽然IP相同,但是如果不设置hosts文件,直接通过IP,是会返回404的。

所以需求就是这样,不设置hosts文件,而正确访问到对应的域名。

其实访问的IP是一样的,只是request header的Host不一样。

搜索到的解决方式:http://my.oschina.net/mikewei/blog/88606

这样有些不优雅,有点麻烦,而且我在httpClient3下,没找到对应的类。

只好debug跟踪源代码。

发现method.setRequestHeader("Host","a.xxxx.com")会被覆盖掉。

跟踪源代码发现,是HttpMethodBase类的addHostRequestHeader方法覆盖掉了。


如上,事情就好办了:

method.getParams().setVirtualHost("a.xxxx.com");

就OK了!

根本用不到自己实现一个DNS解析类。




关键代码就一行:getMethod.getParams().setVirtualHost("a.xxxx.com");

通过debug源代码找出的。。。

其实就是只要request header多一个Host:a.xxxx.com就行


补充:

想直接命中某个机器必须这样做。

否则直接用域名的方式,会负载均衡 不知道命中到哪台机器上(IP不同)。

<think>我们参考上面的引用内容,特别是引用[3]中关于DNS配置的详细参数,来回答如何使用DnsNameResolverBuilder实现自定义DNS解析自定义DNS解析通常包括:设置自定义DNS服务器、调整缓存策略、配置超时和重试、设置搜索域等。 步骤: 1. 创建DnsNameResolverBuilder实例。 2. 设置DNS服务器地址(可以覆盖系统默认的DNS服务器)。 3. 配置缓存策略(最小TTL、最大TTL、负缓存TTL等)。 4. 配置查询超时和最大查询次数。 5. 设置是否递归查询(rdFlag)。 6. 配置搜索域(searchDomains)和ndots(用于控制是否自动添加搜索域)。 7. 构建DnsNameResolver实例。 注意:Netty的DnsNameResolverBuilder提供了丰富的方法来覆盖这些配置。 具体配置方法如下: </think>### 使用 `DnsNameResolverBuilder` 实现自定义 DNS 解析的方法 通过 `DnsNameResolverBuilder` 可实现灵活的自定义 DNS 解析,以下是核心配置方法(基于引用内容[^1][^2][^3]): #### 1. **基础配置** ```java DnsNameResolver resolver = new DnsNameResolverBuilder(eventLoopGroup) .channelType(NioDatagramChannel.class) // 使用 UDP 协议 .nameServerProvider(new SingletonDnsServerAddressStreamProvider("8.8.8.8")) // 指定 DNS 服务器 .build(); ``` #### 2. **关键自定义参数 | **配置项** | **方法示例** | **作用说明** | **默认值** | |--------------------------|--------------------------------------|-------------------------------------------------------------------------------------------------------|------------| | **DNS 服务器** | `.nameServerAddresses("1.1.1.1", "9.9.9.9")` | 覆盖系统默认 DNS(如 `/etc/resolv.conf`),支持多服务器轮询[^2][^3] | 系统默认 | | **缓存策略** | `.minTtl(30).maxTtl(3600)` | 缓存生存时间(秒),避免频繁查询 DNS 服务器(`minTtl=0` 禁用缓存)[^1] | `minTtl=0` | | **失败重试** | `.maxQueriesPerResolve(3)` | 解析失败时的最大重试次数 | `16` | | **搜索域配置** | `.searchDomains("my.local", "dev")` | 自动追加域名后缀(如 `hosthost.my.local`)[^3] | 无 | | **NDots 阈值** | `.ndots(2)` | 域名包含的 `.` 少于该值时自动追加搜索域(需搭配 `searchDomains`)[^3] | `1` | #### 3. **高级配置示例 ```java DnsNameResolver resolver = new DnsNameResolverBuilder(eventLoopGroup) .queryTimeoutMillis(2000) // 查询超时时间 2 秒 .optResourceEnabled(true) // 启用 OPT 记录[^3] .negativeTtl(10) // 解析失败缓存时间 10 秒 .resolveCache(new DefaultDnsCache()) // 自定义缓存实现 .dnsQueryLifecycleObserverFactory(new MyObserverFactory()) // 监控查询生命周期 .build(); ``` #### 4. **集成到 HTTP 客户端 ```java // 在 Netty HttpClient 中使用自定义解析HttpClient client = HttpClient.create() .resolver(resolver) // 注入自定义 DNS 解析器 .get("https://example.com"); ``` #### 5. **注意事项 - **依赖冲突**:避免 `netty-all` 与其他库(如 Spring Boot Redis)冲突[^4] - **多网卡环境**:确保 DNS 服务器可达,删除可达的 nameserver[^2] - **缓存策略**:合理设置 `minTtl/maxTtl` 平衡性能与实时性(推荐 `minTtl≥30`)[^1] > 完整示例:[Netty DNS 自定义解析示例](https://github.com/netty/netty/tree/4.1/resolver-dns/src/main/java/io/netty/resolver/dns)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值