当前位置: 首页 > news >正文

配置中心

本文通过一个案例,介绍 配置文件 和 配置中心 的必要性

案例:这是你自己的一个项目

一个 java web 项目

需求:通过一个请求返回你女朋友的名字name(支持null)

这个项目很简单,于是你开始进行开发实现:

1. 实现:在代码中将女朋友名字赋值给name,作为响应内容,打jar包,部署运行;

2. 访问:打开浏览器,输入对应链接,返回你女朋友名字;

over, so easy ...

...

针对一些情况,你的开发可以说非常成功,如:

a. 你是一个单身狗,name为null;你若想打一辈子光棍,ok,我服,代码中name写死为null,over

b. 你有一个挚爱,而且你是一个从一而终的人,一辈子就只要她一个,我也服,代码中name写死为你女朋友名字,over

c. 你换的女朋友名字都一样,我更服,代码中name写死,over

...

but . . . (配置文件引入)

现实并没有那么极端,现实就是现实,假如你被绿了,分手了,重新找个女朋友。那么怎么办呢,请求返回的名字并不是你现在女朋友的名字,改程序吧:

1. 停掉服务

2. 改写代码,将name改为现在女朋友的名字

3. 打jar包,部署运行

4. 访问,显示你现在女朋友的名字

...

但是作为一名合格的开发人员,应该尽量避免这种重新部署和更改源码的事请发生;

现实中,这种问题的出现也不是大问题,停就停下呗,改就改下呗,不就是麻烦一下吗

...

but...

此处做个不合理的假设,你若是频繁被绿呢,相信你也能感觉到的不仅仅是一种被绿的痛苦,还要频繁的更改源码和打包部署的痛苦

所以你变聪明了,你将name放在配置文件中,如下:

# green.properties

name=如花

这样,实现了数据和代码的解耦,每次被绿,你只需要更改配置文件,然后重新部署。是不是感觉到了一丝幸福。

but...

目前还存在一个问题——重新部署,总是要重新部署肯定是一个非常失败的开发选择

避免重新部署:

你可能想到避免重新部署的方式,肯定需要在配置文件更改时,应用自动感知,并更新name值

实现方式可能是:代码中设计配置文件更改的监听器,并实现name的更新。

问题解决,既不用更改源码,也不用重新部署,再也不用担心被绿了

...

but...

因为你的频繁被绿,使你备受大家的关注,关注量很高很高,他们都想通过这个请求来了解你的被绿情况,以至于服务其无法承载如此高的并发访问量(即时你在服务器上做了很好的并发请求处理逻辑,但硬件上确实已经到达上限);

所以你将应用部署到200个服务器上,结果很nice,多个服务器可以承载如此高的访问量,满足了大家的需求;

but...

你又被绿了...改配置文件吧...

 

1. 连接服务器1,更改服务器1中应用的配置文件的name值

2. 连接服务器2,更改服务器2中应用的配置文件的name值

3. 连接服务器3,更改服务器3中应用的配置文件的name值

4. 连接服务器4,更改服务器4中应用的配置文件的name值

...

200. 连接服务器200,更改服务器200中应用的配置文件的name值

ok. 更改完毕!

简单的更改name,却要更改200次,累么??? 200 个服务器,一个一个改配置,耗时,耗力,更何况是频繁。并且在更改期间,部分服务器上name已改,部分服务器上name未改,就会导致数据一致性问题

解决方案——配置中心

200个服务器上的该应用都依赖于一个配置文件,这样的话,每次只需更改这一个配置文件便可!

于是:

1. 将所有服务器上的该配置文件删除

2. 将一个地方创建一个该配置文件

3. 将所有服务器上的应用的配置源改为此地方的此配置文件,这个地方被称为配置中心,这个文件被称为中心配置文件

 

完美:目前应用,不用改源码、不用重启、支持高并发、没有在每个服务器上更改配置的冗余操作

相信你已经对配置文件和配置中心有了一定的感性认识,对于单机版,我们称之为配置(文件);对于分布式集群系统,将配置文件抽出为核心配置文件,我们称之为配置中心(系统);

关于分布式配置中心,网上已经有很多开源的解决方案。nacos作为其中一种,在另一篇博文中有详细介绍。 

转载于:https://www.cnblogs.com/yelao/p/10741156.html

相关文章:

  • 如何设置游戏分辨率(C++)
  • go任务调度6(etcd租约机制/自动过期)
  • 搜索引擎网址提交入口
  • UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
  • centos查看启动时间
  • Etsy如何及为什么迁移到API优先的架构
  • SpringBoot中AOP的配置
  • iOS标准库中常用数据结构和算法之查找
  • CoreText实现图文混排之点击事件-b
  • 性能优化技巧 - 集群维表
  • 不同机器下,游戏编程如何保证物体移动具有相同的速度
  • 量子通信是个鸡肋,没有证券分析师说得那么好
  • 微信,QQ这类IM app怎么做——谈谈Websocket
  • DRF如何序列化外键的字段
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • [笔记] php常见简单功能及函数
  • 2017-09-12 前端日报
  • bootstrap创建登录注册页面
  • CentOS 7 修改主机名
  • Flannel解读
  • iOS | NSProxy
  • JavaScript类型识别
  • js对象的深浅拷贝
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 如何学习JavaEE,项目又该如何做?
  • 算法---两个栈实现一个队列
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过git安装npm私有模块
  • # 数据结构
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (007)XHTML文档之标题——h1~h6
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET学习全景图
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /dev下添加设备节点的方法步骤(通过device_create)
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [C++进阶篇]STL中vector的使用
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [GXYCTF2019]禁止套娃
  • [HackMyVM]靶场Crossbow