一文带你看懂nacos是如何整合springcloud -- 注册中心篇(四)
三、nacos整合ribbon实现
首先抛出个问题,为什么nacos需要整合ribbon?
ribbon是负载均衡的组件,负载均衡,那是不是得有服务列表,不然怎么实现负载均衡?是的,基于这个原因,就可以解释nacos为什么需要适配ribbon,因为通过nacos提供的api,就可以从nacos服务端拉取服务注册表,这样服务数据的来源就有了。那么nacos是如何整合ribbon的呢?
ribbon提供了一个接口ServerList,ribbon会通过这个接口获取服务数据,nacos就是通过实现这个接口来实现整合nacos的。
ServerList 源码
就是提供了两个获取服务实例的方法。
接下来我们来看一看ServerList的实现NacosServerList源码。
可以看出,实现其实很简单,就是通过nacos提供的api NamingService来实现获取服务实例,然后转换成ribbon认识的NacosServer。
如果不清楚NamingService api的作用,请看一下 聊一聊nacos是如何进行服务注册的 这篇文章。
NacosServerList对象构造源码
个人的思考
其实ribbon在整合springcloud的实现在获取服务数据的整合方式我其实是持保留意见的。因为ribbon并没有实现通过springcloud提供的api来获取服务列表,而是需要第三方注册中心来主动适配ribbon,这就使得springcloud失去了约束的意义。就类似mybatis一样,mybatis依靠jdbc,但是mybatis根本不关心哪个数据库实现的jdbc。其实ribbon完全可以通过springcloud的api(DiscoveryClient)来实现从获取列表,这样注册中心主要去适配这个接口,而不需要直接适配ribbon。
DiscoveryClient其实就是springcloud提供的一个接口,用来获取服务实例的,需要各自注册中心实现,nacos的实现是NacosDiscoveryClient,实现也跟上面整合ribbon的差不多,这里我就不去翻源码了。
如果你有兴趣,可以仿照nacos实现,自己实现ribbon通过DiscoveryClient来获取服务实例。这里我就不贴出实现的源码,如果你有需要,可关注公众号,回复 ribbon,即可获取到实现源码和使用方法。
总结
本文首先讲了springcloud的关于服务自动注册的三大组件,通过这些组件就实现了当web应用启动的时候自动往服务注册中心进行注册,接下来我们剖析了nacos对应三大组件实现的源码,然后讲解了nacos适配ribbon的源码,同时个人也提出了ribbon实现springcloud的获取服务列表的看法。最后谢谢大家。
文章转自公众号:三友的java日记