降级与熔断

降级与熔断,第1张

降级与熔断

1.1、降级

降级也就是服务降级,当我们的服务器压力剧增,为了保证核心功能的可用性,可以选择性的降低一些功能的可用性,或者直接关闭该功能。典型的弃车保帅! 就比如贴吧类型的网站,当服务器吃不消的时候,可以选择把发帖功能关闭,注册功能关闭,改密码,改头像这些都关了,为了确保登录和浏览帖子这种核心的功能。

1.2、熔断

降级一般而言是我们自身的系统出现了故障而降级。而熔断一般是指依赖的外部接口出现故障,断绝和外部接口之间的关联。

例如你的A服务里面的一个功能依赖B服务,这时候B服务出问题了,返回的很慢。这种情况可能会因为这么一个功能而拖慢了A服务里面的所有功能,因此我们这时候就需要熔断!即当发现A要调用这B时就直接返回错误(或者返回其他默认值啊啥的),就不去请求B了。

1.3、熔断状态

三种状态:

Close 关闭状态,熔断器的初始化状态,允许请求通过

Open 开放状态,即熔断状态,不允许请求通过

HalfOpen 半开放状态,允许部分请求通过

1.4、hystrix包详解

hystrix是Netflix的开源库,go版本是hystrix-go。

主要以下几个模块:setting,hystrix,circuit,metrics,pool和eventstream。

1.4.1、settings

setting 用来管理熔断器的配置,包括存储,新增和读取。

map+读写锁实现多个circuit的配置。

Timeout: 执行command的超时时间。默认时间是1000毫秒

MaxConcurrentRequests:command的最大并发量 默认值是10

SleepWindow:当熔断器被打开后,SleepWindow的时间就是控制过多久后去尝试服务是否可用了。默认值是5000毫秒

RequestVolumeThreshold: 一个统计窗口10秒内请求数量。达到这个请求数量后才去判断是否要开启熔断。默认值是20

ErrorPercentThreshold:错误百分比,请求数量大于等于RequestVolumeThreshold并且错误率到达这个百分比后就会启动熔断 默认值是50

1.4.2、circuit 

circuit 用来管理熔断器的状态变更。

除此之外,circuit还上报事件给统计器

创建circuit的时候,会根据配置创建相应的metric和exePool

1.4.3、metrics

 metrics用来统计和计算请求的响应情况。

每一个Command都会有一个默认统计控制器,当然也可以添加多个自定义的控制器。 默认的统计控制器DefaultMetricCollector保存着熔断器的所有状态,调用次数,失败次数,被拒绝次数等等。

在执行newMetricExchange的时候会启动一个协程 go m.Monitor()去监控Updates的数据,然后上报给metricCollectors 保存执行的信息数据比如前面提到的调用次数,失败次数,被拒绝次数等等。

1.4.3、pool

pool 用来管理请求池,控制请求池最大数目以及请求ticket的发放和回收。

1.4.4、hystrix 

hystrix 是熔断器的主要部分,对外提供同步和异步的方法,对内上报请求事件以及fallback降级处理。

func GoC(ctx context.Context, name string, run runFuncC, fallback fallbackFuncC) chan error

参考:https://cloud.tencent.com/developer/article/1478016

服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。比如电商平台,在针对618、双11等高峰情形下采用部分服务不出现或者延时出现的情形。

二、实现方式

我在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    } 

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/542987.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-26
下一篇2023-06-26

发表评论

登录后才能评论

评论列表(0条)

    保存