分析&回答
服务注册
服务注册是针对服务端的,服务启动后需要注册,分为几个部分:启动注册、定时续期、退出撤销
服务发现
服务发现是针对调用端的,一般分为两类问题:存量获取、增量侦听
客户端发现模式(客户端自主选择)
- 服务提供者向注册中心进行注册,提交自己的相关信息
- 服务消费者定期从注册中心获取服务提供者列表
- 服务消费者通过自身的负载均衡算法,在服务提供者列表里面选择一个合适的服务提供者,进行访问。
优点:
- 负载均衡作为client中一个功能,用自身的算法,从服务提供者列表中选择一个合适服务提供者进行访问,因此client端可以定制化负载均衡算法。优点是服务客户端可以灵活、智能地制定负载均衡策略,包括轮询、加权轮询、一致性哈希等策略。
- 可以实现点对点的网状通讯,即去中心化的通讯。可以有效避开单点造成的性能瓶颈和可靠性下降等问题。
- 服务客户端通常以SDK的方式直接引入到项目,这种方式语言的整合程度最佳,程序执行性能最佳,程序错误排查更加容易。
- Dubbo 就是使用客户端服务发现模式
缺点:
- 当负载均衡算法需要更新时候,很难做到同一时间全部更新,所以就造成新旧算法同时运行
- 与注册中心紧密耦合,如果要换注册中心,需要去修改代码,重新上线。微服务的规模越大,服务更新越困难,这在一定程度上违背了微服务架构提倡的技术独立性。
服务端发现模式(客户端被动选择)
- 服务提供者向注册中心进行服务注册
- 注册中心提供负载均衡功能
- 服务消费者去请求注册中心,由注册中心根据服务提供列表的健康情况,选择合适的服务提供者供服务消费者调用
优点:
- 服务消费者不需要关心服务提供者的列表,以及其采取何种负载均衡策略
- 负载均衡策略的改变,只需要注册中心修改就行,不会出现新老算法同时存在的现象
- 服务提供者上下线,对于服务消费者来说无感知
- 现代容器化部署平台(如Docker和Kubernetes)就是使用服务端服务发现模式
缺点:
- rt增加,因为每次请求都要请求注册中心,尤其返回一个服务提供者
- 注册中心成为瓶颈,所有的请求都要经过注册中心,如果注册服务过多,服务消费者流量过大,可能会导致注册中心不可用
- 微服务的一个目标是故障隔离,将整个系统切割为多个服务共同运行,如果某服务无法正常运行,只会影响到整个系统的相关部分功能,其它功能能够正常运行,即去中心化。然而,服务端发现模式实际上是集中式的做法,如果路由器或者负载均衡器无法提供服务,那么将导致整个系统瘫痪。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!