首页 > 其他分享 >DConf —— 应用的动态配置

DConf —— 应用的动态配置

时间:2024-12-01 13:21:39浏览次数:3  
标签:动态 return err 配置 ctx dynCfg DConf 我们

我相信大多数开发者在编写应用程序时,都会面临一个基本问题:如何在应用启动时进行配置。我通常使用环境变量(ENVs)来设置一些可以根据运行环境或时间改变的值。然而,这些配置仅在应用启动时生效。如果我们需要更改配置,该怎么办呢?显然,我们需要用新的配置值重启应用。在某些情况下,这样做是合理的,但有些配置值可以是动态的,对吧?

让我们来看一个虚构的应用,它用于我们的金融项目。假设我们有一个应用程序,它处理用户的交易,并需要计算一些费用和控制用户的限制(即用户在其订阅计划期间允许执行的交易次数)。有一些管理员可以手动管理系统设置。例如,今天是一个假日,我们希望给用户更多的机会:增加限制并降低交易费用。由于我们使用的是传统的配置方式,我们需要更改配置并重启所有应用实例。但如果我们有一些动态配置,我们就可以在不重启的情况下实现这一目标!

因此,让我们创建我们的 DConf——动态配置。

项目初始化

在这个例子中,我们将使用 Golang。首先,创建项目目录并初始化一些命令:

# 创建项目目录,假设我们在 ~/go/src/github.com/myaccount
mkdir dconf
# 初始化应用
go mod init

应用架构设计

我们需要一个管理服务来管理配置的所有操作,并使用数据库(DB)。因此,创建一个管理包:

mkdir manager

接下来,我们需要为将要使用的数据库存储库定义一个接口。这个存储库应该能够从数据库中提供配置。此外,我们可以添加一个方法来更新配置,以便我们希望从应用中更新它或进行一些测试。

创建文件并定义存储库接口:

touch manager/interface.go

package manager

import (
    "context"
)

type Repository interface {
    UpdateConfig(ctx context.Context, value any) error
    GetConfig(ctx context.Context, obj, defaultValue any) error
}

管理器实现

定义管理器结构:

touch manager/manager.go

type ConfigManager[T any] struct {
    repo         Repository
    scanInterval time.Duration
    mx           sync.Mutex
    dynCfg       T
}

func New[T any](repo Repository, initCfg T, scanInterval time.Duration) *ConfigManager[T] {
    return &ConfigManager[T]{
        dynCfg:       initCfg,
        repo:         repo,
        scanInterval: scanInterval,
    }
}

repo 是我们的存储库实例,scanInterval 是调用存储库的 GetConfig 方法的时间间隔,mx 是用于防止配置使用时竞争的互斥锁,dynCfg 是当前实际的动态应用配置。

由于我们的配置结构可以是任何类型,因此我们使用泛型声明配置管理器。

加载配置方法

我们需要一个方法从存储库加载配置:

func (m *ConfigManager[T]) LoadConfig(ctx context.Context) error {
    var cfg T
    if err := m.repo.GetConfig(ctx, &cfg, m.dynCfg); err != nil {
        return err
    }
    m.mx.Lock()
    defer m.mx.Unlock()
    m.dynCfg = cfg
    return nil
}

获取配置方法

获取当前配置的方法:

func (m *ConfigManager[T]) GetConfig() T {
    m.mx.Lock()
    defer m.mx.Unlock()
    return m.dynCfg
}

定时更新配置

为了始终保持配置的最新状态,我们需要添加一个后台执行任务,每隔 N 秒从存储库中获取配置:

func (m *ConfigManager[T]) Run(ctx context.Context, wg *sync.WaitGroup) error {
    if err := m.LoadConfig(ctx); err != nil {
        return err
    }
    wg.Add(1)
    go func() {
        defer wg.Done()
        for {
            select {
            case <-ctx.Done():
                return
            case <-time.After(m.scanInterval):
                if err := m.LoadConfig(ctx); err != nil {
                    log.Printf("error while loading the config: %v", err)
                }
            }
        }
    }()
    return nil
}

Run 方法中,我们进行:

  • 初始配置加载:应用启动时,我们希望从分布式存储中获取实际配置,而不是使用默认值。
  • 每隔 N 秒运行一个 goroutine 来加载配置。这将帮助我们始终保持配置的最新状态。

结论

现在,你可以使用这个配置管理器来改进你的系统,实现动态配置,从而简化开发工作

标签:动态,return,err,配置,ctx,dynCfg,DConf,我们
From: https://www.cnblogs.com/cheyunhua/p/18579722

相关文章

  • 动态顺序表
    顺序表(动态)顺序表分为静态和动态,静态的顺序表和动态顺序表相关接口的实现差别不大,因此不在赘述。头文件定义类型定义#pragmaonce#include<stdio.h>#include<stdlib.h>#include<assert.h>//#defineN10#defineINIT_CAPACITY4//给顺序表一个初始大小t......
  • 程序化交易中,处理多品种配置有哪些要求?
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)股票量化,Python炒股,CSDN交流社区>>>不同市场间的关联在程序化交易多品种配置时,需考量不同市场间的关联。例如股票市场与期货市场,尽管交易标的不同,但某些经济因素会使其存在......
  • 计算机配置 → 管理模板 → Windows 组件- 数据收集和预览版本- 允许诊断数据 ---已
    计算机配置→管理模板→Windows组件-数据收集和预览版本-允许诊断数据---已启用诊断数据关闭禁用"允许发送Windows诊断数据中的设备名称"在隐私方面的影响主要体现在以下几个方面。设备名称是Windows诊断数据的一部分,它通常包含硬件的详细信息,如计算机名称、型......
  • 前端项目结构与配置深度解析 —— Vite 工程的最佳实践
    目录前言1.Vite项目的总体结构概览2.配置与依赖管理2.1`vite.config.js`:项目运行的核心配置2.2`package.json`:项目的元信息与依赖管理3.源代码目录`src`的设计与优化3.1API模块:管理所有的网络请求3.2静态资源管理:`assets`目录3.3路由与页面结构3.4根组件......
  • 使用css3绘制一个圆形动态的时钟
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>CSSClock</title>......
  • 通过代码实现log4net自定义配置
    大家在使用log4net的时候,常规的用法都是在配置文件里面进行设置。但是配置文件里面的配置项非常多,不利于记忆,所以说我们希望他能直接在代码中设置。于是,我写了个自定义日志配置的方法,核心的配置对象为RollingFileAppender,只需要对他进行设置就可以了。下面给大家展示下,基于......
  • NPM配置镜像源
    1淘宝镜像源1.命令npmconfigsetregistryhttps://registry.npmmirror.com2.验证命令npmconfiggetregistry如果返回https://registry.npmmirror.com,说明镜像配置成功。2腾讯镜像源1、命令npmconfigsetregistryhttp://mirrors.cloud.tencent.com/npm/2.......
  • 编译配置文件 build.gradle
    新创建的App项目默认有两个build.gradle,一个是Project项目级别的build.gradle;另一个是Module模块级别的build.gradle。项目级别的build.gradle指定了当前项目的总体编译规则,打开该文件在buildscript下面找到repositories和dependencies两个节点,其中repositories节点用于设置Andro......
  • HCP-05 VRRP原理与配置
    目录VRRP技术概述单网关面临的问题VRRP概述VRRP的基本概念VRRP报文格式VRRP定时器VRRP技术原理VRRP状态机VRRP协议状态VRRP主备选举VRRP主备切换VRRP主备回切VRRP典型应用VRRP负载分担VRRP监视上行端口VRRP与BFD联动VRRP与MSTP结合应用VRRP基本配置VRRP常用配置命令VRRP基础配置实......
  • Nacos部署和使用(服务注册与发现、配置中心)
    1.docker部署nacos参考:docker安装nacos-CSDN博客2.注册中心原理在微服务远程调用的过程中,包括两个角色:服务提供者:提供接口供其它微服务访问,比如A-service服务消费者:调用其它微服务提供的接口,比如B-service在大型微服务项目中,服务提供者的数量会非常多,为了管理这些服务......