最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解Spring Boot2.3.0及以上版本的Liveness和Readiness功能

 更新時(shí)間:2023年10月24日 10:06:04   作者:codecraft  
這篇文章主要介紹了Spring Boot2.3.0及以上版本的Liveness和Readiness功能示例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下springboot的liveness及readiness

使用

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      probes:
        enabled: true
      show-details: always
  health:
    # /actuator/health/liveness
    livenessState:
      enabled: true
    # /actuator/health/readiness
    readinessState:
      enabled: true
通過(guò)如上配置可以開啟liveness及readiness,要求springboot版本在2.3.0及以上

ApplicationAvailabilityAutoConfiguration

org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java

@Configuration(proxyBeanMethods = false)
public class ApplicationAvailabilityAutoConfiguration {
    @Bean
    public ApplicationAvailabilityBean applicationAvailability() {
        return new ApplicationAvailabilityBean();
    }
}
ApplicationAvailabilityAutoConfiguration定義了ApplicationAvailabilityBean

ApplicationAvailabilityBean

org/springframework/boot/availability/ApplicationAvailabilityBean.java

public class ApplicationAvailabilityBean
        implements ApplicationAvailability, ApplicationListener<AvailabilityChangeEvent<?>> {
    private final Map<Class<? extends AvailabilityState>, AvailabilityChangeEvent<?>> events = new HashMap<>();
    @Override
    public <S extends AvailabilityState> S getState(Class<S> stateType, S defaultState) {
        Assert.notNull(stateType, "StateType must not be null");
        Assert.notNull(defaultState, "DefaultState must not be null");
        S state = getState(stateType);
        return (state != null) ? state : defaultState;
    }
    @Override
    public <S extends AvailabilityState> S getState(Class<S> stateType) {
        AvailabilityChangeEvent<S> event = getLastChangeEvent(stateType);
        return (event != null) ? event.getState() : null;
    }
    @Override
    @SuppressWarnings("unchecked")
    public <S extends AvailabilityState> AvailabilityChangeEvent<S> getLastChangeEvent(Class<S> stateType) {
        return (AvailabilityChangeEvent<S>) this.events.get(stateType);
    }
    @Override
    public void onApplicationEvent(AvailabilityChangeEvent<?> event) {
        Class<? extends AvailabilityState> stateType = getStateType(event.getState());
        this.events.put(stateType, event);
    }
    @SuppressWarnings("unchecked")
    private Class<? extends AvailabilityState> getStateType(AvailabilityState state) {
        if (state instanceof Enum) {
            return (Class<? extends AvailabilityState>) ((Enum<?>) state).getDeclaringClass();
        }
        return state.getClass();
    }
}
ApplicationAvailabilityBean實(shí)現(xiàn)了ApplicationAvailability、ApplicationListener接口,它接收AvailabilityChangeEvent事件,然后存儲(chǔ)到events中,getState方法則從events中獲取指定class類型的AvailabilityState

AvailabilityChangeEvent

org/springframework/boot/availability/AvailabilityChangeEvent.java

public class AvailabilityChangeEvent<S extends AvailabilityState> extends PayloadApplicationEvent<S> {
    /**
     * Create a new {@link AvailabilityChangeEvent} instance.
     * @param source the source of the event
     * @param state the availability state (never {@code null})
     */
    public AvailabilityChangeEvent(Object source, S state) {
        super(source, state);
    }
    /**
     * Return the changed availability state.
     * @return the availability state
     */
    public S getState() {
        return getPayload();
    }
    @Override
    public ResolvableType getResolvableType() {
        return ResolvableType.forClassWithGenerics(getClass(), getStateType());
    }
    private Class<?> getStateType() {
        S state = getState();
        if (state instanceof Enum) {
            return ((Enum<?>) state).getDeclaringClass();
        }
        return state.getClass();
    }
    /**
     * Convenience method that can be used to publish an {@link AvailabilityChangeEvent}
     * to the given application context.
     * @param <S> the availability state type
     * @param context the context used to publish the event
     * @param state the changed availability state
     */
    public static <S extends AvailabilityState> void publish(ApplicationContext context, S state) {
        Assert.notNull(context, "Context must not be null");
        publish(context, context, state);
    }
    /**
     * Convenience method that can be used to publish an {@link AvailabilityChangeEvent}
     * to the given application context.
     * @param <S> the availability state type
     * @param publisher the publisher used to publish the event
     * @param source the source of the event
     * @param state the changed availability state
     */
    public static <S extends AvailabilityState> void publish(ApplicationEventPublisher publisher, Object source,
            S state) {
        Assert.notNull(publisher, "Publisher must not be null");
        publisher.publishEvent(new AvailabilityChangeEvent<>(source, state));
    }
}
AvailabilityChangeEvent繼承了PayloadApplicationEvent,它還定義了publish方法

AvailabilityHealthContributorAutoConfiguration

org/springframework/boot/actuate/autoconfigure/availability/AvailabilityHealthContributorAutoConfiguration.java

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(ApplicationAvailabilityAutoConfiguration.class)
public class AvailabilityHealthContributorAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(name = "livenessStateHealthIndicator")
    @ConditionalOnProperty(prefix = "management.health.livenessstate", name = "enabled", havingValue = "true")
    public LivenessStateHealthIndicator livenessStateHealthIndicator(ApplicationAvailability applicationAvailability) {
        return new LivenessStateHealthIndicator(applicationAvailability);
    }
    @Bean
    @ConditionalOnMissingBean(name = "readinessStateHealthIndicator")
    @ConditionalOnProperty(prefix = "management.health.readinessstate", name = "enabled", havingValue = "true")
    public ReadinessStateHealthIndicator readinessStateHealthIndicator(
            ApplicationAvailability applicationAvailability) {
        return new ReadinessStateHealthIndicator(applicationAvailability);
    }
}
AvailabilityHealthContributorAutoConfiguration定義了LivenessStateHealthIndicator、ReadinessStateHealthIndicator

AvailabilityStateHealthIndicator

org/springframework/boot/actuate/availability/AvailabilityStateHealthIndicator.java

public class AvailabilityStateHealthIndicator extends AbstractHealthIndicator {
    private final ApplicationAvailability applicationAvailability;
    private Class<? extends AvailabilityState> stateType;
    private final Map<AvailabilityState, Status> statusMappings = new HashMap<>();
    /**
     * Create a new {@link AvailabilityStateHealthIndicator} instance.
     * @param <S> the availability state type
     * @param applicationAvailability the application availability
     * @param stateType the availability state type
     * @param statusMappings consumer used to setup the status mappings
     */
    public <S extends AvailabilityState> AvailabilityStateHealthIndicator(
            ApplicationAvailability applicationAvailability, Class<S> stateType,
            Consumer<StatusMappings<S>> statusMappings) {
        Assert.notNull(applicationAvailability, "ApplicationAvailability must not be null");
        Assert.notNull(stateType, "StateType must not be null");
        Assert.notNull(statusMappings, "StatusMappings must not be null");
        this.applicationAvailability = applicationAvailability;
        this.stateType = stateType;
        statusMappings.accept(this.statusMappings::put);
        assertAllEnumsMapped(stateType);
    }
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private <S extends AvailabilityState> void assertAllEnumsMapped(Class<S> stateType) {
        if (!this.statusMappings.containsKey(null) && Enum.class.isAssignableFrom(stateType)) {
            EnumSet elements = EnumSet.allOf((Class) stateType);
            for (Object element : elements) {
                Assert.isTrue(this.statusMappings.containsKey(element),
                        () -> "StatusMappings does not include " + element);
            }
        }
    }
    @Override
    protected void doHealthCheck(Builder builder) throws Exception {
        AvailabilityState state = getState(this.applicationAvailability);
        Status status = this.statusMappings.get(state);
        if (status == null) {
            status = this.statusMappings.get(null);
        }
        Assert.state(status != null, () -> "No mapping provided for " + state);
        builder.status(status);
    }
    /**
     * Return the current availability state. Subclasses can override this method if a
     * different retrieval mechanism is needed.
     * @param applicationAvailability the application availability
     * @return the current availability state
     */
    protected AvailabilityState getState(ApplicationAvailability applicationAvailability) {
        return applicationAvailability.getState(this.stateType);
    }
    /**
     * Callback used to add status mappings.
     *
     * @param <S> the availability state type
     */
    public interface StatusMappings<S extends AvailabilityState> {
        /**
         * Add the status that should be used if no explicit mapping is defined.
         * @param status the default status
         */
        default void addDefaultStatus(Status status) {
            add(null, status);
        }
        /**
         * Add a new status mapping .
         * @param availabilityState the availability state
         * @param status the mapped status
         */
        void add(S availabilityState, Status status);
    }
}
AvailabilityStateHealthIndicator繼承了AbstractHealthIndicator,它定義了statusMappings,key為AvailabilityState,value為Status,其doHealthCheck就是獲取state,然后從statusMappings取出對(duì)應(yīng)的status

LivenessStateHealthIndicator

org/springframework/boot/actuate/availability/LivenessStateHealthIndicator.java

public class LivenessStateHealthIndicator extends AvailabilityStateHealthIndicator {

    public LivenessStateHealthIndicator(ApplicationAvailability availability) {
        super(availability, LivenessState.class, (statusMappings) -> {
            statusMappings.add(LivenessState.CORRECT, Status.UP);
            statusMappings.add(LivenessState.BROKEN, Status.DOWN);
        });
    }

    @Override
    protected AvailabilityState getState(ApplicationAvailability applicationAvailability) {
        return applicationAvailability.getLivenessState();
    }

}
LivenessStateHealthIndicator繼承了AvailabilityStateHealthIndicator,它建立了LivenessState.CORRECT到Status.UP,LivenessState.BROKEN到Status.DOWN的映射

ReadinessStateHealthIndicator

org/springframework/boot/actuate/availability/ReadinessStateHealthIndicator.java

public class ReadinessStateHealthIndicator extends AvailabilityStateHealthIndicator {

    public ReadinessStateHealthIndicator(ApplicationAvailability availability) {
        super(availability, ReadinessState.class, (statusMappings) -&gt; {
            statusMappings.add(ReadinessState.ACCEPTING_TRAFFIC, Status.UP);
            statusMappings.add(ReadinessState.REFUSING_TRAFFIC, Status.OUT_OF_SERVICE);
        });
    }

    @Override
    protected AvailabilityState getState(ApplicationAvailability applicationAvailability) {
        return applicationAvailability.getReadinessState();
    }

}
ReadinessStateHealthIndicator繼承了AvailabilityStateHealthIndicator,它定義了ReadinessState.ACCEPTING_TRAFFIC到Status.UP,ReadinessState.REFUSING_TRAFFIC到Status.OUT_OF_SERVICE的映射

EventPublishingRunListener

org/springframework/boot/context/event/EventPublishingRunListener.java

public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {
    @Override
    public void started(ConfigurableApplicationContext context) {
        context.publishEvent(new ApplicationStartedEvent(this.application, this.args, context));
        AvailabilityChangeEvent.publish(context, LivenessState.CORRECT);
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        context.publishEvent(new ApplicationReadyEvent(this.application, this.args, context));
        AvailabilityChangeEvent.publish(context, ReadinessState.ACCEPTING_TRAFFIC);
    }
}
EventPublishingRunListener的started方法會(huì)發(fā)布AvailabilityChangeEvent,其state為L(zhǎng)ivenessState.CORRECT;running方法會(huì)發(fā)布AvailabilityChangeEvent,其state為ReadinessState.ACCEPTING_TRAFFIC

SpringApplicationRunListeners

org/springframework/boot/SpringApplicationRunListeners.java

class SpringApplicationRunListeners {

    void started(ConfigurableApplicationContext context) {
        for (SpringApplicationRunListener listener : this.listeners) {
            listener.started(context);
        }
    }

    void running(ConfigurableApplicationContext context) {
        for (SpringApplicationRunListener listener : this.listeners) {
            listener.running(context);
        }
    }

    //......
}
SpringApplicationRunListeners的started會(huì)回調(diào)listener的started,running會(huì)回調(diào)listener的running方法

ServletWebServerApplicationContext

org/springframework/boot/web/servlet/context/ServletWebServerApplicationContext.java

public class ServletWebServerApplicationContext extends GenericWebApplicationContext
        implements ConfigurableWebServerApplicationContext {
    @Override
    protected void doClose() {
        if (isActive()) {
            AvailabilityChangeEvent.publish(this, ReadinessState.REFUSING_TRAFFIC);
        }
        super.doClose();
    }
    //......
}
ServletWebServerApplicationContext的doClose方法在active的時(shí)候會(huì)發(fā)布AvailabilityChangeEvent,state為ReadinessState.REFUSING_TRAFFIC

SpringApplication

org/springframework/boot/SpringApplication.java

public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
            configureIgnoreBeanInfo(environment);
            Banner printedBanner = printBanner(environment);
            context = createApplicationContext();
            exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
                    new Class[] { ConfigurableApplicationContext.class }, context);
            prepareContext(context, environment, listeners, applicationArguments, printedBanner);
            refreshContext(context);
            afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
            }
            listeners.started(context);
            callRunners(context, applicationArguments);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, listeners);
            throw new IllegalStateException(ex);
        }
        try {
            listeners.running(context);
        }
        catch (Throwable ex) {
            handleRunFailure(context, ex, exceptionReporters, null);
            throw new IllegalStateException(ex);
        }
        return context;
    }
SpringApplication的run方法會(huì)先獲取SpringApplicationRunListeners,然后執(zhí)行l(wèi)isteners.starting(),接著prepareEnvironment、createApplicationContext、prepareContext、refreshContext、afterRefresh;之后執(zhí)行l(wèi)isteners.started(context);再執(zhí)行l(wèi)isteners.running(context)

小結(jié)

AvailabilityHealthContributorAutoConfiguration定義了LivenessStateHealthIndicator、ReadinessStateHealthIndicator,它們依賴AvailabilityChangeEvent,SpringApplication的run方法會(huì)先后觸發(fā)listeners.starting()、listeners.started(context)、listeners.running(context);EventPublishingRunListener的started方法會(huì)發(fā)布AvailabilityChangeEvent,其state為L(zhǎng)ivenessState.CORRECT;running方法會(huì)發(fā)布AvailabilityChangeEvent,其state為ReadinessState.ACCEPTING_TRAFFIC。

以上就是springboot的liveness及readiness的詳細(xì)內(nèi)容,更多關(guān)于springboot liveness readiness的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章讓你弄懂Java運(yùn)算符

    一篇文章讓你弄懂Java運(yùn)算符

    java中位運(yùn)算符主要有按位與&、按位或|、按位非~、按位異或^, 在使用時(shí)需要將運(yùn)算數(shù)都轉(zhuǎn)換為二進(jìn)制再進(jìn)行運(yùn)算,若為負(fù)數(shù)則使用補(bǔ)碼表示,這篇文章主要給大家介紹了關(guān)于Java運(yùn)算符的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • mybatis中<choose>標(biāo)簽的用法說(shuō)明

    mybatis中<choose>標(biāo)簽的用法說(shuō)明

    這篇文章主要介紹了mybatis中<choose>標(biāo)簽的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • httpclient connect連接請(qǐng)求方法源碼解讀

    httpclient connect連接請(qǐng)求方法源碼解讀

    這篇文章主要為大家介紹了httpclient connect連接請(qǐng)求方法解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問(wèn)題

    解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問(wèn)題

    這篇文章主要介紹了解決SpringBoot使用devtools導(dǎo)致的類型轉(zhuǎn)換異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。 一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 在Spring異步調(diào)用中傳遞上下文的方法

    在Spring異步調(diào)用中傳遞上下文的方法

    這篇文章主要給大家介紹了關(guān)于如何在Spring異步調(diào)用中傳遞上下文的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java工作環(huán)境的配置與Eclipse的安裝過(guò)程

    Java工作環(huán)境的配置與Eclipse的安裝過(guò)程

    這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 使用hutool工具進(jìn)行導(dǎo)入導(dǎo)出excel表格

    使用hutool工具進(jìn)行導(dǎo)入導(dǎo)出excel表格

    如何在后臺(tái)添加導(dǎo)入導(dǎo)出表格的功能呢,本期的文章將會(huì)帶領(lǐng)小伙伴們一起實(shí)現(xiàn)此功能,文中有詳細(xì)的代碼示例和圖文介紹,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • java emoji表情存儲(chǔ)的解決方法

    java emoji表情存儲(chǔ)的解決方法

    這篇文章主要為大家詳細(xì)介紹了java emoji表情存儲(chǔ)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 使用mybatis框架連接mysql數(shù)據(jù)庫(kù)的超詳細(xì)步驟

    使用mybatis框架連接mysql數(shù)據(jù)庫(kù)的超詳細(xì)步驟

    MyBatis是目前java項(xiàng)目連接數(shù)據(jù)庫(kù)的最流行的orm框架了,下面這篇文章主要給大家介紹了關(guān)于使用mybatis框架連接mysql數(shù)據(jù)庫(kù)的超詳細(xì)步驟,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Springmvc模式上傳和下載與enctype對(duì)比

    Springmvc模式上傳和下載與enctype對(duì)比

    這篇文章主要介紹了Springmvc模式上傳和下載與enctype對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

惠来县| 稷山县| 丹巴县| 德格县| 陇南市| 蒙自县| 林口县| 黔江区| 友谊县| 那坡县| 望奎县| 彭山县| 兴国县| 类乌齐县| 拜城县| 晋城| 滨海县| 仙桃市| 阆中市| 新竹市| 安国市| 句容市| 永年县| 巨野县| 扶沟县| 灵山县| 天水市| 阿拉尔市| 海淀区| 呼和浩特市| 南丰县| 驻马店市| 九龙坡区| 安仁县| 宝清县| 崇州市| 奉新县| 黑河市| 南雄市| 南皮县| 普定县|