【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——如何保证并发安全