【问题标题】:Eureka server and UnknownHostExceptionEureka 服务器和 UnknownHostException
【发布时间】:2020-11-28 03:34:08
【问题描述】:

我已经安装了一个 Eureka 服务器并注册了一个名为定价服务的服务。 Eureka 仪表板显示 UP定价服务:4ac78ca47bdbebb5fec98345c6232af0 处于状态。

现在我有一个完全独立的 Spring Boot Web 服务,它调用(通过 WebClient 实例)定价服务为 http://pricing-service 但我得到 "reactor.core.Exceptions$ReactiveException: java. net.UnknownHostException:没有这样的主机是已知的(定价服务)“ 例外。

因此控制器无法通过主机名找到定价服务。此外,控制器如何知道 Eureka 服务器以获取定价服务? Web服务的application.properties中不应该有对它的引用吗?我在网上找不到任何东西。

【问题讨论】:

  • 您为将 eureka 客户端集成到您的应用程序中做了哪些工作?你用的是什么版本?你能展示你的配置吗?
  • Eureka 服务器 application.properties : spring.application.name=eureka-server server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false 日志记录。 level.com.netflix.eureka=开启 logging.level.com.netflix.discovery=开启
  • 定价服务:spring.application.name=pricing-service eureka.client.serviceUrl.defaultZone=localhost:8761/eurekaeureka.client.service-url.default-zone=localhost:8761/eurekaeureka.instance .prefer-ip-address=true
  • 定价服务:server.port=8762 或 server.port=${PORT:0} 没有区别
  • 最有趣的部分是,单独的 Web 服务和控制器是如何发现 Eureka 服务器的?它没有引用它,或者我在这里遗漏了一些基本的东西

标签: spring spring-boot spring-cloud netflix-eureka


【解决方案1】:

WebClient 对 Eureka 开箱即用一无所知。您需要使用 @LoadBalancerClient 和 @LoadBalanced 通过负载均衡器连接它。在此处查看文档:

https://spring.io/guides/gs/spring-cloud-loadbalancer/

【讨论】:

    【解决方案2】:

    现在我有一个完全独立的 Spring Boot Web 服务,它调用(通过 WebClient 实例)定价服务为 http://pricing-service

    1. 您的这个独立服务(WebClient 服务)也必须向Eureka Server 注册。
    2. 默认情况下,webclient 不知道必须使用load-balancer 来调用其他eureka instances

    这是启用此类WebClient bean 的方法之一:

    @Configuration
    public class MyBeanConfig {
    
     @Bean
     WebClient webClient(LoadBalancerClient lbClient) {
        return WebClient.builder()
                 .filter(new LoadBalancerExchangeFilterFunction(lbClient))
                 .build();
        }
    
    }
    

    然后,您可以使用这个webClient bean 来调用:

    @Component
    public class YourClient {
    
     @Autowired
     WebClient webClient;
    
     public Mono<ResponseDto> makeCall() {
    
        return webClient
                .get()
                .uri("http://pricing-service/")
                // <-- change your body and subscribe to result
    }
    

    注意:初始化WebClientBean 可以进一步探索here

    【讨论】:

    • "您的这个单独的服务(WebClient 服务)也必须向 Eureka Server 注册。"您的意思是像定价服务一样注册到 Eureka 服务器,即:spring.application.name=webclient-service eureka.client.serviceUrl.defaultZone=localhost:8761/eureka eureka.client.service-url.default-zone=localhost: 8761/eureka eureka.instance.prefer-ip-address=true –
    • 也使用@EnableEurekaClient ?
    • 感谢您的帮助,我成功了!非常感谢!
    • @microwth 是的,你明白了。您使用webClient 调用其他服务(pricing-service)的服务也必须是DiscoveryClient,即在application.properties 中设置@EnableEurekaClienteureka 属性。这就是它将如何根据服务名称查询注册表 (Eureka Server) 以获取实例。
    【解决方案3】:

    当我创建一个返回 WebClient 的 bean 时,我遇到了 WebClient 无法为我使用 @LoadBalanced 的问题。您必须为WebClient.Builder 创建一个bean 而不仅仅是WebClient,否则@LoadBalanced 注释无法正常工作。

    @Configuration
    public class WebClientConfig {
    
      @Bean
      @LoadBalanced
      public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
      }
    }
    

    【讨论】:

    • 这是我的解决方案
    猜你喜欢
    • 2017-05-04
    • 2020-05-22
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2018-01-03
    • 2019-07-04
    • 2016-07-17
    相关资源
    最近更新 更多