spring-boot Autowired DiscoveryClient RestTemplate UnknownHostException

Posted

技术标签:

【中文标题】spring-boot Autowired DiscoveryClient RestTemplate UnknownHostException【英文标题】: 【发布时间】:2016-07-27 07:39:40 【问题描述】:

我使用的是 Spring Boot 1.3.3

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

编辑

我将 Brixton.RC1 用于我的 Spring Cloud 依赖项

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Brixton.RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

我的应用程序是使用这些注释设置的:

@EnableDiscoveryClient
@SpringBootApplication
public class Application 
    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

我有一个带有服务的休息控制器:

@RestController
public class MyController 

    @Autowired
    private MyService myService;

在我的服务中,我正在尝试使用自动装配的休息模板来调用另一个 eureka 注册服务。

@Service
public class MyServiceImpl 

    private final ParameterizedTypeReference<Answer> ANSWER = new ParameterizedTypeReference<Answer>() ;

    @Autowired
    private DiscoveryClient discoveryClient; //just here for testing

    @Autowired
    private RestTemplate restTemplate; //

    public String someCoolMethod(String input)
        log.info("Instance available? " + isInstanceAvailable());

        final RequestEntity<String> requestEntity = RequestEntity.post(URI.create("http://myotherservice/othermethod")).accept(MediaType.APPLICATION_JSON).body(input);
        final ResponseEntity<String> response = this.restTemplate.exchange(requestEntity, ANSWER);
        log.info(response);
        return response.getBody();
    

    private Boolean isInstanceAvailable()
        List<ServiceInstance> instances = discoveryClient.getInstances("myotherservice");
        for(ServiceInstance si : instances)
            log.info(si.getUri().toString());
        
        return instances.size() > 0;
    


我完全糊涂了,因为我在另一个项目中工作。这也是输出:

INFO http://192.168.1.10:1234
INFO Instance available? true
ERROR I/O error on POST request for "http://myotherservice/othermethod": myotherservice; nested exception is java.net.UnknownHostException: myotherservice

所以我可以看到这两个服务都在 Eureka 中注册了。 MyService 能够:

在尤里卡注册 在 Eureka 中查询“myotherservice” 使用正确的主机和端口获得有效响应

但是自动装配的 RestTemplate 正在抛出 UnknownHostException。

【问题讨论】:

你用的是什么版本的Spring Cloud?显示您的 Spring Cloud 依赖项。您的 RestTemplate 未正确配置发现。 【参考方案1】:

answer 是您需要从 RC1 创建一个@Loadbalanced RestTemplate

@Configuration
public class MyConfiguration 

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() 
        return new RestTemplate();
    

【讨论】:

非常感谢!两次!

以上是关于spring-boot Autowired DiscoveryClient RestTemplate UnknownHostException的主要内容,如果未能解决你的问题,请参考以下文章

@EnableJpaRepositories 未检测到或在 spring-boot 应用程序中的任何位置都未检测到 Repository 的 @Autowired

spring-boot使用Autowried还是Resouce

使用 mockito 为 spring-boot 应用程序模拟 Qualified bean

在春季启动autowired不工作,总是null?

@Autowired lateinit 属性 '' 尚未初始化

Spring/Spring-Boot 学习2 入门知识