精华内容
下载资源
问答
  • 【kafka】kafka的动态配置管理使用和分析

    千次阅读 多人点赞 2021-08-03 10:29:34
    Broker启动加载动态配置1.1 启动加载动态配置总流程1. 2 加载Topic动态配置1.3 加载Broker动态配置2. 查询动态配置 流程 `--describe`3. 新增/修改/删除/动态配置 的流程Topic配置其他的类型都一样4. Broker监听/...

    该文章可能已过期,已不做勘误并更新,请访问原文地址(持续更新) Kafka中的动态配置源码分析


    kafka管控平台推荐使用 滴滴开源 Kafka运维管控平台(戳我呀) 更符合国人的操作习惯 更强大的管控能力 更高效的问题定位能力 更便捷的集群运维能力 更专业的资源治理 更友好的运维生态


    BliBli视频: 石臻臻的杂货铺

    kafka的动态配置

    Hello~~ 大家好,我是石臻臻~~~~

    在这里插入图片描述

    今天这篇文章,给大家分享一下最近看kafka中的动态配置,不需要重启Broker,即时生效的配置 欢迎留言一起探讨!

    kafka中的配置

    1. Broker静态配置 .properties文件
    2. ZK中的动态配置 全局 default配置
    3. ZK中动态配置 指定配置

    优先级从底到高

    不想看过程,可以直接看最后的源码总结部分

    源码分析

    1. Broker启动加载动态配置

    KafkaServer.startup

    1.1 启动加载动态配置总流程

    1. 动态配置初始化

          config.dynamicConfig.initialize(zkClient)
    
    1. 构造当前配置文件 currentConfig, 然后从zk中获取节点 /config/brokers/<default>信息,然后更新配置updateDefaultConfig; (动态默认配置覆盖静态配置)
    2. 从节点/config/brokers/{当前BrokerId}获取配置, 如果配置中有ConfigType=PASSWORD的配置(例如ssl.keystore.password)存在,接着判断 是否存在password.encoder.old.secret 配置,(这个配置是用来加解密ConfigType=PASSWORD的旧的秘钥),尝试用旧秘钥解密秘钥; 然后将这些配置重新加密回写入/config/brokers/{当前BrokerId} ; 然后返回配置 (这里主要是动态配置里面有密码类型配置的时候需要做一次解密加密处理)
    3. 将上面得到的配置(password类型修改之后) 更新内存总的配置;优先级 静态配置<动态默认配置<指定动态配置

    2. 注册可变更配置监听器

    如果有对应的配置变更了,那么相应的监听器就会收到通知去修改自己相应的配置;

            
            config.dynamicConfig.addReconfigurables(this)
            
    

    DynamicBrokerConfig.addReconfigurables

    // .........
      def addReconfigurables(kafkaServer: KafkaServer): Unit = {
        kafkaServer.authorizer match {
          case Some(authz: Reconfigurable) => addReconfigurable(authz)
          case _ =>
        }
        addReconfigurable(new DynamicMetricsReporters(kafkaConfig.brokerId, kafkaServer))
        addReconfigurable(new DynamicClientQuotaCallback(kafkaConfig.brokerId, kafkaServer))
    
        addBrokerReconfigurable(new DynamicThreadPool(kafkaServer))
        if (kafkaServer.logManager.cleaner != null)
          addBrokerReconfigurable(kafkaServer.logManager.cleaner)
        addBrokerReconfigurable(new DynamicLogConfig(kafkaServer.logManager, kafkaServer))
        addBrokerReconfigurable(new DynamicListenerConfig(kafkaServer))
        addBrokerReconfigurable(kafkaServer.socketServer)
      }
    

    3. 动态配置启动监听

            // Create the config manager. start listening to notifications
            dynamicConfigManager = new DynamicConfigManager(zkClient, dynamicConfigHandlers)
            dynamicConfigManager.startup()
    
    1. 注册节点处理器change-notification-/config/changes = stateChangeHandler
    2. 注册节点处理器/config/changes = zNodeChildChangeHandler
    3. 获取/config/changes 所有子节点看看有哪些变更
    4. 遍历所有节点并截取节点的编号, 判断一下是不是大于上一次执行过变更的节点ID lastExecutedChange(启动的时候是-1)
    5. 上个条件满足的话,则执行通知操作;不同entity执行的操作不一样,具体请看下面每个类型
    6. 更新lastExecutedChange
    7. 清除过期的通知节点, 默认过期时间15 * 60 * 1000(15分钟) 就是删除/config/changes /下面的过期节点

    1. 2 加载Topic动态配置

    TopicConfigHandler.processConfigChanges
    在这里插入图片描述

    1. 获取节点的data数据, 如果获取到了则执行通知流程notificationHandler.processNotification(d),处理器是ConfigChangedNotificationHandler; 它先解析节点的json数据,根据版本信息不同调用不同的处理方法; 下面是version=2的处理方式;
    2. 根据json数据可以得到 entityTypeentityName; 那么久可以去对应的zk数据里面getData获取数据; 并且将获取到的数据Decode成Properties对象entityConfig;
    3. 将key为下图中的属性 隐藏掉; 替换成value: [hidden]
      在这里插入图片描述
    4. 调用EntityHandler; 这里是TopicConfigHandler.processConfigChanges来进行处理,方法里面再看看流程 ->
    5. 从动态配置entityConfig里面获取message.format.version配置消息格式版本号; 如果当前Broker的版本inter.broker.protocol.version 小于message.format.version配置; 则将message.format.version配置 排除掉
    6. 调用TopicConfigHandler.updateLogConfig 来更新指定Topic的所有TopicPartition的配置,其实是将TP正在加载或初始化的状态标记为没有完成初始化,这将会在后续过程中促成TP重新加载并初始化
    7. 将动态配置和并覆盖Server的默认配置为新的 newConfig, 然后根据Topic获取对应的Logs对象; 遍历Logs去更新newConfig;并尝试执行 initializeLeaderEpochCache; (需要注意的是:这里的动态配置不是支持所有的配置参数,请看【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议收藏!!!)的附件部分)
    8. 当然特殊配置如leader.replication.throttled.replicas,follower.replication.throttled.replicas这两个限流相关;解析配置之后,然后通过quotaManager.markThrottled/quotaManager.removeThrottle更新/移除对应的限流分区集合
    9. 如果动态配置了unclean.leader.election.enable=true(允许非同步副本选主 );那么就会执行TopicUncleanLeaderElectionEnable方法来让它改变选举策略(前提是当前Broker是Controller角色)

    1.3 加载Broker动态配置

    BrokerConfigHandler.processConfigChanges

    假设我们配置了默认配置; zk里面的节点是<default>

    sh bin/kafka-configs.sh --bootstrap-server xxxxx:9090 --alter --entity-type brokers --entity-default --add-config log.segment.bytes=88888888

    在这里插入图片描述

    1. 从zk节点/config/changes里面获取变更节点的json数据.然后去对应的 /config/{entityType}/{entituName}获取对应的数据
    2. 如果是<default>节点,说明有配置动态默认配置; 则按照 静态配置<动态默认配置<动态指定配置 的顺序重新加载覆盖一下; 如果 新旧配置有变更(有可能执行了一次命令但是参数并没有变化的情况,修改了个寂寞)的情况下 才会做更新的; 并且 通知到所有的 BrokerReconfigurable; 这个就是上面启动时候 1.1 启动加载动态配置总流程的第2步骤 (注册可变更配置监听器) 注册的;
    3. 如果是指定BrokerId, 则除了上面2重新加载覆盖之外, 相关限流 配置leader.replication.throttled.ratefollower.replication.throttled.ratereplica.alter.log.dirs.io.max.bytes.per.second 都会被更新一下quotaManagers.leader/leader/alterLogDirs.updateQuota ;如果这些配置没有配置的话,则用 Long.MaxValue(相当于是不限流)来更新

    2. 查询动态配置 流程 --describe

    1. 简单检验

    2. 根据类型查询entities ; type是topics就获取所有topic; type是broker|broker-loggers则查询所有Broker节点

    3. 遍历entities获取配置 ;做些简单校验;然后想Broker发起describeConfigs请求; 节点策略是LeastLoadedNodeProvider
      节点调用方法 KafkaApis.handleDescribeConfigsRequest

      1. 未经授权配置不查询
      2. 经过授权的配置开始查询 ;
      3. 当查询的是topics时, 去zk节点/confgi/类型/类型名 ,获取到动态配置数据之后, 然后将其覆盖本地跟Log相关的静态配置, 完事之后组装一下返回;(1.数据为空过滤2.敏感数据设置value=null; ConfigType=PASSWORD和不知道类型是啥的都是敏感数据 3. 组装所有的同义配置(静态默认配置、本地静态、默认动态配置、指定动态配置、等等多个配置))
        返回的数据类型如下:
        在这里插入图片描述
        在这里插入图片描述
    4. 如果有broker|broker-loggers节点, 则在 获取到数据之后 然后指定nodeId节点发起 describeBrokerConfigs请求

      1. 如果查询的是brokers
        在这里插入图片描述
      2. 如果查询的是 broker-loggers
        在这里插入图片描述

    3. 新增/修改/删除/动态配置 的流程

    1. 发起请求

    1. 查询当前的类型配置; 这里的查询 跟上面的--describe流程是一样的
    2. 相关校验;如果有delete-config配置, 需要校验一下当前配置有没有;如果没有抛出异常;
    3. 计算出需要变更的配置之后, 发起请求incrementalAlterConfigs;如果请求类型是 brokers/broker-loggers 则发起请求的接收方是 指定的Broker 节点; 否则就是LeastLoadedNodeProvider (当前负载最少的节点)

    2. incrementalAlterConfigs 增量修改配置

    KafkaApis.handleIncrementalAlterConfigsRequest

    1. 通过请求参数解析 配置 configs
    2. 过滤一下未授权的配置
    3. 如果配置中有重复的项则抛出异常

    Topic配置

    1. 获取节点 /config/topics/{topicName} 中的配置数据;
    2. 然后根据请求参数的属性 ,组装好变更后的配置是什么样的 configs
    3. 简单校验一下, 并且支持自定义校验,如果有 alter.config.policy.class.name= 配置(默认null)的话,则会实例化指定的类(需要继承 AlterConfigPolicy类);并调用他的 validate方法来校验;
    4. 调用写入zk配置的接口, 将动态配置重新写入(SetDataRequest)到接口 /config/topics/{topicName}中;
    5. 创建并写入配置变更记录顺序节点 /config/changes/config_change_序列号 中; 这个节点主要是让Broker们来监听这个节点的来了解到哪个配置有变更的;

    其他的类型都一样

    省略

    4. Broker监听/config/changes的变更

    1. Broker启动加载动态配置 中我们了解到有对节点/config/change注册一个子节点变更的监听处理器

    在这里插入图片描述

    那么对动态配置做出修改之后, 这个节点就会新增一条数据,那么所有的Broker都会收到这个通知;
    在这里插入图片描述

    所以我们就要来看一看收到通知之后又做了哪些事情

    这个流程是又回到了上面的 1. 2 加载Topics/Brokers动态配置 的流程中了;

    源码总结

    原理部分讲解比较详细的可以看 : Kafka动态配置实现原理解析 - 李志涛 - 博客园

    在这里插入图片描述

    在这里插入图片描述

    Q&A

    如果我想在我的项目中获取kafka的所有配置该怎么办?

    1. 启动的时候加载一次所有Broker的配置
    2. 监听节点/config/change节点的变化

    是否可以直接在zk中写入动态配置?

    不可以,因为Broker是监听 /config/changes/里面的Broker节点,来实时得知有数据变更;

    为什么不直接监听 /config/下面的配置?

    没有必要,这样监听的数据数据太多了,而且 你不知道具体是改了哪个配置,所以每次都要全部更新一遍,无缘无故的加重负担了, 用/config/change 节点来得知哪个类型的数据变更, 只变更这个相关数据就可以了

    展开全文
  • Prometheus动态配置目标

    千次阅读 2018-04-24 12:09:09
    Prometheus动态配置目标 (金庆的专栏 2018.4) 最简单的配置是静态目标: scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090', 'localhost:9100'] labels: group:.....

    Prometheus动态配置目标

    (金庆的专栏 2018.4)

    最简单的配置是静态目标:

    scrape_configs:
      - job_name: 'prometheus'
    
        static_configs:
          - targets: ['localhost:9090', 'localhost:9100']
            labels:
              group: 'prometheus'

    更改此文件后,可以发送 SIGHUP 触发配置重新加载。

    Prometheus 提供了服务发现功能,可以从 consul, dns, kubernetes, file 等等多种来源发现新的目标。
    其中最简单的是从文件发现服务。

    例如 /root/prometheus/prometheus.yml 配置如下:

    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['127.0.0.1:9090', '127.0.0.1:9100']
            labels:
              group: 'prometheus'
      - job_name: 'test'
        file_sd_configs:
          - files: ['/etc/prometheus/test_sd_config/*.yml']
            refresh_interval: 5s

    用 docker 启动 prometheus:

    docker run -d --net=host \
      -v /root/prometheus:/etc/prometheus \
      --name prometheus-server \
      prom/prometheus

    创建 /root/prometheus/test_sd_config/test.yml 如下

    - targets: [ "192.168.93.192:8080" ]
      labels:
        group: "my_test_group"

    5s内就会自动读取 test.yml 并添加新的目标。
    可用浏览器打开Prometheus 9090 端口,
    查看 Status 中的 Configuration, Targets, Service Discovery,
    可以看到新添加的目标。

    展开全文
  • kafka动态配置topic

    万次阅读 热门讨论 2019-01-11 14:18:43
     之前使用@org.springframework.kafka.annotation.KafkaListener这个注解的时候,是在yml文件中配置,然后使用@KafkaListener(topics = {"...昨天改了个需求,希望以后通过配置文件去动态配置生产者和消费者的...

     之前使用@org.springframework.kafka.annotation.KafkaListener这个注解的时候,是在yml文件中配置,然后使用@KafkaListener(topics = {"${kafka.topic.a2b.name}"}),这样去单独监听某一个topic,生产者也固定在代码里定义变量读取配置文件。昨天改了个需求,希望以后通过配置文件去动态配置生产者和消费者的topic(不知道个数和topic名字),而不需要改代码。

    一、踩坑

     刚开始的时候,由于考虑不充分(没有考虑到topic个数未知),想到@KafkaListener注解中的topics本身就是个字符串数组,于是想通过传入变量的形式。产生了以下两种方法:

    1.传入变量方法一

      使用@Value注解提取配置文件中相关配置,@KafkaListener中传入变量

        public static String[] topicArr;
        @Value("${kafka.bootstrap.servers}")
        public void setTopicArr(String[] value){
            String topicArr = value;
        }
        @KafkaListener(topics= topicArr)
    

    emmmm。。。结果可想而知,不行。

    2.传入变量方法二

     还是传入变量,不过这次写了个动态配置的代码

        注解里这么写
        @KafkaListener(topics = "${topicName1}","${topicName2}","${topicName3}")
        提前将yml文件里添加
        topics: topicName1,topicName2,topicName3
        然后加载进来
        @Value("${kafka.topics}")
        public void setTopics(String value){
            topics = value;
        }
        动态配置代码:
        @Configuration
        public class KafkaTopicConfiguration implements InitializingBean {
            @Autowired
            private KafkaConfig kafkaconfig;
            @Override
            public void afterPropertiesSet() throws Exception {
                String[] topicArr = kafkaconfig.split(",");
                int i = 1;
                for(String topic : topicArr){
                    String topicName = "topicName"+i;
                    System.setProperty(topicName, topic);
                }
            }
        }
    

    相比方法一,可行。但是未知topic数量呢。GG。

    3.不用注解

     百度找到几个老哥的动态获取并创建topic的方法

    https://www.cnblogs.com/gaoyawei/p/7723974.html
    https://www.cnblogs.com/huxi2b/p/7040617.html
    https://blog.csdn.net/qq_27232757/article/details/78970830
    

    写了几版,各种各样的问题,还是我太菜。就想再看看有没有别的简单点的解决办法,没有了再回来搞这个。

    4.正则匹配topic

     这期间又找到一个使用正则匹配topic的。直接贴链接

    @KafkaListener(topicPattern = "showcase.*")
    这里使用正则匹配topic,其中【*】之前得加上【.】才能匹配到。
    

    中间模仿写了一版使用正则匹配的,其实也可以糊弄实现需求,除了topic取名的时候一定得规范以外,还得考虑到如果不想用某个topic了又得想怎么去避免他。
    这种方法不太严谨,继续踩坑吧。

    二、问题解决

     用蹩脚的英语google了一下,嗯?好多老哥们也是用的以上差不多的方法。然而最后在某个老哥github的issues中看到了解决办法。老哥的需求跟我差不多,感谢大佬,贴上最终问题解决方案。

    1.kafka消费者监听配置

    还是注解的形式
    @KafkaListener(topics = "#{'${kafka.listener_topics}'.split(',')}")
    

    读取yml文件中kafka.listener_topics的参数,然后根据“,”去split,得到一个topics数组。
    这么做就可以根据配置文件动态的去监听topic。

    2.yml配置文件

    只列出topic相关部分(mqTypes是我用来判断使用哪个topic发送的)
        kafka:
          listener_topics: kafka-topic-a2b,kafka-topic-c2b
          consume:
            topic:
              - name: kafka-topic-a2b
                partitions: 12
                replication_factor: 2
              - name: kafka-topic-c2b
                partitions: 12
                replication_factor: 2
          product:
            topic:
              - name: kafka-topic-b2a
                partitions: 12
                replication_factor: 2
                mqTypes: type1
              - name: kafka-topic-b2c
                partitions: 12
                replication_factor: 2
                mqTypes: type1
    

    3.yml参数解析

    这里我将kafka的topic相关加载到bean中处理。
    创建KafkaConsumerBean和KafkaProducerBean分别用来存储yml中生产者和消费者的topic相关参数

    //KafkaConsumerBean
    @Component
    @ConfigurationProperties(prefix = "kafka.consume")
    public class KafkaConsumerBean {
        private List<Map<String,String>> topic;
        public void setTopic(List<Map<String, String>> topic) {
            this.topic = topic;
        }
        public List<Map<String, String>> getTopic() {
            return topic;
        }
    }
    
    //KafkaProducerBean
    @Component
    @ConfigurationProperties(prefix = "kafka.product")
    public class KafkaProducerBean {
        private List<Map<String,String>> topic;
        public void setTopic(List<Map<String, String>> topic) {
            this.topic = topic;
        }
    
        private Map<String,String> mqType2NameMap = new HashMap<String,String>();
        public List<Map<String, String>> getTopic() {
            return topic;
        }
    
        public String getTopic(String mqType){
            String name = mqType2NameMap.get(mqType);
            if(name != null){
                return name;
            }else{
                for(Map<String,String> topicProperty : topic){
                    if (topicProperty.get("mqTypes").indexOf(mqType) >= 0){
                        name = topicProperty.get("name");
                        mqType2NameMap.put(mqType,name);
                        return name;
                    }
                }
                return null;
            }
    
        }
    }
    
    

    4.创建topic

        List<Map<String,String>> producerTopicList = kafkaProducerBean.getTopic();
        for (Map<String,String> topicProperty : producerTopicList){
            KafkaClient.createTopic(topicProperty.get("name"),Integer.parseInt(topicProperty.get("partitions")),Integer.parseInt(topicProperty.get("replication_factor")));
        }
        List<Map<String,String>> consumerTopicList = kafkaConsumerBean.getTopic();
        for (Map<String,String> topicProperty : consumerTopicList){
            KafkaClient.createTopic(topicProperty.get("name"),Integer.parseInt(topicProperty.get("partitions")),Integer.parseInt(topicProperty.get("replication_factor")));
        }
    

    三、总结

     上面解决问题的方法关键在于

    @KafkaListener(topics = "#{'${kafka.listener_topics}'.split(',')}")
    

    @KafkaListener这个注解会去读取spring的yml配置文件中

    kafka:
          listener_topics: kafka-topic-a2b,kafka-topic-c2b
    

    这块listener_topics配置信息,然后通过’,'分割成topic数组,KafkaListener注解中的 topics 参数,本身就是个数组,如下

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.kafka.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Repeatable;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.messaging.handler.annotation.MessageMapping;
    
    @Target({ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @MessageMapping
    @Documented
    @Repeatable(KafkaListeners.class)
    public @interface KafkaListener {
        String id() default "";
    
        String containerFactory() default "";
    
        String[] topics() default {};
    
        String topicPattern() default "";
    
        TopicPartition[] topicPartitions() default {};
    
        String group() default "";
    }
    

     结合我之前的kafka文章,应该是可以拼出一套成型的。

    展开全文
  • 当我们要同时启用多个项目而又要使用不同端口或者变换配置属性时,我们可以在配置文件中设置${变量名}的变量来获取启动时传入的参数,从而实现了动态配置参数,使启用项目更加灵活 例子 server: port: ${PORT:50101...

    序言

    当我们要同时启用多个项目而又要使用不同端口或者变换配置属性时,我们可以在配置文件中设置${变量名}的变量来获取启动时传入的参数,从而实现了动态配置参数,使启用项目更加灵活

    例子

    server:
      port: ${PORT:50101} #服务端口
    spring:
      application:
        name: xc‐govern‐center #指定服务名
    eureka:
      client:
        registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中
        fetchRegistry: true #服务发现,是否从Eureka中获取注册信息
        serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
          defaultZone: ${EUREKA_SERVER:http://eureka02:50102/eureka/} #向该地址上报心跳信息等
      server:
        enable‐self‐preservation: false #是否开启自我保护模式
        eviction‐interval‐timer‐in‐ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
      instance:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200414105541224.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDM5NzM4,size_16,color_FFFFFF,t_70)    hostname: ${EUREKA_DOMAIN:eureka01}
    

    ${PORT:50101}:PORT是变量,当启动时该变量为空则默认50101端口
    语法意思是:从该yml配置文件中或者启动配置传入的参数中获取对应属性值

    可以类比一下写@Value注解时的格式
    @Value(" ${huang.name}")

    我们springboot的配置文件格式已经完成了,那么如何启动呢?

    idea 点击 run -> edit configuration
    在这里插入图片描述设置配置文件参数步骤
    1、首先按“+"号添加一个Application(SpringBoot项目添加SpringBoot也可以)
    2、设置文件名称(随便起一个就行)
    3、主要我画的三个红圈地方
    1)、第一个是启动类的类路径
    2)、设置要传入配置文件中的变量值

    比如我要传入PORT这个变量的值:

    server:
      port: ${PORT:50101} #服务端口
    

    我们就这样写:
    -DPORT=50101(-D可以理解为多个参数之间的分隔符)
    多个参数就这样写:
    -DPORT=50101 -DEUREKA_SERVER=http://eureka02:50102/eureka/ -DEUREKA_DOMAIN=eureka01

    3)、项目名

    完成,启动

    在这里插入图片描述
    在这里选择刚刚搞好的设置的名字,然后点击运行就会按照该设置中的参数来运行该项目了

    展开全文
  • Nacos实现动态配置

    千次阅读 2019-07-30 18:24:13
    Nacos实现动态配置先说我遇到的坑然后去网上搜了大神们的博客配置成功之后springboot启动的结果应该是有这两条的 先说我遇到的坑 上面配置的是yaml文件,然后启动栏输出的是去找nacos-config.properties 然后悲剧...
  • 使用nacos注册中心动态配置配置类无法实现实时更新问题解决方案 问题 使用nacos版本:1.3.1 问题说明及详解: 如果只是单一的在配置类上加入@Component和@RefreshScope注解只会在程序启动时回去读取一次配置文件,...
  • SpringBoot动态配置加载

    千次阅读 2018-12-30 16:11:00
    SpringBoot动态配置加载 1、SpringBoot对配置文件集中化进行管理,方便进行管理,也可以使用HttpClient进行对远程的配置文件进行获取。 创建一个类实现EnvironmentPostProcessor 接口,然后可以对...
  • logback 动态配置 写在前面 在做java日志之前,强烈建议大家读一下这篇java日志的前世今生,对理清java日志框架很有帮助! 奉上地址: 一个著名的日志系统是怎么设计出来的 然后说一下,为啥要使用动态日志...
  •   配置中心(v2.7.0)在Dubbo中承担两个职责: 外部化配置。...  启用动态配置(以Zookeeper为例,可查看动态配置配置项详解): <dubbo:config-center address="zookeeper://127.0.0.1:21...
  • springboot整合Quartz实现动态配置定时任务

    万次阅读 多人点赞 2017-03-09 09:12:20
    在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能。 一、新建一个springboot工程,并添加依赖 org.spring...
  • Dubbo-Dubbo 动态配置中心

    万次阅读 多人点赞 2019-07-14 15:50:43
    Dubbo 动态配置中心 一、参考文档 http://dubbo.apache.org/zh-cn/docs/user/configuration/config-center.html 三大中心指的:注册中心,元数据中心,配置中心。在 2.7 之前的版本,Dubbo 只配备了注册中心,主流...
  • spring schedule 动态配置执行时间

    万次阅读 2019-01-23 09:46:49
    但是最近给银行做的一个小项目,需要本地化部署,所以我不想弄很多的服务,并且他们并没有要求修改以后即时生效,所以我直接采用了 spring schedule结合mysql动态配置执行时间。 之前我们用的schedule通过注解的...
  • java之动态配置定时任务

    千次阅读 2020-08-14 19:10:43
    最近我在工作当中遇到需要支持用户在前端界面上动态配置定时任务的执行时间和执行参数的需求。在我们平时的开发当中,传统的方式就是在类的方法上使用注解@Scheduled(cron = “0 0 0 1 * ?”)这样来配置时任务,但是...
  • 小弟目前在研究关于动态配置规则的需求,遇到一个问题:如果要实现让用户可以动态的自行添加规则的话,那么Fact对象里的属性是不是也要动态的增加?如何实现? 还请各位大神帮帮忙!
  • Seata 动态配置订阅与降级实现原理

    千次阅读 2019-12-22 21:50:29
    Seata 的动态降级需要结合配置中心的动态配置订阅功能。动态配置订阅,即通过配置中心监听订阅,根据需要读取已更新的缓存值,ZK、Apollo、Nacos 等第三方配置中心都有现成的监听器可实现动态刷新配置;动态降级,即...
  • zuul动态配置路由规则,从DB读取

    万次阅读 热门讨论 2017-09-11 15:34:58
    zuul作为一个网关,是用户请求的入口,担当鉴权、转发的重任,理应保持高可用性和具备动态配置的能力。我画了一个实际中可能使用的配置框架,如图。当用户发起请求后,首先通过并发能力强、能承担更多用户请求的负载...
  • nginx动态配置配置

    千次阅读 2019-01-04 16:07:11
    nginx中的conf文件配置测试 upstream backServer{ server 127.0.0.1:11111; upsync 192.168.212.134:8500/v1/kv/upstreams/itmayiedu upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong...
  • Log4j动态配置日志路径

    千次阅读 2017-04-09 09:48:10
    动态配置路径若程序需要的日志路径需要不断的变化,而又不可能每次都去改配置文件,那就要采取两种方法。一、使用环境变量log4j的配置文件。二、代码内配置
  • 1 springboot之动态配置定时任务

    万次阅读 2018-01-16 17:49:32
    最近项目中有关于springboot中动态配置定时任务的需求,查阅各种资料,最终实现了可以动态的开关定时器,以及配置定时器的时间节点。 网上有很多关于springboot定时任务的介绍,之前项目中也用过quartz,和...
  • spring + druid 配置动态配置数据源以及多数据源切换功能实现 数据源连接池使用druid 其他的数据源基本原理相同 spring中配置默认数据源连接池如下: <!-- 数据源配置, 使用 BoneCP 数据库连接池 --> &...
  • Spring Cloud Alibaba实战(一) - Nacos动态配置

    万次阅读 多人点赞 2019-05-13 17:33:59
    (一)Nacos动态配置(二)Nacos注册中心(三)Sentinel之限流(四)Sentinel之熔断(五)Gateway之路由、限流(六)Gateway之鉴权、日志(七)Gateway搭配Nacos实现动态路由(八)Dubbo + Nacos 正文 前两年的Spring微服务世界,...
  • Hystrix系列-4-Hystrix的动态配置

    千次阅读 2017-06-25 16:29:28
    Hystrix默认使用Archaius来实现的动态配置,我们在上节中,使用了代码的方式来实现配置,这节,我们使用Hystrix的动态配置来实现。 1、实现一个Command,代码如下: package com.example.demo.hystrix.command; ...
  • 开发工具:Intellij IDEA。 项目框架:SpringMvc 技术:Maven Profile 项目目录: ...manager是聚合工程,剩下的manager-*是模块,...例一:动态配置数据库源。 目录: 其中,数据库信息位于config下,配置入口
  • spring data elasticsearch 动态配置 indexName,可使用如下方式使用配置文件配置: @Component @Getter public class ConfigBean { @Value("${index.name}") private String indexName; } 然后在Document类上...
  • 在对Mybatis自动扫描配置中,使用注解配置时,@MapperScan中的配置,通常配置如下: ...不支持在yml或properties文件中动态配置。因为MapperScan注解功能的实现类MapperScannerRegistrar实现的是ImportBeanDefinition
  • Springboot 利用 Jedis代码动态配置Redis

    千次阅读 2018-04-17 13:09:05
    Springboot 利用 Jedis代码动态配置Redis 项目需求,甲方需求是处于安全的目的不想让properties里的部分配置信息体现在文件中,而且可能在之后需要通过页面修改对应的配置,所以出的解决方案就是部分配置信息存储在...
  • 场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询再动态配置触发器,以达到动态修改Cron参数的效果。好了,咱们一起来看看是怎么回事。 1....
  • Quartz实现JAVA定时任务的动态配置

    千次阅读 2019-05-27 17:29:10
    什么是动态配置定时任务? 首先说下这次主题,动态配置。没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 定时任务实现方式千人千种,不过基础的无外乎 1、JDK 的Timer类 2、Quartz 3、Spring...
  • SpringBoot+Docker 实现属性动态配置

    千次阅读 2017-06-30 10:34:48
    有的时候,我们会将项目打包成一个docker镜像,但是可能因为项目中某个固定配置的属性不同,docker运行起来后将要做的事情也不同,如果不能动态配置属性,这是个很糟糕的事情,因为可能有十几个不同的属性,笨方法...
  • spring security动态配置url权限认证

    千次阅读 2019-02-27 22:38:38
    本文转载自--------------------------------...本文介绍的spring security动态配置url权限认证基于的是spring-boot-2.0.0、spring-security 5.X来编写的。 笔者浏览完spring security官方文档之后,发现并没有详细...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,194,900
精华内容 477,960
关键字:

动态配置