在我们的项目中,各服务整合spring-cloud-netflix-hystrix-stream
,当开启断路器的API被调用时,就会产生监控数据,这些监控数据会以MQ消息传递到RabbitMQ/Kafka中,Turbine整合spring-cloud-starter-turbine-stream
,消费MQ消息,并聚合各个服务的监控数据。架构如图所示:
代码非常简单,你懂的,就不贴了。至此,各服务可以正常产生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.instance.non-secure-port
,以便于服务注册到Eureka Server上,该端口需要跟server.port
所配置的端口一致。
这样,Turbine Server就可以注册到Eureka Server了。注册到Eureka Server后显示如下:
如图,现在已可正常将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 许可协议。可*转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。