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:
    defaultZone: http://localhost:8761/eureka/
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM