文档

Spring Config配置项

更新时间:

本文介绍如何对Spring Config的配置项执行修改或者持久化等操作。

前提条件

已接入应用:

  • Agent方式接入,与流量防护共用Agent,配置-Dahas.switch.agent.plugin.group.enabled=true。

  • 应用配置SDK方式接入。

  • 应用配置Spring Boot Starter方式接入。具体操作,请参见使用Spring Boot Starter接入

Spring Demo文件

  • UserController类对象:为@Value配置,用于测试@PostConstruct注解,此阶段可识别持久化值,部分内容如下。

    @RestController
    public class UserController {
    
        @Value("${project.name}")
        public String name;
    
        @Value("${user.ahas}")
        public boolean ahas;
    
        @Value("${user.number}")
        public int num;
    
        @Value("${destination}")
        public String destinationStr;
    
    
        @Autowired
        private Destination destination;
    
        @PostConstruct
        private void init(){
            System.out.println("[UserController] init()  value: "+ destinationStr +" , " + num + " , "+ ahas + " , " + name);
            System.out.println("[UserController] init()  configuration: "+destination.getAvg()+" , " + destination.getMax() + " , "+ destination.getMin());
        }
    
        ...
    }
  • DemoConfig类对象:为@Value配置,用于测试InitializingBean和afterPropertiesSet函数,初始化阶段可读取到持久化值,内容如下。

    @Configuration
    public class DemoConfig implements InitializingBean {
        @Autowired
        private RequestProperties requestProperties;
    
        @Override
        public void afterPropertiesSet() {
            System.out.println("[DemoConfig] init()  port: " + requestProperties.getPort() + " ,interface: " + requestProperties.getInter());
        }
    
    }
  • RequestProperties类对象:为@ConfigurationProperties配置,Value模式。

    @Component
    @ConfigurationProperties(value = "request")
    public class RequestProperties {
        private int port;
    
        private String inter;
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public String getInter() {
            return inter;
        }
    
        public void setInter(String inter) {
            this.inter = inter;
        }
    }
  • Destination类对象:为@ConfigurationProperties配置,Prefix模式。

    @Component
    @ConfigurationProperties(prefix = "property.destination")
    public class Destination {
        private int max;
        private int min;
        private int avg;
    
        public int getMax() {
            return max;
        }
    
        public void setMax(int max) {
            this.max = max;
        }
    
        public int getMin() {
            return min;
        }
    
        public void setMin(int min) {
            this.min = min;
        }
    
        public int getAvg() {
            return avg;
        }
    
        public void setAvg(int avg) {
            this.avg = avg;
        }
    }

查看应用的配置列表

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏选择应用配置 > 配置列表

  4. 配置列表页面,单击分组模式页签。

    如下图所示,可看到以分组模式展示的开关配置项。其中各分组名为识别出的类名,开关名为类中字段名,描述内容为@Value方式(注解中的内容)或者@ConfigurationProperties方式(Spring配置文件)的配置项,具体请参见本文Spring Demo文件的介绍。demo

修改配置值

对配置值分为单机推送和全局推送两种方式。单机推送的值不会持久化,仅当前微服务实例生命周期有效;全局推送方式会进行值持久化,微服务实例再次启动后可看到持久化值。

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏选择应用配置 > 配置列表

  4. 配置列表页面,单击分组模式页签。

    以下分别展示全局推送和单击推送两种推送方式的操作步骤:

    • 全局推送:

      1. 单击目标开关操作列下方的全局推送,在开关推送页面设置推送值

      2. 开关推送页面单击下一步:值对比查看值对比,最后单击全局推送按钮。例如,以LocalSwitchConfig类对象中的stringSwitch字段执行全局推送。全局推送

        全局推送后,返回控制台在配置列表页面,查看应用中的stringSwitch字段已被修改,同时数据已经持久化。推送结果

    • 单机推送:

      1. 单击目标开关名左侧的加号图标,然后单击目标实例操作列下方的单击推送,然后在开关单机推送页面配置推送值

      2. 开关推送页面单击下一步:值对比查看值对比,最后单击推送按钮。例如,以LocalSwitchConfig类对象中的stringSwitch字段的其中一个实例执行单机推送。全局推送

        单机推送后,返回控制台在配置列表页面,查看目标实例的当前值已被修改。查看全局推送

查看历史推送记录

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面单击目标应用的资源卡片,然后在左侧导航栏选择应用配置 > 推送记录,即可在当前页面查看所有的推送记录。

    推送记录

配置值的持久化验证

重启应用,在InitializingBean,afterPropertiesSet函数初始化阶段与@PostConstruct初始化阶段均可被读取到已持久化的值。

可通过测试Demo中的启动日志查看,内容如下:启动日志

  • @ConfigurationProperties配置:在控制台可看到通过全局推送方式推送的RequestProperties类对象的inter字段的配置项为持久化值,而通过单机推送的port字段的配置项仍为Spring原始配置内容。

  • @Value配置:在控制台可看到通过全局推送方式推送的UserController类对象的destinationStr字段的配置项为持久化值,而通过单机推送的num字段的配置项仍为Spring原始配置内容。

日志动态调整

测试样例:

private static final Random RANDOM = new Random();
private static final Logger logger = LoggerFactory.getLogger("xx");

@GetMapping("/hello")
public ResponseEntity<String> hello(){
    int random = RANDOM.nextInt(100);
    logger.info("[SystemLog] ------------------- info : {} ",random);
    logger.debug("[SystemLog] ------------------- debug : {} ",random);
    logger.error("[SystemLog] ------------------- error : {} ",random);
    if(random < 30) {
        return new ResponseEntity<String>("BAD", HttpStatus.BAD_REQUEST);
    } else if(random > 50) {
        return new ResponseEntity<String>("BAD", HttpStatus.SERVICE_UNAVAILABLE);
    } else {
        return new ResponseEntity<String>("OK", HttpStatus.OK);
    }
}
  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏选择应用配置 > 配置列表

  4. 配置列表页面的分组模式下选择System页签,然后在搜索框中搜索SYSTEM_LOG_CONFIG配置,即日志级别配置。

  5. 单击目标开关或目标实例操作下方的全局推送单击推送,按照<loggerName,loggerLevel>格式填写日志运行的配置,然后单击全局推送单击推送,即可修改全部机器或是单台机器的日志运行级别。这里以全局方式为例。推送值格式:Key为LoggerName,Value为日志级别。如需修改全局日志级别,LoggerName为root,如下所示:

    {
        "root": "ERROR"
    }
    日志级别
  6. 在目标集群的无状态下单击日志页签查看的日志打印情况。

    日志打印情况

    若将日志级别设为DEBUG,则日志打印结果如下:日志打印

灰度推送

  1. 登录MSE治理中心控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择治理中心 > 应用治理

  3. 应用列表页面,单击目标应用的资源卡片,然后在左侧导航栏选择应用配置 > 配置列表

  4. 单击目标开关操作列下方的全局推送,进入开关推送页面配置推送值

  5. 开关推送页面单击灰度发布,在弹出的灰度推送设置页签设置灰度批次,并根据需要选择是否多次暂停,然后单击开始灰度

  6. 发布单进度页面的进度列会显示灰度完成情况。

  • 本页导读 (1)
文档反馈