前言

结合上篇博客”嗡汤圆的Spring Cloud自学(PART.2):eureka服务注册与代理端使用” 中API服务代理的使用,我们将用户请求交由代理完成API调用以及后端的负载均衡。
同时,通过代理,我们也可以很方便的将后端的异常捕获并处理。比如发生后端API错误,或者后端无可用的微服务的情况时的异常处理,我们称之为API熔断(Circuit Break),起到保护客户端与代理间程序正常运行的目的。本文通过Hystrix实现API熔断机制。

Hystrix支持

添加Hystrix支持

在代理应用依赖POM中添加对hystrix的依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

并在应用代码入口处,添加注解@EnableCircuitBreaker 即可完成熔断特性的添加。

对API添加熔断机制

即通过注解的方式对RestMapping映射的方法添加错误处理fallback。事例代码如下:

    public Collection<String> getReservationNamesFallback(){
        return Collections.emptyList();
    }

    @HystrixCommand(fallbackMethod="getReservationNamesFallback")
    @RequestMapping("/names")
    public Collection<String> getReservationNames(){
        ParameterizedTypeReference<Resources<Reservation>> ptr = 
                new ParameterizedTypeReference<Resources<Reservation>>() { };
        String url = discoveryClient.getInstances("reservation-service").get(0).getUri()+"/reservations";
        ResponseEntity<Resources<Reservation>> responseEntity = 
                this.restTemplate.exchange(url, 
                HttpMethod.GET, null, ptr);
        return responseEntity
                .getBody()
                .getContent()
                .stream()
                .map(Reservation::getReservationName)
                .collect(Collectors.toList());
    }

此处是之前API代理处理中间请求的代码,现在假设处理中间请求的过程当中发生异常时,我们通过getReservationNamesFallback 返回空列表,而不是抛出异常。

实例演示

我们模拟后端微服务异常退出的情况,关闭reservation-service 应用,此时代理通过eureka查询reservation-service服务时将无法找到可用服务器。因此在没有Hystrix熔断是,代理会返回HTTP 500异常。如下三幅图所示:
1)API代理正常
这里写图片描述
2)后端无服务,无熔断处理
这里写图片描述
3)后端无服务员,熔断处理
这里写图片描述

hystrix监控

Spring提供了hystrix-dashboard项目对支持hystrix熔断的项目提供链路状态监视的功能。

构建hystrix-dashboard项目

通过start.spring.io构建,勾选hystrix dashboardconfig-clienteureka discovery 即可。POM文件省略。
修改application.properties文件指定端口。
在应用入口处添加注解@EnableHystrixDashboard 即可启动应用。

监控

hystrix dashboard主页面

假设该应用部署于8010端口,则访问http://localhost:8010/hystrix 即可打开hystrix主页面。
这里写图片描述

代理端的hystrix监控流

在支持hystrix监控的项目中,输入hystrix.stream即可得到监控流信息,如http://localhost:8800/hystrix.stream

这里写图片描述
将该地址输入hystrix主页的输入框中,即可已图形形式观察代理的运行情况。
这里写图片描述
上图可以看出该API代理的两个接口调用情况,和线程池状态信息。
当我们关闭后台微服务reservation-service后,该代理将被熔断,此时hystrix图形界面将出现熔断的请求。
这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐