互联网应用的架构不是一蹴而就的, 各种技术方案是在网站的不断发展中演进出来的
如果我们只看着高大上的技术方案去学习, 最终会学会了也不知道这些方案是为了解决什么问题!
知道架构发展的进程非常重要, 甚至比具体的架构方案还要重要, 这样我们就能以发展的眼光去根据需要自己设计架构
1. 方案1: 配置私藏
1.1 架构图
1.2 方案解析
- 以上图为例
 user-service服务做了服务高可用负载均衡, 所以有三个服务器, 三个服务器IP各是ip1ip2ip3- 每个 
业务service作为调用链上游, 各自配置了一个user-service.conf文件, 其中记录了user-serivce的各个服务器的IP - 正常情况下各个 
业务service能够很好的调用user-service提供的服务 
1.3 问题
- 当 
user-service发生改动, 例如扩容缩容宕机迁移等情况的时候, 各个业务service对此完全无感知 - 各业务service想要获取 
user-service最新的状态, 必须由人工给每个 业务service 手动修改他们的user-service.conf user-service想要知道有多少个调用方也很难, 无法进行有效的管理- 通知各个调用方进行配置修改, 很可能需要几周的时间才能完成
 
2. 方案2: 全局配置文件
- 架构的升级并不是一步到位的
 - 企业在升级架构的时候, 往往会用最低的成本去解决眼前的问题, 而不是去追求技术的高大上, 因为业务才是一个公司的核心
 - 运维层面需要制定规范, 建立 
全局配置文件, 对于通用的服务必须配置在全局配置文件中 - 调用方如果想要调用通用服务, 必须引用 
全局配置文件 
2.1 架构图
2.2 方案解析
2.2.1
- 业务服务引入 
FileMonitor组件和DynamicConnectionPool组件 FileMonitor组件是用来监听文件改动的组件DynamicConnectionPool组件是用来动态管理服务连接池的组件- user-service服务器发生变动, 则手动修改 
global.conf文件中的配置 - 当 
FileMonitor监听到global.conf文件发生变化会通知DynamicConnectionPool修改user-service服务的连接池 
2.2.2
- 如果没有
FileMonitor组件和DynamicConnectionPool组件也是可以的 - 只不过需要各业务service多一次重启操作来更新对user-service的配置
 - 在业务快速迭代的初期, 其实重启操作根本不是事
 - 根据需要去选择方案
 
2.3 问题
- 虽然此方案不需要每个人修改配置, 但是依然不是完全自动化, 还是需要有人修改配置
 - 而且服务方也不知道有哪些调用方调用自己
 - 当服务数量太大的情况下, 将又会变得无法管理
 
3. 方案3: 配置中心
- 
3.1 架构图
3.2 方案解析
 每个服务都是平等的
- 每个服务都会将自己的元信息注册到配置中心
 - 每个服务的元信息发生变化, 都会通知依赖方, 依赖方会根据自己的需要调整配置和连接池
 - 服务发现, 服务治理, 动态配置等功能都是基于配置中心搞出来的
 - 至于配置中心的高并发高可用问题, 我们这里暂时不讨论
 
3.3 总结
- 只有当服务大道一定程度的时候才值得使用配置中心, 比如服务有上百个了
 - 维护开发配置中心是需要花费大量的人力的
 - 所以企业应当一切以业务为先, 技术是为业务服务的, 没有高低之分
 
