详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑
作者:ejiyuan 时间:2021-06-01 07:28:41
一,问题
采取eureka集群、客户端通过Ribbon调用服务,Ribbon端报下列异常
java.net.UnknownHostException: SERVICE-HI
java.lang.IllegalStateException: No instances available for SERVICE-HI
java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://SERVICE-HI
com.netfix.discovery.shared.taransport.TransportException: Cannot execute request on any known server
Spring Cloud版本比较乱,版本关联引用更是乱,最终我切换到 <spring-cloud.version> Greenwich.SR1 </spring-cloud.version> 异常为: No instances available for SERVICE-HI
二、寻找答案
网上答案千奇百怪
1,Spring Cloud 官网,RestTemplate bean配置中添加负载均衡注解@LoadBalanced,我添加了
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
结果无效仍然一样报错
2,访问的服务名名称不能有下划线:
我的名称是“SERVICE-HI”本身就不存在下划线,所以不考虑这条。
3,主机名称没在系统文件hosts中配置,ping不通你服务名:
很扯的答案,为什么要配host,负载多台机器让主机名指向谁?不考虑此答案
三,分析问题
百度不到,自己分析原因,发现ribbon服务器没有注册到 eureka server中
分析原理:我的客户端服务“SERVICE-HI”已经成功注册到eureka server中了,如果ribbon服务器不在eureka server中注册,是不会知道客户端服务“SERVICE-HI”的存在以及它存在的位置,那么结论就是,因为ribbon服务器没有在eureka server中注册成功,所以不能识别主机名称。
四,解决问题
配置文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8764
spring:
application:
name: service-ribbon
依赖导入
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
主程序注释
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run( ServiceRibbonApplication.class, args );
}
}
有问题,最终发现@EnableDiscoveryClient标签无法注册到注册中心,百度@EnableDiscoveryClient,得到的结论是
@EnableDiscoveryClient和@EnableEurekaClient一样,能够让注册中心能够发现,扫描到改服务,不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是Eureka或其他(consul、zookeeper等)注册中心 。
具体原因不去分析,这里先直接切换为@EnableEurekaClient注释
@EnableEurekaClient在哪个包里简直是迷一样的存在,不同版本的spring cloud 中位置不同,我使用Greenwich.SR1,需要引入下面的包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
修改主程序注释
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix //我开启了段容器
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run( ServiceRibbonApplication.class, args );
}
}
这里提一句在 Greenwich.SR1中段容器在下面包中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
重新启动ribbon,发现控制台输入
2019-06-15 13:08:06.668 INFO 14796 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server
2019-06-15 13:08:06.878 INFO 14796 --- [ main] com.netflix.discovery.DiscoveryClient : The response status is 200
2019-06-15 13:08:06.882 INFO 14796 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 30
2019-06-15 13:08:06.886 INFO 14796 --- [ main] c.n.discovery.InstanceInfoReplicator : InstanceInfoReplicator onDemand update allowed rate per min is 4
2019-06-15 13:08:06.891 INFO 14796 --- [ main] com.netflix.discovery.DiscoveryClient : Discovery Client initialized at timestamp 1560575286889 with initial instances count: 2
2019-06-15 13:08:06.894 INFO 14796 --- [ main] o.s.c.n.e.s.EurekaServiceRegistry : Registering application SERVICE-RIBBON with eureka with status UP
2019-06-15 13:08:06.896 INFO 14796 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1560575286896, current=UP, previous=STARTING]
2019-06-15 13:08:06.900 INFO 14796 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-RIBBON/DESKTOP-FJQITE3:service-ribbon:8764: registering service...
2019-06-15 13:08:06.958 INFO 14796 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SERVICE-RIBBON/DESKTOP-FJQITE3:service-ribbon:8764 - registration status: 204
2019-06-15 13:08:06.961 INFO 14796 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8764 (http) with context path ''
2019-06-15 13:08:06.963 INFO 14796 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8764
2019-06-15 13:08:06.967 INFO 14796 --- [ main] cn.meylink.ServiceRibbonApplication : Started ServiceRibbonApplication in 5.868 seconds (JVM running for 7.204)
查看Eureka
浏览器测试访问成功!!!
五,附件:Greenwich.SR1 版中常用依赖
有好多问题都是因为 不同版本中引入不正确的依赖导致,这里列出 Greenwich.SR1 版中常用依赖,这里都不需要指定版本号
<dependencies>
<!-- eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 段容器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!-- ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- config server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- config client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
来源:https://www.cnblogs.com/ejiyuan/p/11027229.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Dwr3.0纯注解(纯Java Code配置)配置与应用浅析二之前端调用后端
![](https://img.aspxhome.com/file/2023/3/57693_0s.png)
Java:泛型知识知多少
![](https://img.aspxhome.com/file/2023/8/60188_0s.jpg)
springboot读取配置文件中的参数具体步骤
![](https://img.aspxhome.com/file/2023/2/59582_0s.png)
spring mvc 组合mybatis框架实例详解
![](https://img.aspxhome.com/file/2023/2/59752_0s.png)
java Hibernate多对多映射详解及实例代码
![](https://img.aspxhome.com/file/2023/2/61052_0s.png)
java常用工具类 Random随机数、MD5加密工具类
java对象初始化代码详解
Java中的强引用,软引用,弱引用,虚引用的作用介绍
![](https://img.aspxhome.com/file/2023/1/58411_0s.png)
命令行编译java文件方式
![](https://img.aspxhome.com/file/2023/2/60252_0s.png)
谈谈为JAXB和response设置编码,解决wechat4j中文乱码的问题
![](https://img.aspxhome.com/file/2023/1/57621_0s.png)
Java中遍历ConcurrentHashMap的四种方式详解
常见的java面试题
详解java基于MyBatis使用示例
![](https://img.aspxhome.com/file/2023/0/59060_0s.png)
Thymeleaf 3.0 自定义标签方言属性的实例讲解
Java Arrays.asList使用方法解析
Spring Data JPA 之 JpaRepository的使用
![](https://img.aspxhome.com/file/2023/4/60114_0s.jpg)
java 2d画图示例分享(用java画图)
Java 设计模式中的策略模式详情
![](https://img.aspxhome.com/file/2023/1/57731_0s.png)
如何用java程序(JSch)运行远程linux主机上的shell脚本
SpringBoot实现PPT格式文件上传并在线预览功能
![](https://img.aspxhome.com/file/2023/3/57403_0s.png)