SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

一,问题

采取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版本比较乱,版本关联引用更是乱,最终我切换到 异常为: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中

SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

分析原理:我的客户端服务”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.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
    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.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
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中段容器在下面包中

org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

重新启动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

SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

浏览器测试访问成功!!!

五,附件:Greenwich.SR1 版中常用依赖

有好多问题都是因为 不同版本中引入不正确的依赖导致,这里列出 Greenwich.SR1 版中常用依赖,这里都不需要指定版本号

<dependencies>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-ribbonartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-config-serverartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-configartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-zuulartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
        <scope>testscope>
    dependency>
dependencies>

Original: https://www.cnblogs.com/ejiyuan/p/11027229.html
Author: ejiyuan
Title: SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541352/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 大白话布隆过滤器

    本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛…

    Java 2023年6月5日
    085
  • Java:通过标记直接跳出嵌套的循环结构

    这是我在刷面试题的时候遇到的一个使用方法,之前甚至对这种方法闻所未闻,不禁感慨自己的才疏学浅。 闲话少说,直接进入正题。 具体的使用就是在需要跳出的循环结构前面加一个标记(如out…

    Java 2023年6月15日
    079
  • 什么是计算机?

    计算机 组成:硬件+软件能按程序运行,自动、告诉处理海量数据的现代化智能电子设备。应用:科学计算、数据处理、自动控制、计算机辅助设计、人工智能、网络(互联网、自己的计算机就是网络的…

    Java 2023年6月6日
    057
  • java创建对象的5种方式

    1、使用new关键字 2、利用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法 3、…

    Java 2023年6月7日
    051
  • Linux 终端运行命令时出现多行带有加号的信息(详见文章内容)

    ++_vte_ prompt_ command +++ HISTTIMEFORMAT= +++ history 1 +++ sed ‘s/^ *[0-9] \+ *//’ ++ l…

    Java 2023年6月8日
    078
  • java.time.LocalDate格式化 及 LocalDate转Date

    undefined import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Zon…

    Java 2023年5月29日
    093
  • Java中的String字符串及其常用方法

    字符串(String) 文章目录 字符串(String) 直接定义字符串 常用方法 字符串长度 toLowerCase() & toUpperCase()方法 trim()…

    Java 2023年6月9日
    097
  • 【转】【WPF】WPF中的使用WndProc处理类似Winform的一些消息(比如处理无边框窗体遮挡任务栏)

    在WPF中,要想利用WndProc来处理所有的事件,需要利用到SourceInitialized Event,首先需要创建一个HwndSource对象,然后利用其AddHook方法…

    Java 2023年5月29日
    068
  • 阅读别人的代码,是一种怎样的体验

    原创:微信公众号 【阿Q说代码】,欢迎分享,转载请保留出处。 之前写过一篇名为《看了同事写的代码,我竟然开始默默的模仿了。。。》的文章,今天偶然间看了下后台数据,大吃一惊。该文章的…

    Java 2023年6月5日
    099
  • Kafka 生产者

    一个消息系统说白了无非就是由三部分组成,不同的消息系统只是这三部分的实现不同,或者会在这三部分之外扩充自己的特性。这三部分分别就是:生产者、消费者、消息队列 这篇文章主要介绍的是 …

    Java 2023年6月8日
    0138
  • Java 中HashMap详解(含HashTable, ConcurrentHashMap)

    本篇重点: 1.HashMap的存储结构 2.HashMap的put和get操作过程 3.HashMap的扩容 4.关于transient关键字 5.HashMap, HashTa…

    Java 2023年6月16日
    087
  • 云图说丨华为云代码托管服务分支合并大作战

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月15日
    067
  • MYSQL安装教程 详细版

    通过这个路径可以直接下载到mysql5.7的安装包 添加一下path路径,这样我们能从任何位置打开mysql 添加path路径 配置my.ini ,如果没有这个文件就新建一个 修改…

    Java 2023年6月9日
    098
  • arthas 线上排查常用命令

    下载arthas-boot.jar,然后用java -jar的方式启动: curl -O https://arthas.aliyun.com/arthas-boot.jar jav…

    Java 2023年6月16日
    067
  • 线程池:ThreadPoolExcutor源码阅读

    ThreadPoolExcutor源码流程图:(图片较大,下载再看比较方便) 线程池里的二进制奥秘 前言: 线程池的五种状态state (RUNNING 、SHUTDOWN 、ST…

    Java 2023年6月14日
    064
  • 线程的生命周期

    线程的生命周期 线程的生命周期 一、通用的java生命周期 二、线程的方法 1、sleep(long millis)线程休眠 2.wait()线程等待 3、notify()/not…

    Java 2023年6月9日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球