spring cloud监控配置

pom.xml中添加依赖引入监控相关的jar

<!-- 监控 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

actuator内置常规的endpoint(端点),通过springmvc的方式暴露出来,用于监控

在默认情况下,监控的controller和业务controller都是可以通过同一个端口访问,这样就有可能带来安全问题。
所以最好的方式,tomcat中提供两个端口,将监控的controller和业务controller通过端口区分开。

application.yml中添加配置

manage完整配置

management:
  security:
    enabled: false #默认情况下,management.security.enabled=true,会导致拦截某些敏感的endpoint监控请求,
  port: 8200 #端口号请自定义,为了统一分配,请选择【35000-35500】中的端口
  context-path: /

eureka:
  instance:
    prefer-ip-address: true
    metadata-map:
      management.port: ${management.port}

相关问题

在Dalston大版本之前的spring-cloud-dependencies版本中,eureka过早的设置statusPageUrl和healthCheckUrl,这时候客户端的注解尚未生效,prefer-ip-address: true,固然配置中设置优先使用IP,但是配置还未注入就已经设置了这两个属性,导致在eureka中注册的信息为

<homePageUrl>http://windows10.microdone.cn:8090/</homePageUrl>
<statusPageUrl>http://windows10.microdone.cn:8090/info</statusPageUrl>
<healthCheckUrl>http://windows10.microdone.cn:8090/health</healthCheckUrl>

这种使用hostname注册的方式,在内部dns解析不正常的情况下,是无法访问的。

解决方案

升级spring-cloud-dependencies的版本,Dalston已经修复这个问题

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

分析

代码如下EurekaClientAutoConfiguration

@Bean
@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)
public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) {
    EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils);
    instance.setNonSecurePort(this.nonSecurePort);
    instance.setInstanceId(getDefaultInstanceId(this.env));

    if (this.managementPort != this.nonSecurePort && this.managementPort != 0) {
        if (StringUtils.hasText(this.hostname)) {
            instance.setHostname(this.hostname);
        }
        RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(env, "eureka.instance.");
        String statusPageUrlPath = relaxedPropertyResolver.getProperty("statusPageUrlPath");
        String healthCheckUrlPath = relaxedPropertyResolver.getProperty("healthCheckUrlPath");
        if (StringUtils.hasText(statusPageUrlPath)) {
            instance.setStatusPageUrlPath(statusPageUrlPath);
        }
        if (StringUtils.hasText(healthCheckUrlPath)) {
            instance.setHealthCheckUrlPath(healthCheckUrlPath);
        }
        String scheme = instance.getSecurePortEnabled() ? "https" : "http";
        instance.setStatusPageUrl(scheme + "://" + instance.getHostname() + ":"
                + this.managementPort + instance.getStatusPageUrlPath());
        instance.setHealthCheckUrl(scheme + "://" + instance.getHostname() + ":"
                + this.managementPort + instance.getHealthCheckUrlPath());
    }
    return instance;
}

Dalston之后的版本中,设置相关值的时候先读取配置,手动注入配置

@Bean
@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)
public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) throws MalformedURLException {
    PropertyResolver eurekaPropertyResolver = new RelaxedPropertyResolver(this.env, "eureka.instance.");
    String hostname = eurekaPropertyResolver.getProperty("hostname");

    boolean preferIpAddress = Boolean.parseBoolean(eurekaPropertyResolver.getProperty("preferIpAddress"));
    int nonSecurePort = Integer.valueOf(propertyResolver.getProperty("server.port", propertyResolver.getProperty("port", "8080")));
    int managementPort = Integer.valueOf(propertyResolver.getProperty("management.port", String.valueOf(nonSecurePort)));
    String managementContextPath = propertyResolver.getProperty("management.contextPath", propertyResolver.getProperty("server.contextPath", "/"));
    EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils);
    instance.setNonSecurePort(nonSecurePort);
    instance.setInstanceId(getDefaultInstanceId(propertyResolver));
    instance.setPreferIpAddress(preferIpAddress);
    if (managementPort != nonSecurePort && managementPort != 0) {
        if (StringUtils.hasText(hostname)) {
            instance.setHostname(hostname);
        }
        String statusPageUrlPath = eurekaPropertyResolver.getProperty("statusPageUrlPath");
        String healthCheckUrlPath = eurekaPropertyResolver.getProperty("healthCheckUrlPath");
        if (!managementContextPath.endsWith("/")) {
            managementContextPath = managementContextPath + "/";
        }
        if (StringUtils.hasText(statusPageUrlPath)) {
            instance.setStatusPageUrlPath(statusPageUrlPath);
        }
        if (StringUtils.hasText(healthCheckUrlPath)) {
            instance.setHealthCheckUrlPath(healthCheckUrlPath);
        }
        String scheme = instance.getSecurePortEnabled() ? "https" : "http";
        URL base = new URL(scheme, instance.getHostname(), managementPort, managementContextPath);
        instance.setStatusPageUrl(new URL(base, StringUtils.trimLeadingCharacter(instance.getStatusPageUrlPath(), '/')).toString());
        instance.setHealthCheckUrl(new URL(base, StringUtils.trimLeadingCharacter(instance.getHealthCheckUrlPath(), '/')).toString());
    }
    return instance;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值