免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      微服務(wù)前置檢查框架實踐

      前言

      微服務(wù)架構(gòu)中,前置檢查功能項對于服務(wù)的可靠性有重要意義,使用場景如:

      1、如檢查基礎(chǔ)服務(wù),如不正常需要熔斷

      2、如檢查被依賴服務(wù),不正常需要熔斷

      3、本服務(wù)有較長的初始化邏輯,需要完成后,才能通知提供正常REST功能

      實踐

      import com.google.common.util.concurrent.ThreadFactoryBuilder;import lombok.extern.slf4j.Slf4j;import java.util.List;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.function.Consumer;@Slf4jpublic class ApplicationStartupChecker { private boolean checkSwitch = true; private ScheduledExecutorService scheduledExecutorService; private Consumer passConsumer; private AdvanceCheckRegister advanceCheckRegister = new AdvanceCheckRegisterImpl(); private String threadName; private int checkCycle; private TimeUnit timeUnit; private int checkCount = 0; public ApplicationStartupChecker(String threadName, int checkCycle, TimeUnit timeUnit) { scheduledExecutorService = new ScheduledThreadPoolExecutor( 1, new ThreadFactoryBuilder().setNameFormat(threadName + “-%d”).setDaemon(true).build()); this.threadName = threadName; this.checkCycle = checkCycle; this.timeUnit = timeUnit; } public ApplicationStartupChecker(String threadName) { this(threadName, 30, TimeUnit.SECONDS); } public void bootstrap() { if (scheduledExecutorService.isShutdown() || scheduledExecutorService.isTerminated()) { scheduledExecutorService = new ScheduledThreadPoolExecutor( 1, new ThreadFactoryBuilder().setNameFormat(threadName + “-%d”).build()); } scheduledExecutorService.schedule(this::guidance, 0, TimeUnit.SECONDS); } private void guidance() { if (!checkSwitch) { scheduledExecutorService.shutdown(); log.info(“Not need check”); if (passConsumer != null) { passConsumer.accept(advanceCheckRegister.getCheckerNames()); } } checkCount++; log.info(“No.{} app startup checking”, checkCount); try { advanceCheckRegister.foreach(Checker::check); } catch (Throwable e) { log.error(“check with error.”, e); } boolean pass = advanceCheckRegister.pass(); if (pass) { scheduledExecutorService.shutdown(); log.info(“All check passed:{}”, String.join(“,”, advanceCheckRegister.getCheckerNames())); if (passConsumer != null) { passConsumer.accept(advanceCheckRegister.getCheckerNames()); } } else { scheduledExecutorService.schedule(this::guidance, this.checkCycle, this.timeUnit); } } public void setPassConsumer(Consumer passConsumer) { this.passConsumer = passConsumer; } public void addChecker(Checker kafkaHealthChecker) { advanceCheckRegister.registerEntity(kafkaHealthChecker); }}

      配置用于保存檢查項:

      import java.util.List;import java.util.function.Consumer;public interface AdvanceCheckRegister { void registerEntity(Checker checkEntity); boolean pass(); void foreach(Consumer consumer); List getCheckerNames();}package com.zte.sdn.oscp.check;import java.util.ArrayList;import java.util.List;import java.util.Objects;import java.util.function.Consumer;import java.util.stream.Collectors;public class AdvanceCheckRegisterImpl implements AdvanceCheckRegister { private final List checkEntityList = new ArrayList(); @Override public void registerEntity(Checker entity) { Objects.requireNonNull(entity,”Register Checker can not be null.”); if ( entity.getName() == null || entity.getName().isEmpty()) { throw new IllegalArgumentException(entity.getClass().getSimpleName()+” must have valid name”); } checkEntityList.add(entity); } @Override public boolean pass() { return this.checkEntityList.stream().allMatch(Checker::isPass); } @Override public void foreach(Consumer consumer) { for (Checker checkEntity : checkEntityList) { boolean check = checkEntity.check(); checkEntity.setPass(check); if (!check) { return; } } } @Override public List getCheckerNames() { return checkEntityList.stream().map(Checker::getName).collect(Collectors.toList()); }}

      檢測項接口

      public interface Checker { String getName(); boolean check(); boolean isPass(); void setPass(boolean pass);}package com.zte.sdn.oscp.check;public abstract class AbstractChecker implements Checker { private boolean pass; @Override public boolean isPass() { return this.pass; } @Override public void setPass(boolean pass) { this.pass = pass; }}

      檢查項

      新增Checker項,只需要繼承指定接口,實現(xiàn)檢測邏輯,即可

      public class DataBaseHealthChecker extends AbstractChecker { @Override public String getName() { return “DataBaseHealthChecker”; } @Getter @VisibleForTesting private int count; @Override public boolean check() { count++; if (count >= 3) { return true; } return false; }}

      測試

      循環(huán)檢測直至通過,通過后回調(diào)對應(yīng)方法,不過這是單獨線程,不會阻塞主線

      public class CheckTest { @Test public void checkTest() throws InterruptedException { ApplicationStartupChecker applicationStartupChecker = new ApplicationStartupChecker(“abc”); KafkaHealthChecker kafkaHealthChecker = new KafkaHealthChecker(); DataBaseHealthChecker dataBaseHealthChecker = new DataBaseHealthChecker(); applicationStartupChecker.addChecker(kafkaHealthChecker); applicationStartupChecker.addChecker(dataBaseHealthChecker); CountDownLatch latch = new CountDownLatch(1); applicationStartupChecker.setPassConsumer(t -> { latch.countDown(); }); applicationStartupChecker.bootstrap(); latch.await(); int kafkaCheck = kafkaHealthChecker.getCount(); int dbCheck = dataBaseHealthChecker.getCount(); Assert.assertEquals(5, kafkaCheck, 0.0); Assert.assertEquals(3, dbCheck, 0.0); } @Test public void checkTestNOChecker() throws InterruptedException { ApplicationStartupChecker applicationStartupChecker = new ApplicationStartupChecker(“abc”); CountDownLatch latch = new CountDownLatch(1); applicationStartupChecker.setPassConsumer(t -> { latch.countDown(); }); applicationStartupChecker.bootstrap(); latch.await(); } @Test public void checkTestNoConsumer() throws InterruptedException { ApplicationStartupChecker applicationStartupChecker = new ApplicationStartupChecker(“abc”); KafkaHealthChecker kafkaHealthChecker = new KafkaHealthChecker(); DataBaseHealthChecker dataBaseHealthChecker = new DataBaseHealthChecker(); applicationStartupChecker.addChecker(kafkaHealthChecker); applicationStartupChecker.addChecker(dataBaseHealthChecker); applicationStartupChecker.bootstrap(); while (dataBaseHealthChecker.getCount() < 3) { TimeUnit.SECONDS.sleep(5); } Assert.assertEquals(5, kafkaHealthChecker.getCount(), 0.0); Assert.assertEquals(3, dataBaseHealthChecker.getCount(), 0.0); } @Test public void checkTestNoConsumerTimeOut() throws InterruptedException { ApplicationStartupChecker applicationStartupChecker = new ApplicationStartupChecker("abc", 2, TimeUnit.SECONDS); KafkaHealthChecker kafkaHealthChecker = new KafkaHealthChecker(); DataBaseHealthChecker dataBaseHealthChecker = new DataBaseHealthChecker(); applicationStartupChecker.addChecker(kafkaHealthChecker); applicationStartupChecker.addChecker(dataBaseHealthChecker); applicationStartupChecker.bootstrap(); while (dataBaseHealthChecker.getCount() { latch.countDown(); }); applicationStartupChecker.bootstrap(); applicationStartupChecker.bootstrap(); applicationStartupChecker.bootstrap(); applicationStartupChecker.bootstrap(); latch.await(); int kafkaCheck = kafkaHealthChecker.getCount(); int dbCheck = dataBaseHealthChecker.getCount(); Assert.assertEquals(5, kafkaCheck, 0.0); Assert.assertEquals(3, dbCheck, 0.0); }}

      其它

      如果想產(chǎn)生檢查不通過,程序不進行下一步動作的強依賴,實際上也簡單,只需要在ApplicationStartupChecker中增加

      >private CountDownLatch wait=new CountDownLatch(1);

      檢查通過后減1,主程序中await即可。

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
      (0)
      用戶投稿
      上一篇 2022年6月13日 18:05
      下一篇 2022年6月13日 18:05

      相關(guān)推薦

      • 電腦技巧:Win11操作系統(tǒng)安裝圖解教程

        首先想要安裝win 11系統(tǒng),建議先安裝windows11配置健康檢測工具來確認(rèn)你一下自己的電腦是否能安裝Win11。 下載地址:https://aka.ms/GetPCHealt…

        2022年6月29日
      • 分享制作網(wǎng)站建設(shè)方案的5個步驟(網(wǎng)站建設(shè)方案該怎么制作)

        網(wǎng)站是用戶獲取信息的一個非常經(jīng)常會使用到的方法,在使用的時候擁有豐富的功能,對于許多公司都有極為重要的作用。我們可能發(fā)現(xiàn)一種現(xiàn)象,不管是大公司還是小微型公司,都會建設(shè)屬于自己的官網(wǎng)…

        2022年10月18日
      • 作戰(zhàn)靴,硬漢時尚帥氣的不二選擇,5款知名品牌推薦

        作戰(zhàn)靴,軍靴的一種,屬單兵裝備,常用于叢林和山地作戰(zhàn)等。作戰(zhàn)靴最早源于羅馬帝國時代,在二戰(zhàn)時候基本除了亞洲這邊,多數(shù)參戰(zhàn)國都用作戰(zhàn)靴。 作戰(zhàn)靴為專為軍人或者相關(guān)單位于訓(xùn)練及作戰(zhàn)所需…

        2022年7月30日
      • 27寸2K顯示器限時699元秒殺

        這款27英寸的2K顯示器目前京東售價699元,可以說非常具有性價比,喜歡的朋友不要錯過。這款顯示器采用了27英寸的屏幕尺寸,能夠為用戶提供更為寬廣的視野。分辨率則是采用了2K的屏幕…

        2022年9月2日
      • 如何避免steam賬號被盜,三招教你解決

        現(xiàn)在很多玩家在網(wǎng)吧登錄steam賬號被盜已經(jīng)是很常見的問題了,尤其是對于吃雞玩家來說真是苦不堪言,經(jīng)常有人表示剛注冊的賬號買了新游戲就被盜了,然后就立馬被封了,這樣又要重新再來了,…

        2022年8月27日
      • 新型充電技術(shù)來了!不是無線充電,而是光速秒充

        智能手機自誕生以來,功能就在不斷豐富,使用領(lǐng)域也一直在擴展中,這也改變了很多行業(yè)。 比如立體聲音樂,讓MP3成為歷史;高清視頻播放,MP4播放器又被扔進了垃圾堆;還有就是攝像功能的…

        2022年6月16日
      • 小米手機的4個“隱藏功能”你知道嗎?

        目前,全球的手機用戶中使用小米智能手機的越來越多。小米手機的品質(zhì)也始終是在不斷升級。但是,即便你是多年的小米手機用戶,你可能也不清楚它存在這4個隱藏的功能。下面就聽小編一一介紹吧!…

        2022年7月25日
      • 買了都后悔!洗碗機選購指南2022版

        這是一個老梗了,買了洗碗機的都后悔了,后悔啥?買晚了 歡迎回來, 我是知電實驗室的曉春哥 今天我們就不聊為啥要買洗碗機了,直接進入主題,在2022年,如何選擇一臺洗碗機。 3點注意…

        2022年8月5日
      • 中科院宣布好消息,事關(guān)國產(chǎn)芯片架構(gòu),外媒:“攔不住”了

        點擊關(guān)注,每天精彩不斷! 導(dǎo)讀:中科院宣布好消息,事關(guān)國產(chǎn)芯片架構(gòu),外媒:“攔不住”了! 眾所周知,隨著半導(dǎo)體芯片產(chǎn)業(yè)的快速發(fā)展,如今各行各業(yè)都開始離不開半導(dǎo)體芯片的支持了,在智能…

        2022年9月5日
      • 超強游戲本聯(lián)想拯救者要來了,6月30發(fā)布,12代i9配3080Ti強無敵

        今天,聯(lián)想宣布 Y9000K 旗艦游戲本將在 6 月 30 日發(fā)布,我們都知道“拯救者”系列作為聯(lián)想高端游戲本的存在,性能釋放妥妥滴筆記本行列第一梯隊,這次聯(lián)想也是直接在海報曬出了…

        2022年6月26日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時間:周一至周五,10:30-18:30,節(jié)假日休息