快速搭建微服务-熔断器
熔断器的主要功能是在进行服务间调用时提供一种容错保护,当服务提供方因网络或自身原因出现调用故障或延迟时,会导致服务调用方对外服务也出现延迟,如果此时服务调用方的请求不断增加,则会出现调用方的自身服务的故障甚至蔓延导致整个系统的瘫痪。
服务调用方配置熔断
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
|
在启动类上加入@EnableCircuitBreaker
注解开启熔断器。
通过 @HystrixCommand
注解实现服务降级。
1 2 3 4 5 6 7 8 9
| @GetMapping("") @HystrixCommand(fallbackMethod = "listWxMpAccountFallback") public Result listWxMpAccount(@PageableDefault Pageable pageable) { return wxMpAccountService.listWxMpAccount(pageable); }
private Result listWxMpAccountFallback(Pageable pageable) { return Result.fail("获取公众号列表失败,请稍后再试"); }
|
网关配置服务降级
当我们在使用zuul进行路由分发,如果后端服务没有启动或者调用超时的时候,就可以使用zuul提供的降级功能。
在网关服务中新建继承自 FallbackProvider
的 ServiceFallbackProvider
类,并使用 @Component
注解进行修饰。FallbackProvider
会根据是否存在 Throwable
来选择降级方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| @Component public class ServiceFallbackProvider implements FallbackProvider {
@Override public ClientHttpResponse fallbackResponse(Throwable throwable) { StringBuilder reasonBuilder = new StringBuilder("服务故障,请稍后重试!"); if (throwable != null && throwable.getCause() != null) { reasonBuilder.append(" 故障原因: ").append(throwable.getCause().getMessage()); } return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE; }
@Override public int getRawStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.value(); }
@Override public String getStatusText() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase(); }
@Override public void close() {
}
@Override public InputStream getBody() throws IOException { return new ByteArrayInputStream(reasonBuilder.toString().getBytes(Charset.forName("UTF-8"))); }
@Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf(AppConsts.WebConsts.TEXT_PLAIN_UTF8_VALUE)); return headers; } }; }
@Override public String getRoute() { return "*"; }
@Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE; }
@Override public int getRawStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.value(); }
@Override public String getStatusText() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase(); }
@Override public void close() {
}
@Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("服务故障,请稍后重试!".getBytes(Charset.forName("UTF-8"))); }
@Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.valueOf(AppConsts.WebConsts.TEXT_PLAIN_UTF8_VALUE)); return headers; } }; } }
|