• eureka中显示有服务但是通过ribbon调用显示No instances available for service-hello的问题


    一,问题

    采取eureka集群、客户端通过Ribbon调用服务,Ribbon端报下列异常

    1
    2
    3
    4
    5
    6
    7
    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,我添加了

    1
    2
    3
    4
    5
    @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中注册成功,所以不能识别主机名称。

    四,解决问题

    配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    eureka:
     client:
      serviceUrl:
    server:
     port: 8764
    spring:
     application:
      name: service-ribbon

    依赖导入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <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>

    主程序注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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,需要引入下面的包

    1
    2
    3
    4
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    修改主程序注释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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中段容器在下面包中

    1
    2
    3
    4
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    重新启动ribbon,发现控制台输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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 版中常用依赖,这里都不需要指定版本号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <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.jb51.net/article/163154.htm

  • 相关阅读:
    机器学习性能指标精确率、召回率、F1值、ROC、PRC与AUC--周振洋
    机器学习项目实战(一)垃圾邮件的过滤技术-周振洋
    Python音频处理(一)音频基础知识-周振洋
    LightGBM详细用法--机器学习算法--周振洋
    LightGBM的算法介绍
    Oracle数据库学习一 (Oracle数据库安装/环境变量配置/客户端/基础/问题...),待续...
    WebService小白学习 之 Spring整合CXF,添加拦截器 (7)
    WebService小白学习 之 CXF添加拦截器,自定义拦截器 (6)
    WebService小白学习 之 处理一些Map等复杂类型 (5)
    WebService小白学习 之 处理JavaBean以及复合类型,list (4)
  • 原文地址:https://www.cnblogs.com/cangqinglang/p/11704475.html
Copyright © 2020-2023  润新知