在之前的18次文章中,我们实现了广告系统的广告投放广告检索业务功能,中间使用到了 服务发现Eureka服务调用Feign,网关路由Zuul以及错误熔断HystrixSpring Cloud组件。
简单调用关系:

但是系统往往都会报错,我们之前定义了一些容错类和方法,但是只是在控制台可以看到错误信息,我们想要统计一些数据,怎么才能更直观的看到我们的服务调用情况呢,接下来,和大家讨论一个新的熔断监控组件Hystrix Dashboard,顾名思义,从名字上我们就能看出来,它是监控的图形化界面。

Hystrix 在服务中的使用

结合openfeign使用

在我们实际的项目当中,使用的最多的就是结合FeignClient#fallbackHystrix一起来实现熔断,我们看一下我们在mscx-ad-feign-sdk中的实现。

@FeignClient(value = "mscx-ad-sponsor", fallback = SponsorClientHystrix.class)
public interface ISponsorFeignClient {@RequestMapping(value = "/ad-sponsor/plan/get", method = RequestMethod.POST)CommonResponse<List<AdPlanVO>> getAdPlansUseFeign(@RequestBody AdPlanGetRequestVO requestVO);@RequestMapping(value = "/ad-sponsor/user/get", method = RequestMethod.GET)/*** Feign 埋坑之 如果是Get请求,必须在所有参数前添加{@link RequestParam},不能使用{@link Param}* 会被自动转发为POST请求。*/CommonResponse getUsers(@RequestParam(value = "username") String username);
}

在上述代码中,我们自定义了一个feignclient,并且给了这个client一个fallback的实现类:

@Component
public class SponsorClientHystrix implements ISponsorFeignClient {@Overridepublic CommonResponse<List<AdPlanVO>> getAdPlansUseFeign(AdPlanGetRequestVO requestVO) {return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get plan error.");}@Overridepublic CommonResponse getUsers(String username) {return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get user error.");}
}

这个fallback类实现了我们自定义的ISponsorFeignClient,那是因为fallback的方法必须和原始执行类的方法签名保持一致,这样在执行失败的时候,可以通过反射映射到响应的降级方法/容错方法。
mscx-ad-search服务中,我们通过注入ISponsorFeignClient来调用我们的mscz-ad-sponsor服务。

@RestController
@Slf4j
@RequestMapping(path = "/search-feign")
public class SearchFeignController {/*** 注入我们自定义的FeignClient*/private final ISponsorFeignClient sponsorFeignClient;@Autowiredpublic SearchFeignController(ISponsorFeignClient sponsorFeignClient) {this.sponsorFeignClient = sponsorFeignClient;}@GetMapping(path = "/user/get")public CommonResponse getUsers(@Param(value = "username") String username) {log.info("ad-search::getUsersFeign -> {}", JSON.toJSONString(username));CommonResponse commonResponse = sponsorFeignClient.getUsers(username);return commonResponse;}
}
使用HystrixCommand

其实Hystrix本身提供了一种直接在方法中应用的方式,就是使用@ com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand,我们看一下这个类的源码:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {.../*** Specifies a method to process fallback logic.* A fallback method should be defined in the same class where is HystrixCommand.* Also a fallback method should have same signature to a method which was invoked as hystrix command.* for example:* <code>*      @HystrixCommand(fallbackMethod = "getByIdFallback")*      public String getById(String id) {...}**      private String getByIdFallback(String id) {...}* </code>* Also a fallback method can be annotated with {@link HystrixCommand}* <p/>* default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}** @return method name*/String fallbackMethod() default "";...
}

我们主要关注2个点:

  1. @Target({ElementType.METHOD})表明当前的注解只能应用在方法上面。
  2. 可直接定义fallbackMethod来保证容错。这个方法有一个缺陷,就是必须和执行方法在同一个类文件中,这就会造成我们的方法在实现的时候,显得特别的冗余和不够优雅。

以我们的mscx-ad-search中的广告查询为例:

@Service
@Slf4j
public class SearchImpl implements ISearch {/*** 查询广告容错方法** @param e 第二个参数可以不指定,如果需要跟踪错误,就指定上* @return 返回一个空map 对象*/public SearchResponse fetchAdsFallback(SearchRequest request, Throwable e) {System.out.println("查询广告失败,进入容错降级 : %s" + e.getMessage());return new SearchResponse().builder().adSlotRelationAds(Collections.emptyMap()).build();}@HystrixCommand(fallbackMethod = "fetchAdsFallback")@Overridepublic SearchResponse fetchAds(SearchRequest request) {...}
}

在我们请求出错的时候,会转到我们的fallback方法,这个实现是通过在应用启动的时候,我们开始了@EnableCircuitBreaker注解,这个注解会通过AOP拦截所有的HystrixCommand方法,将HystrixCommand整合到springboot的容器中,并且将注解标注的方法放入hystrix的线程中,一旦失败,通过反射调用fallback方法来实现。

创建dashboard project

上述代码我们看了Hystrix实现熔断的2种方式,接下来我们来实现请求监控的图形化界面,创建mscx-ad-dashboard,Let's code.
依然遵从我们springboot项目的三部曲:

  1. 加依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId><version>1.2.7.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix-dashboard</artifactId><version>1.2.7.RELEASE</version></dependency><!--eureka client--><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-actuator</artifactId></dependency></dependencies>
  2. 加注解

    /*** AdDashboardApplication for Hystrix Dashboard 启动类** @author <a href="mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a>* @since 2019/8/15*/@SpringBootApplication@EnableDiscoveryClient@EnableHystrixDashboardpublic class AdDashboardApplication {public static void main(String[] args) {SpringApplication.run(AdDashboardApplication.class, args);}}
  3. 改配置

        server:port: 1234spring:application:name: mscx-ad-dashboardeureka:client:service-url:defaultZone: http://server1:7777/eureka/,http://server2:8888/eureka/,http://server3:9999/eureka/management:endpoints:web:exposure:include: "*"`

直接启动,可以看到如下页面:

添加要监控的服务地址:

转载于:https://www.cnblogs.com/zhangpan1244/p/11361078.html

[Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard相关推荐

  1. [Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结

    到目前为止,我们整个初级广告检索系统就初步开发完成了,我们来整体回顾一下我们的广告系统. 整个广告系统编码结构如下: 1.mscx-ad 父模块 主要是为了方便我们项目的统一管理 2.mscx-ad- ...

  2. [Spring cloud 一步步实现广告系统] 21. 系统错误汇总

    广告系统学习过程中问题答疑 博客园 Eureka集群启动报错 Answer 因为Eureka在集群启动过程中,会连接集群中其他的机器进行数据同步,在这个过程中,如果别的服务还没有启动完成,就会出现Co ...

  3. [Spring cloud 一步步实现广告系统] 13. 索引服务编码实现

    上一节我们分析了广告索引的维护有2种,全量索引加载和增量索引维护.因为广告检索是广告系统中最为重要的环节,大家一定要认真理解我们索引设计的思路,接下来我们来编码实现索引维护功能. 我们来定义一个接口, ...

  4. [Spring cloud 一步步实现广告系统] 12. 广告索引介绍

    索引设计介绍 在我们广告系统中,为了我们能更快的拿到我们想要的广告数据,我们需要对广告数据添加类似于数据库index一样的索引结构,分两大类:正向索引和倒排索引. 正向索引 通过唯一键/主键生成与对象 ...

  5. Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)

    在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard. 一.Hystrix Dashboard简 ...

  6. [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  7. feign响应拦截_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  8. 微服务feignclient_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  9. [Spring cloud 一步步实现广告系统] 20. 系统运行测试

    系统运行 经过长时间的编码实现,我们的主体模块已经大致完成,因为之前我们都是零散的对各个微服务自行测试,接下来,我们需要将所有的服务模块进行联调测试,Let's do it. 清除测试数据&测 ...

最新文章

  1. 华为应用市场 AppGallery Connect 研习社·直播:百万开发者打造优质应用的奥秘
  2. android倒计时功能,android实现倒计时功能(开始、暂停、0秒结束)
  3. 强化学习(十七) 基于模型的强化学习与Dyna算法框架
  4. ViewPager实现引导界面以及进入下一个activity解决办法
  5. some understanding of《Improved Use of Continuous Attributes in C4.5》
  6. oracle 查询数据库io,理解Oracle中的并行查询IO
  7. 基于CDS view生成的OData服务的metadata是如何生成的
  8. 如何快速掌握一门新技术/语言/框架
  9. 【题解】SCOI2009围豆豆
  10. python编写贪吃蛇_一步一个脚印教你用python开发一个贪吃蛇小游戏!
  11. CMMI认证多少钱?
  12. vlan internal allocation policy ascending解释
  13. 杭州电子科技大学计算机学硕复试,2019杭州电子科技大学计算机软件考研复试手册.docx...
  14. 计算机会议等级排名,中国计算机学会推荐国际学术期刊(搬运于中国计算机学会)
  15. python批量修改替换文件内容
  16. APK加固(梆梆助手)
  17. c51单片机音乐门铃C语言程序,基于51单片机的无线音乐门铃设计
  18. Android复习系列③之《Android筑基》
  19. 中国为什么要买美国国债
  20. java老师实例_java实例关于继承求实例,有关学生和老师的程序代码!望诸位软件达人帮忙,谢谢大虾!...

热门文章

  1. Qt 2D绘图之二:抗锯齿渲染和坐标系统
  2. webstorm中git密码输入错误,重置问题
  3. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
  4. javaSE基础04
  5. HDU 1711 Number Sequence(算法验证)
  6. 杭电2855 Fibonacci Check-up
  7. Linq 入门系列 [OfType,ToArray,ToList,ToDictionary]
  8. 《spring 2.0技术手册》入门不错!
  9. Centos下使用Docker部署asp.net core项目
  10. 实验6 在应用程序中播放音频和视频