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

  • 时间:
  • 浏览:3
  • 来源:大发uu快3_uu快3技巧稳赚方法_大发uu快3技巧稳赚方法

在可是的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 {
    @Override
    public CommonResponse<List<AdPlanVO>> getAdPlansUseFeign(AdPlanGetRequestVO requestVO) {
        return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get plan error.");
    }

    @Override
    public 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;
    @Autowired
    public 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 "";

    ...
}

让让我们 歌词 让让我们 让让我们 儿主要关注两个 点:

  1. @Target({ElementType.METHOD})表明当前的注解并能应用在办法上方。
  2. 可直接定义fallbackMethod来保证容错。这一办法有两个 缺乏,否则可以 和执行办法在同两个 类文件中,这就会造成让让我们 歌词 让让我们 让让我们 儿的办法在实现的可是,显得特别的冗余和缺乏优雅。

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

@Service
@Slf4j
public class SearchImpl implements ISearch {

    /**
     * 查询广告容错办法
     *
     * @param e 第3个参数都可以

不指定,机会可以

跟踪错误,就指定上
     * @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")
    @Override
    public 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
        @EnableHystrixDashboard
        public class AdDashboardApplication {
    
            public static void main(String[] args) {
                SpringApplication.run(AdDashboardApplication.class, args);
            }
        }
  3. 改配置

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

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

换成要监控的服务地址: