SpringCloud Ribbon 负载均衡 经过服务器名没法链接的神坑一个

一,问题java

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

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-HIspring

2、寻找答案 浏览器

网上答案千奇百怪tomcat

1,Spring Cloud 官网,RestTemplate bean配置中添加负载均衡注解@LoadBalanced,我添加了服务器

@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}

结果无效仍然同样报错app

2,访问的服务名名称不能有下划线:  负载均衡

个人名称是“SERVICE-HI”自己就不存在下划线,因此不考虑这条。

3,主机名称没在系统文件hosts中配置,ping不通你服务名:spring-boot

很扯的答案,为何要配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>
相关文章
相关标签/搜索