背景
大多数系统都是从一个单一系统开始起步的,随着公司业务的快速发展,这个单一系统变得越来越庞大,带来几个问题:
- 随着访问量的不断攀升,纯粹通过提升机器的性能来已经不能解决问题,系统无法进行有效的水平扩展
- 维护这个单一系统,变得越来越复杂
- 同时,随着业务场景的不同以及大研发的招兵买马带来了不同技术背景的工程师,在原有达达Python技术栈的基础上,引入了Java技术栈。
如何来解决这些问题?业务服务化是个有效的手段来解决大规模系统的性能瓶颈和复杂性。通过系统拆分将原有的单一庞大系统拆分成小系统,它带来了如下好处:
- 原来系统的压力得到很好的分流,有效地解决了原先系统的瓶颈,同时带来了更好的扩展性
- 独立的代码库,更少的业务逻辑,系统的维护性得到极大的增强
同时,也带来了一系列问题:
- 随着系统服务的越来越多,如何来管理这些服务?
- 如何分发请求到提供同一服务的多台主机上(负载均衡如何来做)
- 如果提供服务的Endpoint发生变化,如何将这些信息通知服务的调用方?
最初的解决方案
Linkedin的创始人里德霍夫曼曾经说过:
成立一家初创公司就像把自己从悬崖上扔下来,在降落过程中去组装一架飞机。
这对于初创公司达达也是一样的,业务在以火箭般的速度发展着。技术在业务发展中作用就是保障业务的稳定运行,快速地“组装一架飞机”。所以,在业务服务化的早期,我们采用了Nginx+本地hosts文件的方式进行内部服务的注册与发现,架构图如下:
各系统组件角色如下:
- 服务消费者通过