关于ribboon负载均衡失败的低级错误java.net.UnknownHostException: user-service
今天在做springCloud练习的时候,在实现负载均衡均衡时,犯了一个低级错误,下面展示下部分代码
注册中心Eureka
启动类
@SpringBootApplication
@EnableEurekaServer//声明是一个注册服务中心
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
yam文件
server:
port: 8761 #eureka默认端口
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8762/eureka,http://127.0.0.1:8763/eureka
instance:
ip-address: 127.0.0.1
prefer-ip-address: true
instance-id: ${eureka.instance.ip-address}:${server.port}
lease-expiration-duration-in-seconds: 90 #服务失效时间
lease-renewal-interval-in-seconds: 30 #轮询
server:
enable-self-preservation: true # 关闭自我保护模式(缺省为打开)
#- 服务的注册和发现都是可控制的,可以关闭也可以开启。默认都是开启
#- 注册后需要心跳,心跳周期默认30秒一次,超过90秒没法认为宕机
#- 服务拉取默认30秒拉取一次
#- Eureka每个60秒会剔除标记为宕机的服务
#- Eureka会有自我保护,当心跳失败比例超过阈值,那么开启自我保护,不再剔除服务。
#- Eureka高可用就是多台Eureka互相注册在对方上
客户端-提供
启动类
@SpringBootApplication
@MapperScan("cn.itcast.user.mapper")//扫描包
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class UserServiceApplicaton {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplicaton.class,args);
}
}
接口
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("queryById/{id}")
public User queryById(@PathVariable("id") Long id){
User user = this.userService.queryById(id);
return user;
}
}
yam文件
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/cloud_test
username: root
password: admin
driver-class-name: com.mysql.jdbc.Driver
application:
name: user-service
mybatis:
type-aliases-package: cn.itcast.user.mapper
configuration:
aggressive-lazy-loading: true
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka,http://127.0.0.1:8762/eureka,http://127.0.0.1:8763/eureka
# instance:
# ip-address: 127.0.0.1
# prefer-ip-address: true
# instance-id: ${eureka.instance.ip-address}:${server.port}
客户端-消费
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean//同步客户端执行HTTP请求,公开一个简单的模板
@LoadBalanced//表示客户端负载均衡器。
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
接口
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("queryById/{id}")
public User queryById(@PathVariable("id") Long id){
//负载均衡测试
String url = "http://user-service/user/queryById/"+id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
yam文件
server:
port: 8082
spring:
application:
name: consumer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka
# instance:
# ip-address: 127.0.0.1
# prefer-ip-address: true
# instance-id: ${eureka.instance.ip-address}:${server.port}
基本业务逻辑没有错误,然后在通过负载均衡的方式请求的时候报错了
浏览器报错
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Sep 23 00:37:48 GMT+08:00 2019
There was an unexpected error (type=Internal Server Error, status=500).
I/O error on GET request for “http://user-service/user/queryById/7”: user-service; nested exception is java.net.UnknownHostException: user-service
后台报错
java.net.UnknownHostException: user-service
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_51]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_51]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_51]
…
第一反应是代码哪儿写错了,可是来回找了三次之后发现并没有错误, 然后想到应该是负载均衡没有实现 , 进底层看了看,发现底层实现LoadBalancerClient的实现类RibbonLoadBalancerClient 居然报错了 , 这里没有来的级截图,
然后查了一下依赖 , 果然依赖少了一个…被自己手贱误删了…接下来就不说了…自己给自己挖了个坑…哈哈哈 …不过收获也挺多 ,任何问题的出现都是有原因的 ,