在我們的項目中,各服務整合 spring-cloud-netflix-hystrix-stream spring-cloud-starter-turbine-stream
,當開啟斷路器的API被調用時,就會産生監控資料,這些監控資料會以MQ消息傳遞到RabbitMQ/Kafka中,Turbine整合
,消費MQ消息,并聚合各個服務的監控資料。架構如圖所示:
turbine-kafka.png
代碼非常簡單,你懂的,就不貼了。至此,各服務可以正常産生Hystrix監控資料;Turbine也可以正常聚合各服務的監控資料;業務一切正常。
然而,當筆者嘗試将Turbine Server也注冊到Eureka Server時,無法成功。 Turbine Server的配置如下:
server:
port: 8989
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
于是開啟了辛酸的排查曆程:
- 排查配置:無誤
- 排查代碼:尼瑪沒幾行代碼,不缺注解
- 排查網絡問題:無誤
那麼究竟是什麼問題呢。筆者在萬能的GitHub上找到了答案。問題出在
spring-cloud-turbine-stream
,該依賴會啟動一個Netty容器,并将
server.port
設為
-1
,進而關閉Servlet容器。這其實是官方的一個小Bug,不過官方說等Spring Boot 2.0才會修複,詳見:
https://github.com/spring-cloud/spring-cloud-netflix/issues/1774。
好在,問題可以規避,規避的方式也很簡單,将配置改為如下即可:
server:
# 容器端口
port: 8989
management:
# 配置Spring Boot Actuator的端口
port: 8990
spring:
application:
index: ${random.long}
cloud:
stream:
kafka:
binder:
zk-nodes: localhost:2181
brokers: localhost:9092
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
prefer-ip-address: true
# 務必跟server.port的配置保持一緻
non-secure-port: 8989
總結一下:
- 在指定
的基礎上,指定server.port
,兩個端口務必不同;management.port
- 添加配置:
,以便于服務注冊到Eureka Server上,該端口需要跟eureka.instance.non-secure-port
所配置的端口一緻。server.port
這樣,Turbine Server就可以注冊到Eureka Server了。注冊到Eureka Server後顯示如下:
turbine-in-eureka.png
如圖,現在已可正常将Turbine注冊到Eureka Server了,但依然存在問題:那就是
192.168.191.2:turbine-server:-1
這個裡面的
-1
應該是服務的端口
server.port
此處展示并不正确,對于強迫症,如果想要自定義這部分内容,該如何處理呢?請閱讀我的部落格:
http://www.itmuch.com/spring-cloud-sum/eureka-Instance-id/說明:
如果大家使用的不是Turbine Stream(即:不使用消息中間件收集監控資訊),那麼不存在該問題。
本文連結:
http://www.itmuch.com/spring-cloud-sum/turbine-stream-cannot-register-into-eureka-server/**版權聲明: **本部落格由
周立創作,采用
CC BY 3.0 CN許可協定。可自由轉載、引用,但需署名作者且注明文章出處。如轉載至微信公衆号,請在文末添加作者公衆号二維碼。