【Netty源码解读和权威指南】第88篇:Netty DNS解析——自定义域名解析的底层实现
上一篇【第87篇】Netty Proxy Protocol支持——获取真实客户端IP
下一篇【第89篇】深入理解Netty内存屏障与JMM——如何保证并发安全
一、JVM DNS缓存问题
// JVM默认DNS缓存策略// security模式:缓存永久(线上事故高发!)// 非security模式:缓存30秒// 解决方案1:JVM参数-Dsun.net.inetaddr.ttl=10// DNS缓存10秒-Dnetworkaddress.cache.ttl=10// 解决方案2:使用Netty DNS// 完全控制DNS解析,不受JVM缓存影响二、DnsNameResolver使用
EventLoopGroupgroup=newNioEventLoopGroup();DnsNameResolverBuilderbuilder=newDnsNameResolverBuilder(group.next()).channelType(NioDatagramChannel.class)// DNS基于UDP.queryTimeoutMillis(5000)// 超时5秒.maxQueriesPerResolve(3)// 最多重试3次.ttl(10,TimeUnit.SECONDS)// 缓存10秒.ndots(1);// 最少点号数DnsNameResolverresolver=builder.build();// 异步DNS解析Future<InetAddress>future=resolver.resolve("www.example.com");future.addListener(f->{if(f.isSuccess()){System.out.println("解析结果: "+f.getNow());}});三、自定义DNS服务器
// 指定DNS服务器InetSocketAddressdnsServer=newInetSocketAddress("8.8.8.8",53);DnsNameResolverresolver=newDnsNameResolverBuilder(group.next()).nameServerProvider(newSingletonDnsServerAddressStreamProvider(dnsServer)).build();四、应用场景
| 场景 | 实现 |
|---|---|
| 服务发现 | DNS解析后端地址 |
| 负载均衡 | DNS轮询 |
| 灰度发布 | DNS切流 |
上一篇【第87篇】Netty Proxy Protocol支持——获取真实客户端IP
下一篇【第89篇】深入理解Netty内存屏障与JMM——如何保证并发安全
