一、主题内容
服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级, 以此释放服务器资源以保证核心任务的正常运行。比如电商平台,在针对618、双11等高峰情形下采用部分服务不出现或者延时出现的情形。
二、实现方式
我在spring Cloud项目中,使用了两种方式处理降级操作。
(1)使用feign组件完成降级操作,到内容提供者无法提供服务时, 消费者会调用降级操作,返回服务不可用等信息,或者返回提前准备好的静态页面。 调用的降级处理方法如下:
@Component public class FeignClientFallbackFactory implements FallbackFactory<SchedualServiceHi> { // 打印日志 private static final Logger print = LoggerFactory.getLogger(FeignClientFallbackFactory.class); //降级处理方式 @Override public SchedualServiceHi create(Throwable throwable) { return new SchedualServiceHi() { @Override public String mm(@RequestParam("uname") String uname, @RequestParam("upwd") String upwd) { print.info("fallback; reason was:", throwable); return "服务报错了"; } }; } }
(2)也可以使用zuul网关,在spring Cloud自定义一个类实现ZuulFallbackProvider接口,当出现问题,无法正常调用时 ,为服务提供回退响应。
@Component public class MyfaultFallback implements FallbackProvider { @Override public String getRoute() { // 表示为哪个服务提供回退,此处表示所有微服务。 return "*"; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { // fallback返回的状态码 return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { //数字类型的状态码,本例返回的是200 return this.getStatusCode().value(); } @Override public String getStatusText() throws IOException { //状态文本 return "OK"; } @Override public void close() { } @Override public InputStream getBody() throws IOException { // 响应体 return new ByteArrayInputStream("用户微服务不可用,请稍候再试".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt); return headers; } }; } }
三、效果展示
当我们访问zuul网关时,服务提供者没有开启,访问不到,就会进行降级处理,显示下面内容。