成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

淺析Spring Boot單體應用熔斷技術的使用

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

淺析Spring Boot單體應用熔斷技術的使用

叁、應用改造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 ''; //默認熔斷方法 String defaultFallback() default ''; //熔斷類 Class<?>[] fallbackClass() default {}; //統計異常 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、針對接口配置熔斷方法或者限流方法

默認過濾攔截所有Controller接口

/** * 限流,參數需要和方法保持一致 * @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 ); } /** * 熔斷,參數需要和方法保持一直,并且需要添加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避免大量的開發量

3.1.4、接入dashboard

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

淺析Spring Boot單體應用熔斷技術的使用

3.1.5、規則持久化和動態更新

接入配置中心如:zookeeper等等,并對規則采用推模式

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、針對接口配置熔斷方法

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

3.2.4、配置默認策略

hystrix: command: default: execution: isolation: strategy: THREAD thread: # 線程超時15秒,調用Fallback方法 timeoutInMilliseconds: 15000 metrics: rollingStats: timeInMilliseconds: 15000 circuitBreaker: # 10秒內出現3個以上請求(已臨近閥值),并且出錯率在50%以上,開啟斷路器.斷開服務,調用Fallback方法 requestVolumeThreshold: 3 sleepWindowInMilliseconds: 10000

3.2.5、接入監控

淺析Spring Boot單體應用熔斷技術的使用

淺析Spring Boot單體應用熔斷技術的使用

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

集群監控需要用到注冊中心

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、針對接口配置熔斷方法

/** * 需要參數一致,并且加上相應異常 * @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、配置規則

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

配置的規則可以被代碼覆蓋

3.3.5、配置監控

如grafana等

肆、關注點 是否需要過濾部分異常 是否需要全局默認規則 可能需要引入其他中間件 k8s流量控制 規則存儲和動態修改 接入改造代價 【后面的話】

個人建議的話,比較推薦sentinel,它提供了很多接口便于開發者自己拓展,同時我覺得他的規則動態更新也比較方便。最后是相關示例代碼:單體應用示例代碼

以上就是淺析Spring Boot單體應用熔斷技術的使用的詳細內容,更多關于Spring Boot單體應用熔斷技術的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
免费精品视频最新在线| 免费观看91视频大全| 亚洲h动漫在线| 好吊色欧美一区二区三区四区| xfplay精品久久| 国产在线一区二区| 欧美日韩一区二区三区高清| 日韩电影网1区2区| 亚洲一区欧美激情| 亚洲嫩草精品久久| 99久久精品一区| 欧美精品一区二区三区在线| 北条麻妃一区二区三区| 日韩无一区二区| 国产精品99久久久久久宅男| 成人理论电影网| 国产91对白在线观看九色| 午夜国产精品视频| 在线成人av网站| 国产成人一区在线| 欧美一区二区美女| 色视频成人在线观看免| 亚洲成人原创| 色婷婷综合久久久| 精品人伦一区二区色婷婷| 国产精品乱码人人做人人爱| 亚洲精品你懂的| 麻豆国产欧美日韩综合精品二区| 粉嫩一区二区三区性色av| 欧美性色综合| 在线观看日韩精品| 国产欧美1区2区3区| 五月开心婷婷久久| www.成人在线| 麻豆9191精品国产| 日韩色视频在线观看| 国产精品不卡一区| 捆绑变态av一区二区三区| 高清日韩电视剧大全免费| 亚洲国产清纯| 在线观看不卡一区| 中文字幕第一区第二区| 男女男精品网站| 色综合天天视频在线观看 | 天天免费综合色| 99re66热这里只有精品3直播 | 一区二区中文视频| 国产精品主播直播| 欧美亚洲不卡| 日韩一区二区三区在线视频| 亚洲国产综合在线| www.视频一区| 精品视频123区在线观看| 久久久精品天堂| 九色|91porny| 亚洲一区二区三区在线观看视频| 欧美大肚乱孕交hd孕妇| 亚洲成年人影院| 欧美日韩综合网| 欧美日韩国产免费| 亚洲精品videosex极品| 成人avav影音| 欧美日韩成人综合在线一区二区| 亚洲精品免费在线观看| 欧美日本韩国一区二区三区| 欧美在线观看视频在线| 一区二区三区四区不卡在线| 91网站最新地址| 日韩午夜电影av| 久久精品99国产精品日本| 久久久久久久久久久一区 | 日韩**一区毛片| 欧美先锋影音| 久久久久99精品国产片| 国产mv日韩mv欧美| 欧美日韩美少妇| 丝袜脚交一区二区| 国产亚洲二区| 一区二区三区视频在线看| 欧美精品系列| 国产欧美精品一区aⅴ影院 | 成人国产免费视频| 欧美日韩一区二区电影| 毛片av中文字幕一区二区| 免费久久99精品国产自| 亚洲男女一区二区三区| 尤妮丝一区二区裸体视频| 国产精品视频麻豆| 91视视频在线直接观看在线看网页在线看 | 国产99久久久久| 欧美日韩精品福利| 国产激情一区二区三区桃花岛亚洲| 日本福利一区二区| 美女精品一区二区| 日韩一区二区在线看片| 成人自拍视频在线| 日韩欧美国产系列| 91小视频在线| 亚洲女同一区二区| 国产伦精品一区二区三| 亚洲h在线观看| 欧美亚洲国产怡红院影院| 奇米精品一区二区三区在线观看一| 久久久亚洲一区| 视频一区国产视频| 日本精品裸体写真集在线观看| 美女视频一区二区三区| 在线视频国产一区| 国产福利一区在线| 国产欧美一区二区三区沐欲 | 成人激情午夜影院| 久久久精品日韩欧美| 亚洲黄色视屏| 亚洲高清中文字幕| 欧美亚洲综合久久| 国产99精品国产| 国产精品青草综合久久久久99| 一区二区三区四区国产| 日韩二区三区在线观看| 欧美日韩亚洲综合一区二区三区| 麻豆91免费观看| 欧美一二三区精品| 欧美激情一区| 亚洲电影视频在线| 欧美一区二区私人影院日本| 91视频观看视频| 亚洲一区二区三区四区在线观看 | 日韩视频精品在线观看| 午夜不卡av在线| 欧美电视剧在线看免费| 欧美视频亚洲视频| 天天av天天翘天天综合网| 欧美高清视频一二三区 | 日韩成人免费电影| 在线综合+亚洲+欧美中文字幕| 欧美在线视频一区二区三区| 亚洲一区在线看| 欧美精品1区2区| 亚洲国产日韩在线| 蜜臀久久99精品久久久久久9| 精品国产三级电影在线观看| 国产精品欧美久久| 国精品**一区二区三区在线蜜桃| 国产欧美视频一区二区三区| 欧洲一区二区三区在线| 91麻豆国产在线观看| 石原莉奈在线亚洲三区| 久久久久免费观看| 欧美视频完全免费看| 亚洲精品一区二区三区蜜桃久| 国产盗摄精品一区二区三区在线| 亚洲精选免费视频| 久久亚洲精华国产精华液| 蜜桃久久av| 国产一区视频观看| 国产91丝袜在线播放0| 亚洲国产婷婷综合在线精品| 精品日韩一区二区| 欧美在线三级电影| 夜夜爽www精品| 色综合一个色综合| 国产成人免费av在线| 日本网站在线观看一区二区三区| 中文字幕中文乱码欧美一区二区| 日韩一区二区免费电影| 美女黄色成人网| 欧美日韩免费| 懂色av噜噜一区二区三区av| 婷婷综合五月天| 国产精品久久久久久福利一牛影视| 欧美日韩精品高清| 亚洲一区成人| 欧美三级不卡| 91啪亚洲精品| 国产一区二区三区黄视频| 亚洲成人三级小说| 国产三级精品视频| 欧美一级二级在线观看| 91久久人澡人人添人人爽欧美| 极品日韩久久| 欧美在线首页| 粉嫩aⅴ一区二区三区四区 | 国产精品久久一级| 国产人久久人人人人爽| 欧美一卡2卡3卡4卡| 欧美色图在线观看| 日本韩国精品在线| 亚洲永久网站| 久久亚洲不卡| 一本色道久久综合亚洲91| 亚洲在线一区| 在线视频一区观看| 国产一区二区高清| 国产精品普通话对白| 亚洲精品在线二区| 国产欧美一区二区色老头| 国产一区二区三区黄| 国产伦精品一区二区三区高清版| 亚洲一区二区三区在线观看视频 | 亚洲在线网站|