序
本文主要研究一下spring cloud的HystrixAutoConfiguration
HystrixAutoConfiguration
spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/hystrix/HystrixAutoConfiguration.java
/** * Auto configuration for Hystrix. * * @author Christian Dupuis * @author Dave Syer */@Configuration@ConditionalOnClass({ Hystrix.class, HealthIndicator.class })@AutoConfigureAfter({ HealthIndicatorAutoConfiguration.class })public class HystrixAutoConfiguration { @Bean @ConditionalOnEnabledHealthIndicator("hystrix") public HystrixHealthIndicator hystrixHealthIndicator() { return new HystrixHealthIndicator(); } @Bean @ConditionalOnProperty(value = "management.metrics.hystrix.enabled", matchIfMissing = true) public HystrixMetricsBinder hystrixMetricsBinder() { return new HystrixMetricsBinder(); } /** * See original {@link org.springframework.boot.actuate.autoconfigure.jolokia.JolokiaEndpointAutoConfiguration} */ @Configuration @ConditionalOnWebApplication(type = SERVLET) @ConditionalOnBean(HystrixCommandAspect.class) // only install the stream if enabled @ConditionalOnClass({ HystrixMetricsStreamServlet.class }) @EnableConfigurationProperties(HystrixProperties.class) protected static class HystrixServletAutoConfiguration { @Bean @ConditionalOnEnabledEndpoint public HystrixStreamEndpoint hystrixStreamEndpoint(HystrixProperties properties) { return new HystrixStreamEndpoint(properties.getConfig()); } @Bean public HasFeatures hystrixStreamFeature() { return HasFeatures.namedFeature("Hystrix Stream Servlet", HystrixMetricsStreamServlet.class); } } @Configuration @ConditionalOnWebApplication(type = REACTIVE) @ConditionalOnBean(HystrixCommandAspect.class) // only install the stream if enabled @ConditionalOnClass({ DispatcherHandler.class }) @EnableConfigurationProperties(HystrixProperties.class) protected static class HystrixWebfluxManagementContextConfiguration { @Bean @ConditionalOnEnabledEndpoint public HystrixWebfluxEndpoint hystrixWebfluxController() { ObservableserializedDashboardData = HystrixDashboardStream.getInstance().observe() .concatMap(dashboardData -> Observable.from(SerialHystrixDashboardData.toMultipleJsonStrings(dashboardData))); Publisher publisher = RxReactiveStreams.toPublisher(serializedDashboardData); return new HystrixWebfluxEndpoint(publisher); } @Bean public HasFeatures hystrixStreamFeature() { return HasFeatures.namedFeature("Hystrix Stream Webflux", HystrixWebfluxEndpoint.class); } }}
这里有几个bean,一个是HystrixHealthIndicator,还有HystrixMetricsBinder。另外关于endpoint,区分了servlet及webflux版本。
HystrixHealthIndicator
spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/hystrix/HystrixHealthIndicator.java
/** * A {@link HealthIndicator} implementation for Hystrix circuit breakers. ** This default implementation will not change the system state (e.g.
OK
) but * includes all open circuits by name. * * @author Christian Dupuis */public class HystrixHealthIndicator extends AbstractHealthIndicator { private static final Status CIRCUIT_OPEN = new Status("CIRCUIT_OPEN"); @Override protected void doHealthCheck(Builder builder) throws Exception { ListopenCircuitBreakers = new ArrayList<>(); // Collect all open circuit breakers from Hystrix for (HystrixCommandMetrics metrics : HystrixCommandMetrics.getInstances()) { HystrixCircuitBreaker circuitBreaker = HystrixCircuitBreaker.Factory .getInstance(metrics.getCommandKey()); if (circuitBreaker != null && circuitBreaker.isOpen()) { openCircuitBreakers.add(metrics.getCommandGroup().name() + "::" + metrics.getCommandKey().name()); } } // If there is at least one open circuit report OUT_OF_SERVICE adding the command // group // and key name if (!openCircuitBreakers.isEmpty()) { builder.status(CIRCUIT_OPEN).withDetail("openCircuitBreakers", openCircuitBreakers); } else { builder.up(); } }}
检查断路器的状态
HystrixMetricsBinder
micrometer-core-1.0.5-sources.jar!/io/micrometer/core/instrument/binder/hystrix/HystrixMetricsBinder.java
@NonNullApi@NonNullFieldspublic class HystrixMetricsBinder implements MeterBinder { @Override public void bindTo(MeterRegistry registry) { // Keeps references of existing Hystrix plugins. HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance().getEventNotifier(); HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance().getPropertiesStrategy(); HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins.getInstance().getCommandExecutionHook(); HystrixConcurrencyStrategy concurrencyStrategy = HystrixPlugins.getInstance().getConcurrencyStrategy(); HystrixPlugins.reset(); // Registers existing plugins except the new MicroMeter Strategy plugin. HystrixPlugins.getInstance().registerMetricsPublisher(new MicrometerMetricsPublisher(registry)); HystrixPlugins.getInstance().registerConcurrencyStrategy(concurrencyStrategy); HystrixPlugins.getInstance().registerEventNotifier(eventNotifier); HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy); HystrixPlugins.getInstance().registerCommandExecutionHook(commandExecutionHook); }}
这里导出metrics到micrometer
HystrixStreamEndpoint
spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/hystrix/HystrixStreamEndpoint.java
/** * {@link org.springframework.boot.actuate.endpoint.annotation.Endpoint} to expose a Jolokia {@link HystrixMetricsStreamServlet}. * * @author Phillip Webb * @since 2.0.0 */@ServletEndpoint(id = "hystrix.stream")public class HystrixStreamEndpoint implements Supplier{ private final Map initParameters; public HystrixStreamEndpoint(Map initParameters) { this.initParameters = initParameters; } @Override public EndpointServlet get() { return new EndpointServlet(HystrixMetricsStreamServlet.class) .withInitParameters(this.initParameters); }}
这个是基于servlet的
HystrixWebfluxEndpoint
spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/hystrix/HystrixWebfluxEndpoint.java
@RestControllerEndpoint(id = "hystrix.stream")public class HystrixWebfluxEndpoint { private final Fluxstream; public HystrixWebfluxEndpoint(Publisher dashboardData) { stream = Flux.interval(Duration.ofMillis(500)).map(aLong -> "{\"type\":\"ping\"}") .mergeWith(dashboardData).share(); } // path needs to be empty, so it registers correct as /actuator/hystrix.stream @GetMapping(path = "", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux hystrixStream() { return stream; }}
这个是基于webflux的
小结
HystrixAutoConfiguration主要是配置了HystrixHealthIndicator、HystrixMetricsBinder以及HystrixEndpoint(分servlet与webflux版本
)。