【问题标题】:UnknowhHostException using spring-cloud-starter-gateway with spring boot 2.4.0 and aboveUnknowhHostException 使用 spring-cloud-starter-gateway 和 spring boot 2.4.0 及更高版本
【发布时间】:2021-04-13 12:39:27
【问题描述】:

https://github.com/reactor/reactor-netty/issues/1431相关。

Spring 云网关服务器正常启动,但通过网关的请求失败,并出现以下异常:

java.net.UnknownHostException: failed to resolve 'myserver' after 4 queries
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ? org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
|_ checkpoint ? org.springframework.cloud.sleuth.instrument.web.TraceWebFilter [DefaultWebFilterChain]
|_ checkpoint ? org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
|_ checkpoint ? HTTP GET "/service/api/applications/123" [ExceptionHandlingWebHandler]
Stack trace:
at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013)
at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:966)
at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:414)
at io.netty.resolver.dns.DnsResolveContext.onResponse(DnsResolveContext.java:601)
at io.netty.resolver.dns.DnsResolveContext.access$400(DnsResolveContext.java:63)
at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:458)
.....

Works correctly when downgrading spring boot.

【问题讨论】:

    标签: spring spring-boot dns spring-cloud-gateway


    【解决方案1】:

    通过添加以下 bean 定义来修复:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import io.netty.resolver.DefaultAddressResolverGroup;
    import reactor.netty.http.client.HttpClient;
    
    @Configuration
    public class TempFixConfig {
    
        @Bean
        public HttpClient webClient() {
            return HttpClient.create().resolver(DefaultAddressResolverGroup.INSTANCE);
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果你不想改变HttpClient bean的创建逻辑,你可以添加一个HttpClientCustomizer:

      import org.springframework.cloud.gateway.config.HttpClientCustomizer;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      import io.netty.resolver.DefaultAddressResolverGroup;
      import reactor.netty.http.client.HttpClient;
      
      @Configuration
      public class HttpClientResolverFixConfig {
      
          @Bean
          public HttpClientCustomizer httpClientResolverCustomizer() {
              return new HttpClientCustomizer() {
      
                  @Override
                  public HttpClient customize(HttpClient httpClient) {
                      return httpClient.resolver(DefaultAddressResolverGroup.INSTANCE);
                  }
              };
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 2021-07-08
        • 2019-01-09
        • 2021-01-12
        • 2020-03-30
        • 2019-10-28
        • 2021-05-07
        • 2021-11-16
        • 2019-12-26
        相关资源
        最近更新 更多