最近在构建项目时出现一个问题,由于是从旧的项目复制部分依赖过来的。出现了一个restTemplate无法通过服务名调用服务的问题。新的项目使用的springboot是2.1.4的。
1、错误的分析:
场景:
RestTemplate上有加入 @Bean和@LoadBalanced注解,注入正常。但仍然无法通过服务名(http://服务名/v1/接口)调用服务,报错UnknownHostException,经测试通过ip端口的形式(http://localhost:8081/v1/接口)却可以调用服务的接口。
分析结果:
服务eureka服务名没有注册上,所以无法通过服务名获取。(方向错了,浪费好多时间)
2、正确的分析:
场景:
报错路径显示的是:http://服务名/v1/接口
查询相关底层原理发现(参考:springCloud的RestTemplate+@LoadBalanced注解实现负载均衡源码分析):@LoadBalanced起到标记作用,当服务启动时RestTemplate对象里面就会被自动加入LoadBalancerInterceptor拦截器,拦截器中会进行路径解析,通过serviceId和Rule解析返回为IP:port形式的信息的Server。
也就是说:我的报错路径显示的仍是http://服务名/v1/接口,说明我的@LoadBalanced没有生效,服务名未被解析为ip和端口的形式。所以定位问题到ribbon的依赖版本问题。
去maven中央仓库查看我自身的依赖,发现已过期。
将原本的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
修改为spring对应版本的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
完美解决问题。
我自己在构建这个项目的时候,踩了挺多坑,由于懒,直接拷贝pom依赖过来,然后发现大多问题都是版本依赖的问题。如你们有人在做这种构建任务时遇到项目奇奇怪怪的问题,那多半是依赖的版本问题了。
以上