Turbine 集成 rabbit bug
springcloud Finchley.RELEASE(2.0.2.RELEASE)
spring-boot 2.0.3.RELEASE
- monitor
- service
monitor
pom.xml
<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-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
application.yml
spring:
application:
name: monitor
# rabbitmq 配置
rabbitmq:
host: 127.0.0.1
port: 5672
username: admin
password: admin
server:
port: 8080
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8081/eureka
management:
endpoints:
web:
exposure:
include: hystrix.stream
MonitorApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrixDashboard
@EnableTurbineStream
public class MonitorApplication {
public static void main(String[] args) {
SpringApplication.run(MonitorApplication.class, args);
}
}
service
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- openFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 监控 Hystrix Stream hystrix-amqp -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
application.yml
spring:
application:
name: consumer
# rabbitmq 配置
rabbitmq:
host: 127.0.0.1
port: 5672
username: admin
password: admin
server:
port: 8882
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8081/eureka/
management:
server:
port: 9001
endpoints:
web:
exposure:
# 公开所有监控端点 * (这里主要是hystrix.stream 上报监控数据到监控板)
include: "*"
feign:
hystrix:
enabled: true
ServiceApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker // 启动断路器,如果要监控hystrix的流必须开启此注解,即使fegin已经通过属性
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
下面问题来了,我这边monitor打开服务 和 client 服务 发现 MQ里队列数据是对的,
用谷歌 打开 打开http://localhost:8080/hystrix 发现 服务器报错
2018-08-08 16:31:47.759 ERROR 3016 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] threw exception
java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:134)
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:157)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1276)
at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:670)
at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:607)
at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:597)
at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:646)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:169)
at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:252)
at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1564)
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:352)
at org.apache.coyote.Response.action(Response.java:173)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:317)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:284)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:297)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at org.springframework.util.StreamUtils.copy(StreamUtils.java:121)
at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:103)
at org.springframework.http.converter.StringHttpMessageConverter.writeInternal(StringHttpMessageConverter.java:43)
at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:224)
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler$HttpMessageConvertingHandler.sendInternal(ResponseBodyEmitterReturnValueHandler.java:199)
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler$HttpMessageConvertingHandler.send(ResponseBodyEmitterReturnValueHandler.java:189)
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.sendInternal(ResponseBodyEmitter.java:189)
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.send(ResponseBodyEmitter.java:183)
at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:133)
at org.springframework.web.servlet.mvc.method.annotation.SseEmitter.send(SseEmitter.java:116)
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler$SseEmitterSubscriber.send(ReactiveTypeHandler.java:344)
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler$AbstractEmitterSubscriber.run(ReactiveTypeHandler.java:283)
at java.lang.Thread.run(Thread.java:748)
用 restful插件 请求结果是
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="/hystrix"> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Hystrix Dashboard</title> <!-- Javascript to monitor and display --> <script src="/webjars/jquery/2.1.1/jquery.min.js" type="text/javascript"></script> <script> function sendToMonitor() { if($('#stream').val().length > 0) { var url = "/hystrix/monitor?stream=" + encodeURIComponent($('#stream').val()) + ""; if($('#delay').val().length > 0) { url += "&delay=" + $('#delay').val(); } if($('#title').val().length > 0) { url += "&title=" + encodeURIComponent($('#title').val()); } location.href= url; } else { $('#message').html("The 'stream' value is required."); } } </script> </head> <body> <div style="width:800px;margin:0 auto;"> <center> <img width="264" height="233" src="/hystrix/images/hystrix-logo.png"> <br> <br> <h2>Hystrix Dashboard</h2> <input id="stream" type="textfield" size="120" placeholder="http://hostname:port/turbine/turbine.stream"></input> <br><br> <i>Cluster via Turbine (default cluster):</i> http://turbine-hostname:port/turbine.stream <br> <i>Cluster via Turbine (custom cluster):</i> http://turbine-hostname:port/turbine.stream?cluster=[clusterName] <br> <i>Single Hystrix App:</i> http://hystrix-app:port/hystrix.stream <br><br> Delay: <input id="delay" type="textfield" size="10" placeholder="2000"></input>ms Title: <input id="title" type="textfield" size="60" placeholder="Example Hystrix App"></input><br> <br> <button onclick="sendToMonitor()">Monitor Stream</button> <br><br> <div id="message" style="color:red"></div> </center> </div> </body> </html>