使用 Spring Cloud 从微服务访问外部 IP

Hit external IPs from microservices using Spring Cloud

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

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 模板的 HTTP 客户端注入,当我尝试访问此 IP(例如:193.172.x.x)时,它会产生以下错误:

java.lang.IllegalStateException: No instances available for 193.172.x.x at org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest(RibbonClientHttpRequestFactory.java:64) at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:540) at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:247)

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

您可以尝试在代码中使用服务 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 版本的 RestTemplate。您必须确保您的 RestTemplate 是普通的模板。您可以使用 new RestTemplate() 创建它。如果它是一个 bean,只需添加一个限定符以确保您正在注入 RestTemplate.

的正确版本