【问题标题】:Hit external IPs from microservices using Spring Cloud使用 Spring Cloud 从微服务中访问外部 IP
【发布时间】:2016-06-20 19:10:41
【问题描述】:

我正在尝试从我的一个微服务中访问外部服务。我使用 Spring Cloud、Eureka 作为注册表和 Spring boot 作为主要框架。

Map<String, String> urlVariables = new HashMap<>();
    urlVariables.put("ip_address", IP);
    urlVariables.put("port", PORT);

    ResponseObject state =
            restTemplate.getForObject("http://{ip_address}:{port}/state/", ResponseObject.class, urlVariables);

据我所见,Spring Cloud 将 Ribbon 作为 Rest Template 的 HTTP 客户端注入,当我尝试访问此 IP(例如:193.172.x.x)时,会产生以下错误:

java.lang.IllegalStateException:没有可用于 193.172.x.x 的实例 在 org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest(RibbonClientHttpRequestFactory.java:64) 在 org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:540) 在 org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:247)

看起来 Ribbon 正在尝试查找具有该名称的微服务实例,而不是向外查找。有什么方法可以将 Ribbon 配置为查找外部 IP,还是仅供内部使用?

【问题讨论】:

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


    【解决方案1】:

    您可以尝试在代码中使用服务 ID 并配置真实实例:

    ResponseObject state =
                restTemplate.getForObject("http://myExternalService/state/", ResponseObject.class, urlVariables);
    

    比你为你的服务配置一个静态的端点列表

    myExternalService.ribbon.listOfServers=http://ip:port
    

    这样您就不会为此服务使用服务发现。

    http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#spring-cloud-ribbon-without-eureka

    【讨论】:

    • 它确实有效,但前提是我禁用了尤里卡。不幸的是,我需要尤里卡和这项服务。有没有办法让两者同时工作?
    • 是的,使用 @LoadBalanced 作为 Marcin 所说的带有丝带的那个,并将非 eureka 休息模板标记为 @Primary
    【解决方案2】:

    您正在注入 RestTemplate 的 @LoadBalanced 版本。您必须确保您的 RestTemplate 是一个普通的模板。您可以使用new RestTemplate() 创建它。如果它是一个 bean,只需添加一个限定符以确保您注入的是正确版本的 RestTemplate

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 2018-05-12
      • 2021-10-23
      • 2011-06-27
      • 2017-12-22
      • 1970-01-01
      • 2022-11-17
      • 2021-04-28
      相关资源
      最近更新 更多