前面讲解了断路器, 当数据服务不可用的时候, 断路器就会发挥作用。 那么数据服务什么时候可用,什么时候不可用,如何监控这个事情呢? 我们就要用到 断路器监控 来可视化掌控这个情况。
创建子项目hystrix-dashboard 。
ProductServiceHystrixDashboardApplication,主要就是这个注解@EnableHystrixDashboard,表示开启仪表盘功能。
package edu.hpu.springcloud; import cn.hutool.core.util.NetUtil; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; @SpringBootApplication @EnableHystrixDashboard public class ProductServiceHystrixDashboardApplication { public static void main(String[] args) { int port = 8020; if(!NetUtil.isUsableLocalPort(port)) { System.err.printf("端口%d被占用了,无法启动%n", port ); System.exit(1); } new SpringApplicationBuilder(ProductServiceHystrixDashboardApplication.class).properties("server.port=" + port).run(args); } }修改视图微服务,主要是在启动类中添加注解@EnableCircuitBreaker,使其可以把消息发送给监控中心。
package edu.hpu.springcloud; import brave.sampler.Sampler; import cn.hutool.core.convert.Convert; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NetUtil; import cn.hutool.core.util.NumberUtil; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import java.util.Scanner; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker public class ProductViewServiceFeignApplication { public static void main(String[] args) { //判断 rabiitMQ 是否启动 int rabbitMQPort = 5672; if(NetUtil.isUsableLocalPort(rabbitMQPort)) { System.err.printf("未在端口%d 发现 rabbitMQ服务,请检查rabbitMQ 是否启动", rabbitMQPort ); System.exit(1); } int port = 0; int defaultPort = 8012; Future<Integer> future = ThreadUtil.execAsync(() ->{ int p = 0; System.out.println("请于5秒钟内输入端口号, 推荐 8012 、 8013 或者 8014,超过5秒将默认使用"+defaultPort); Scanner scanner = new Scanner(System.in); while(true) { String strPort = scanner.nextLine(); if(!NumberUtil.isInteger(strPort)) { System.err.println("只能是数字"); continue; } else { p = Convert.toInt(strPort); scanner.close(); break; } } return p; }); try{ port=future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e){ port = defaultPort; } if(!NetUtil.isUsableLocalPort(port)) { System.err.printf("端口%d被占用了,无法启动%n", port ); System.exit(1); } new SpringApplicationBuilder(ProductViewServiceFeignApplication.class).properties("server.port=" + port).run(args); } @Bean public Sampler defaultSampler() { return Sampler.ALWAYS_SAMPLE; } }这是一个工具类,不停地访问视图微服务,方便监控。
package edu.hpu.springcloud.util; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.http.HttpUtil; public class AccessViewService { public static void main(String[] args) { while(true) { ThreadUtil.sleep(1000); try { String html= HttpUtil.get("http://127.0.0.1:8012/products"); System.out.println("html length:" + html.length()); } catch(Exception e) { System.err.println(e.getMessage()); } } } }依次启动服务中心、配置服务器、数据微服务、视图微服务、断路器监控。 运行访问工具类,以不停访问视图微服务。 访问地址:http://localhost:8020/hystrix 这个是监控地址, 在第一个输入框输入:
http://localhost:8012/actuator/hystrix.stream这个地址就是视图微服务的短路信息。 然后点击 Monitor Stream 就可以看到监控信息了。 监控图详解: 结束数据服务: 红色的数据就达到 100%。
1、怎么结束服务? 上面一步操作是结束数据服务,我用的办法是先查端口,再在任务管理器中结束进程,这种方式太笨重,查了一下,没有找到特别理想的结果。 看参考【3】吧。
参考: 【1】、http://how2j.cn/k/springcloud/springcloud-dashboard/2043.html#nowhere 【2】、https://wangsong.blog.csdn.net/article/details/78224483 【3】、http://www.itmuch.com/spring-cloud-sum/how-to-unregister-service-in-eureka/