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