博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊spring cloud的HystrixAutoConfiguration
阅读量:7053 次
发布时间:2019-06-28

本文共 6969 字,大约阅读时间需要 23 分钟。

本文主要研究一下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() {			Observable
serializedDashboardData = 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 { List

openCircuitBreakers = 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 Flux
stream; 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版本)。

doc

转载地址:http://jolol.baihongyu.com/

你可能感兴趣的文章
android 实时显示系统时间
查看>>
fatal error: asm/system.h: No such file or directory
查看>>
为什么要设计
查看>>
SerializableObj
查看>>
2018年5月31日笔记
查看>>
(转)CentOs上配置samba服务
查看>>
Photoshop给草坪上的人物加上唯美的紫色霞光
查看>>
移动平台对 META 标签的定义
查看>>
curl 命令详解
查看>>
启动改为本地Ip
查看>>
云服务器CentOS7.5安装MySQL5.7
查看>>
代理模式
查看>>
vue文档阅读笔记——计算属性和侦听器
查看>>
单元测试系列:Mock工具之Mockito实战
查看>>
二手GTX650
查看>>
Guava学习-缓存
查看>>
hexSHA1散列加密解密(不可逆)
查看>>
Pinterest架构:两年内月PV从零到百亿 - 非常值得参考【转】 - HorsonJin - 博客园...
查看>>
Swift设置自动行高
查看>>
171. Excel Sheet Column Number
查看>>