有一个超时配置,需要从配置文件中读取并设置到连接池中://从配置文件中读取超时配置timeout=CGlobalConf::readFileConf("timeout");//设置请求超时阈值CConnectionPool::setTimeout(timeout);如果需要修改超时配置,每次都要重启服务,非常麻烦。服务不能重启吗?解决方案1:发送信号以触发配置过载。该方法不需要添加任何组件,新增一个signalcatch函数来处理配置重载。//服务启动时,设置ctrl+c回调函数signal(SIGINT,sigint_shenjian_process);//捕获ctrl+c时,执行配置重载动作voidsigint_shenjian_process(int){//从配置中读取超时配置timeout=CGlobalConf::readFileConf(“timeout”);//设置请求超时阈值CConnectionPool::setTimeout(timeout);}当需要更改配置时,只需要:修改配置文件;发送信号触发配置重新加载;画外音:什么,不知道如何向服务发送信号?解决方案2:检测配置文件更改并自动重新加载。此方法不需要手动发送信号。修改配置文件后,会自动检测并加载。您需要添加一个文件监控组件。画外音:这种类型的开源组件有很多。文件监控组件如何监控文件变化?别想的复杂,可以定期查看文件的md5或者last_modify_time。//服务启动时,初始化CFileMonitor::init(){//获取初始md5old_md5=xxx;}//启动一个进程,监听文件变化CFileMonitor::start(){while(1){//循环检查//获取最新的md5now_md5=xxx;//比较md5是否有变化,如果有变化if(now_md5!=old_md5){//从配置中读取超时配置timeout=CGlobalConf::readFileConf("timeout");//设置请求timeoutThresholdCConnectionPool::setTimeout(timeout);//修改md5old_md5=now_md5;}//一秒后检查sleep(1000);}}方案三:注册中心,当配置发生变化时,回调子方案丢弃配置文件,需要引入Registry:所有服务都从registry获取配置;配置必须从registry后台修改;配置修改,注册中心回调引用相关配置的服务;//服务启动时,从注册中心获取配置并注册回调函数timeout=CConfCenter::("timeout",callback_shenjian);//设置requesttimeoutthresholdCConnectionPool::setTimeout(timeout);voidcallback_shenjian(timeout){//在注册中心修改配置时,会收到回调CConnectionPool::setTimeout(timeout);}修改配置不重启服务。以上三种方法都很常用,不难但是很实用。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
