服务订阅的目的是为了,能够第一时间感知到被调用服务的实例变化,从而能够及时更新本地缓存,避免调用失败。
subscribe和unsubscribe的逻辑,只有临时实例才有,永久实例是不存在订阅逻辑的。所以还是比较推荐用临时类型的服务注册,这也是官方客户端默认的类型
看一下服务调用的逻辑如何实现的:
SubscribeServiceRequestHandler#handle(*)
1 | public SubscribeServiceResponse handle(SubscribeServiceRequest request, RequestMeta meta) throws NacosException { |
-> EphemeralClientOperationServiceImpl#subscribe(*)
1 | public void subscribeService(Service service, Subscriber subscriber, String clientId) { |
和上一篇一样,大部头的逻辑都是通过事件机制驱动的:
- SubscribeServiceTraceEvent //处理逻辑留给用户进行扩展,所以没啥好讲的
- ClientOperationEvent.ClientSubscribeServiceEvent 处理函数如下
1 | //ClientServiceIndexesManager.class |
- ServiceEvent.ServiceSubscribedEvent
这里也就是客户端第一次订阅该服务,才会触发该事件,做一次服务实例信息推送。
1 | //NamingSubscriberServiceV2Impl.class |
服务订阅和注册的唯一项如何确定,由如下三个属性决定:
1 | public class Service implements Serializable { |
总结:
- 服务订阅功能的目的是避免服务调用失败
- 服务订阅第一次发起,服务端会全量推一次订阅服务所有实例信息