通常,一个服务发现系统主要由三部分组成:
- 注册器(registrator):根据服务运行状态,注册/注销服务。主要要解决的问题是,何时发起注册/注销动作。
- 注册表(registry):存储服务信息。常见的解决方案有zookeeper、etcd、cousul等。
- 发现机制(discovery):从注册表读取服务信息,给用户封装访问接口。
在Docker集群系统中,常见的做法是由服务发现机制封装在集群管理层(YARN、Kubernetes等):由于容器的部署、运行监控都掌握在集群管理器手里,何时注册/何时注销很容易决定,而且registry backend与服务信息定义都由集群管理系统来封装。
最近看到一个有趣的项目——Registrator,它一个是独立的服务注册器,无需依赖任何集群管理系统,:
- 通过docker socket直接监听容器event,根据容器启动/停止等event来注册/注销服务
- 每个容器的每个exposed端口对应不同的服务
- 支持可插拔的registry backend,默认支持Consul, etcd and SkyDNS
- 自身也是docker化的,可以容器方式启动
- 用户可自定义配置,如服务TTL(time-to-live)、服务名称、服务tag等