二、实现方式
我在spring Cloud项目中,使用了两种方式处理降级操作。
(1)使用feign组件完成降级操作,到内容提供者无法提供服务时, 消费者会调用降级操作,返回服务不可用等信息,或者返回提前准备好的静态页面。 调用的降级处理方法如下:
1@Component
2public class FeignClientFallbackFactory implements FallbackFactory<SchedualServiceHi> {
3 // 打印日志
4 private static final Logger print = LoggerFactory.getLogger(FeignClientFallbackFactory.class)
5 //降级处理方式
6 @Override
7 public SchedualServiceHi create(Throwable throwable) {
8 return new SchedualServiceHi() {
9 @Override
10 public String mm(@RequestParam("uname") String uname, @RequestParam("upwd") String upwd) {
11 print.info("fallbackreason was:", throwable)
12 return "服务报错了"
13 }
14 }
15 }
16}
(2)也可以使用zuul网关,在spring Cloud自定义一个类实现ZuulFallbackProvider接口,当出现问题,无法正常调用时 ,为服务提供回退响应。
1@Component
2public class MyfaultFallback implements FallbackProvider {
3 @Override
4 public String getRoute() {
5// 表示为哪个服务提供回退,此处表示所有微服务。
6 return "*"
7 }
8
9 @Override
10 public ClientHttpResponse fallbackResponse(String route, Throwable cause) {11 return new ClientHttpResponse() {
12 @Override
13 public HttpStatus getStatusCode() throws IOException {
14// fallback返回的状态码
15 return HttpStatus.OK
16 }
17
18 @Override
19 public int getRawStatusCode() throws IOException {
20 //数字类型的状态码,本例返回的是200
21 return this.getStatusCode().value()
22 }
23
24 @Override
25 public String getStatusText() throws IOException {
26 //状态文本27 return "OK"
28 }
29
30 @Override
31 public void close() {
32
33 }
34
35 @Override
36 public InputStream getBody() throws IOException {
37// 响应体38 return new ByteArrayInputStream("用户微服务不可用,请稍候再试".getBytes())
39 }
40
41 @Override
42 public HttpHeaders getHeaders() {
43 HttpHeaders headers = new HttpHeaders()
44 headers.setContentType(MediaType.APPLICATION_JSON)
45 MediaType mt = new MediaType("application",
46 "json", Charset.forName("UTF-8"))
47 headers.setContentType(mt)
48 return headers
49 }
50 }
51 }
52}
三、效果展示
当我们访问zuul网关时,服务提供者没有开启,访问不到,就会进行降级处理,显示下面内容。
原文链接:https://zhuanlan.zhihu.com/p/69635613
目前APP业务中启用的定时任务已达到400+,目前管理比较混乱,很多任务运行时占用服务器资源巨大,其中不乏一些非紧急的任务,平时并不会有太大影响,但是当流量高峰来临时,这些定时任务可能会成为压死骆驼的最后一根稻草。为了避免出现这样的问题,我们通常会在高流量来之前去调整一些定时任务的执行间隔时间或者暂停一些不影响服务的定时任务。这样做的弊端是工作量很大,同时难免会有遗漏。由此衍生除了对任务分级的诉求。对任务分级后,高峰流量时,可视情况降级相关等级的定时任务。
PS:设计核心流程的任务等,如支付回调
PS:任务中设计到事务等
基于gocron的任务节点做任务分级,不同级别的任务对应不同的gocron节点。如下图:
把三级任务放在三级节点上跑,如下图:
以此类推,不同级别的任务跑在对应级别的节点上。
当流量高峰来临时,我们想通过停掉所有三级任务来实现快速降级,而这个操作仅仅需要关闭对应节点的连接即可。如下图
PS:这个操作同时会停止所有正在运行的任务
举个例子:目前我的三级任务节点上运行了一个同步数据的任务(预计5分钟左右能执行完),当我把三级任务节点关闭时,这个任务会直接失败,在节点对应的机器上我们可以看到所有进程也被直接kill掉了,即使我的任务是多进程在跑,相应的子进程也会被kill掉。如下:
当前正在服务的三级节点-asgard三级定时任务
当前正在节点-asgard三级定时任务上运行的任务-商品数据整合同步搜索个推库
节点服务器上正在运行的进程
这时候我们关闭asgard三级定时任务这个节点
可以看到任务直接执行失败了
同时,节点服务器上的进程也被kill掉了
由于二级任务可能涉及到事务等操作,非万分紧急情况下不能直接终止,以免导致脏数据的产生。对于这种任务的降级我们不能直接通过节点的方式停止任务。可以通过关闭任务的方式停止。如下:
PS:关闭任务的操作会等当前的任务执行完成再关闭,不会对当前任务产生任何影响
举个例子:
还拿asgard三级定时任务这个节点来看,目前这个节点在链接状态
这个节点下跑了一个任务
同样的,节点服务器上有对应的进程在跑着
这时候,我们关闭这个任务
我们可以看到,关闭这个任务,不会影响正在执行的任务
节点对应的服务器上的任务也正常在跑
PS:这个关闭任务对应的是,完成当前任务后不再执行新的任务。
1、基于gocron的任务节点对任务做分级处理
2、一、二、三级任务的划分
3、服务降级的两种方式:关闭节点&关闭任务
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)