亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

瀏覽:2日期:2023-07-25 17:37:24
壹、入圍方案Sentinel github地址:https://sentinelguard.io/zh-cn/docs/introduction.html 阿里出品,Spring Cloud Alibaba限流組件,目前持續(xù)更新中 自帶Dashboard,可以查看接口Qps等,并且可以動(dòng)態(tài)修改各種規(guī)則 流量控制,直接限流、冷啟動(dòng)、排隊(duì) 熔斷降級(jí),限制并發(fā)限制數(shù)和相應(yīng)時(shí)間 系統(tǒng)負(fù)載保護(hù),提供系統(tǒng)級(jí)別防護(hù),限制總體CPU等 主要核心:資源,規(guī)則(流量控制規(guī)則、熔斷降級(jí)規(guī)則、系統(tǒng)保護(hù)規(guī)則、來源訪問控制規(guī)則 和 熱點(diǎn)參數(shù)規(guī)則。),和指標(biāo) 文檔非常清晰和詳細(xì),中文 支持動(dòng)態(tài)規(guī)則(推模式和拉模式) Hystrix github地址:https://github.com/Netflix/Hystrix/wiki Netflix出品,Spring Cloud Netflix限流組件,已經(jīng)停止新特性開發(fā),只進(jìn)行bug修復(fù),最近更新為2018年,功能穩(wěn)定 有簡(jiǎn)單的dashboard頁面 以隔離和熔斷為主的容錯(cuò)機(jī)制,超時(shí)或被熔斷的調(diào)用將會(huì)快速失敗,并可以提供 fallback 機(jī)制的初代熔斷框架,異常統(tǒng)計(jì)基于滑動(dòng)窗口 resilience4j github地址:https://resilience4j.readme.io/docs 是一款輕量、簡(jiǎn)單,并且文檔非常清晰、豐富的熔斷工具。是Hystrix替代品,實(shí)現(xiàn)思路和Hystrix一致,目前持續(xù)更新中 需要自己對(duì)micrometer、prometheus以及Dropwizard metrics進(jìn)行整合 CircuitBreaker 熔斷 Bulkhead 隔離 RateLimiter QPS限制 Retry 重試 TimeLimiter 超時(shí)限制 Cache 緩存 自己實(shí)現(xiàn)(基于Guava) 基于Guava的令牌桶,可以輕松實(shí)現(xiàn)對(duì)QPS進(jìn)行限流 貳、技術(shù)對(duì)比

淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

叁、應(yīng)用改造3.1、sentinel

3.1.1、引入依賴

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.0.3.RELEASE</version></dependency>

3.1.2、改造接口或者service層

@SentinelResource(value = 'allInfos',fallback = 'errorReturn')

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inheritedpublic @interface SentinelResource { //資源名稱 String value() default ''; //流量方向 EntryType entryType() default EntryType.OUT; //資源類型 int resourceType() default 0; //異常處理方法 String blockHandler() default ''; //異常處理類 Class<?>[] blockHandlerClass() default {}; //熔斷方法 String fallback() default ''; //默認(rèn)熔斷方法 String defaultFallback() default ''; //熔斷類 Class<?>[] fallbackClass() default {}; //統(tǒng)計(jì)異常 Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class}; //忽略異常 Class<? extends Throwable>[] exceptionsToIgnore() default {};}

@RequestMapping('/get')@ResponseBody@SentinelResource(value = 'allInfos',fallback = 'errorReturn')public JsonResult allInfos(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num){ try { if (num % 2 == 0) {log.info('num % 2 == 0');throw new BaseException('something bad with 2', 400); } return JsonResult.ok(); } catch (ProgramException e) { log.info('error'); return JsonResult.error('error'); } }

3.1.3、針對(duì)接口配置熔斷方法或者限流方法

默認(rèn)過濾攔截所有Controller接口

/** * 限流,參數(shù)需要和方法保持一致 * @param request * @param response * @param num * @return * @throws BlockException */ public JsonResult errorReturn(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num) throws BlockException { return JsonResult.error('error 限流' + num ); } /** * 熔斷,參數(shù)需要和方法保持一直,并且需要添加BlockException異常 * @param request * @param response * @param num * @param b * @return * @throws BlockException */ public JsonResult errorReturn(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num,BlockException b) throws BlockException { return JsonResult.error('error 熔斷' + num ); }

注意也可以不配置限流或者熔斷方法。通過全局異常去捕獲UndeclaredThrowableException或者BlockException避免大量的開發(fā)量

3.1.4、接入dashboard

spring: cloud: sentinel: transport: port: 8719 dashboard: localhost:8080

淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

3.1.5、規(guī)則持久化和動(dòng)態(tài)更新

接入配置中心如:zookeeper等等,并對(duì)規(guī)則采用推模式

3.2、hystrix

3.2.1、引入依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>2.0.4.RELEASE</version></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.0.4.RELEASE</version></dependency>

3.2.2、改造接口

@HystrixCommand(fallbackMethod = 'timeOutError')

@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface HystrixCommand { String groupKey() default ''; String commandKey() default ''; String threadPoolKey() default ''; String fallbackMethod() default ''; HystrixProperty[] commandProperties() default {}; HystrixProperty[] threadPoolProperties() default {}; Class<? extends Throwable>[] ignoreExceptions() default {}; ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER; HystrixException[] raiseHystrixExceptions() default {}; String defaultFallback() default '';}

@RequestMapping('/get')@ResponseBody@HystrixCommand(fallbackMethod = 'fallbackMethod')public JsonResult allInfos(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num){ try { if (num % 3 == 0) { log.info('num % 3 == 0'); throw new BaseException('something bad whitch 3', 400); } return JsonResult.ok(); } catch (ProgramException | InterruptedException exception) { log.info('error'); return JsonResult.error('error'); }}

3.2.3、針對(duì)接口配置熔斷方法

/** * 該方法是熔斷回調(diào)方法,參數(shù)需要和接口保持一致 * @param request * @param response * @param num * @return */public JsonResult fallbackMethod(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num) { response.setStatus(500); log.info('發(fā)生了熔斷!!'); return JsonResult.error('熔斷');}

3.2.4、配置默認(rèn)策略

hystrix: command: default: execution: isolation: strategy: THREAD thread: # 線程超時(shí)15秒,調(diào)用Fallback方法 timeoutInMilliseconds: 15000 metrics: rollingStats: timeInMilliseconds: 15000 circuitBreaker: # 10秒內(nèi)出現(xiàn)3個(gè)以上請(qǐng)求(已臨近閥值),并且出錯(cuò)率在50%以上,開啟斷路器.斷開服務(wù),調(diào)用Fallback方法 requestVolumeThreshold: 3 sleepWindowInMilliseconds: 10000

3.2.5、接入監(jiān)控

淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用

曲線:用來記錄2分鐘內(nèi)流量的相對(duì)變化,我們可以通過它來觀察到流量的上升和下降趨勢(shì)。

集群監(jiān)控需要用到注冊(cè)中心

3.3、resilience4j

3.3.1、引入依賴

dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> <version>1.6.1</version></dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-bulkhead</artifactId> <version>1.6.1</version></dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-ratelimiter</artifactId> <version>1.6.1</version></dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-timelimiter</artifactId> <version>1.6.1</version></dependency>

可以按需要引入:bulkhead,ratelimiter,timelimiter等

3.3.2、改造接口

@RequestMapping('/get')@ResponseBody//@TimeLimiter(name = 'BulkheadA',fallbackMethod = 'fallbackMethod')@CircuitBreaker(name = 'BulkheadA',fallbackMethod = 'fallbackMethod')@Bulkhead(name = 'BulkheadA',fallbackMethod = 'fallbackMethod')public JsonResult allInfos(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num){ log.info('param----->' + num); try { //Thread.sleep(num); if (num % 2 == 0) { log.info('num % 2 == 0'); throw new BaseException('something bad with 2', 400); } if (num % 3 == 0) { log.info('num % 3 == 0'); throw new BaseException('something bad whitch 3', 400); } if (num % 5 == 0) { log.info('num % 5 == 0'); throw new ProgramException('something bad whitch 5', 400); } if (num % 7 == 0) { log.info('num % 7 == 0'); int res = 1 / 0; } return JsonResult.ok(); } catch (BufferUnderflowException e) { log.info('error'); return JsonResult.error('error'); }}

3.3.3、針對(duì)接口配置熔斷方法

/** * 需要參數(shù)一致,并且加上相應(yīng)異常 * @param request * @param response * @param num * @param exception * @return */public JsonResult fallbackMethod(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer num, BulkheadFullException exception) { return JsonResult.error('error 熔斷' + num );}

3.3.4、配置規(guī)則

resilience4j.circuitbreaker: instances: backendA: registerHealthIndicator: true slidingWindowSize: 100 backendB: registerHealthIndicator: true slidingWindowSize: 10 permittedNumberOfCallsInHalfOpenState: 3 slidingWindowType: TIME_BASED minimumNumberOfCalls: 20 waitDurationInOpenState: 50s failureRateThreshold: 50 eventConsumerBufferSize: 10 recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate resilience4j.retry: instances: backendA: maxRetryAttempts: 3 waitDuration: 10s enableExponentialBackoff: true exponentialBackoffMultiplier: 2 retryExceptions:- org.springframework.web.client.HttpServerErrorException- java.io.IOException ignoreExceptions:- io.github.robwin.exception.BusinessException backendB: maxRetryAttempts: 3 waitDuration: 10s retryExceptions:- org.springframework.web.client.HttpServerErrorException- java.io.IOException ignoreExceptions:- io.github.robwin.exception.BusinessException resilience4j.bulkhead: instances: backendA: maxConcurrentCalls: 10 backendB: maxWaitDuration: 10ms maxConcurrentCalls: 20 resilience4j.thread-pool-bulkhead: instances: backendC: maxThreadPoolSize: 1 coreThreadPoolSize: 1 queueCapacity: 1 resilience4j.ratelimiter: instances: backendA: limitForPeriod: 10 limitRefreshPeriod: 1s timeoutDuration: 0 registerHealthIndicator: true eventConsumerBufferSize: 100 backendB: limitForPeriod: 6 limitRefreshPeriod: 500ms timeoutDuration: 3s resilience4j.timelimiter: instances: backendA: timeoutDuration: 2s cancelRunningFuture: true backendB: timeoutDuration: 1s cancelRunningFuture: false

配置的規(guī)則可以被代碼覆蓋

3.3.5、配置監(jiān)控

如grafana等

肆、關(guān)注點(diǎn) 是否需要過濾部分異常 是否需要全局默認(rèn)規(guī)則 可能需要引入其他中間件 k8s流量控制 規(guī)則存儲(chǔ)和動(dòng)態(tài)修改 接入改造代價(jià) 【后面的話】

個(gè)人建議的話,比較推薦sentinel,它提供了很多接口便于開發(fā)者自己拓展,同時(shí)我覺得他的規(guī)則動(dòng)態(tài)更新也比較方便。最后是相關(guān)示例代碼:單體應(yīng)用示例代碼

以上就是淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot單體應(yīng)用熔斷技術(shù)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产精品亚洲一区二区三区正片 | 国产免费福利视频一区二区 | 在线视频免费观看短视频 | 一级日本大片免费观看视频 | 国产欧美精品系列在线播放 | 亚洲综合网国产福利精品一区 | 亚洲日韩欧美制服二区dvd | 日韩中文有码高清 | 国产不卡一区二区三区免费视 | 日韩经典欧美精品一区 | 欧美一区二区三区四区在线观看 | 欧美aaa性bbb毛片 | 影音先锋5566中文源资源 | 国产永久地址 | aaa国产一级毛片 | 婷婷丁香视频 | 国内自拍视频在线播放 | 偷拍小视频99在线 | 午夜精品影院 | 国产欧美日韩视频怡春院 | 久久久精品午夜免费不卡 | 日本黄色片在线 | 免费一级欧美在线观看视频片 | 国产一区亚洲二区三区毛片 | 欧美日韩中文字幕久久伊人 | 欧美伦理片在线观看 | 欧美一区二区三区久久综合 | 国产一区二区三区欧美 | 99久久久精品免费观看国产 | 黄色综合 | aⅴ在线免费观看 | 亚洲精品a | 91视频观看 | 女人色毛片女人色毛片中国 | 亚洲免费中字慕日产2021 | 蜜桃臀久久伊人福利 | 精品国产高清a毛片 | 麻豆视频www | 国产一区二区三区在线免费 | 国产精品二区三区免费播放心 | 黄色网址在线免费 |