终于整明白了Nacos是如何整合SpringCloud -- 注册中心篇

简介: 前面我们聊到了nacos是如何进行服务注册的 ,这篇文章我们再来聊一聊nacos是如何整合springcloud的,我们来看一看是如何实现服务的自动注册。

大家好,我是三友~~

前面我们聊到了nacos是如何进行服务注册的 ,这篇文章我们再来聊一聊nacos是如何整合springcloud的,我们来看一看是如何实现服务的自动注册。

目录

  • springcloud服务自动注册的三大组件
  • nacos整合springcloud的实现
  • nacos整合ribbon实现
  • 个人的思考
  • 总结

公众号:三友的java日记

maven依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version> 
</dependency>

springcloud服务自动注册的三大组件

说到springcloud,大家肯定不会陌生,springcloud说的简单点就是提供的一套规范(接口),要想接入springcloud,只要按照这套规范实现接口就能够完成了跟springcloud的整合,比如前几年挺火的springcloud-netflix,现在的springcloud-alibaba,其实都是实现了这套约束。

在服务注册这一方面,springcloud也提供了一套标准,使得项目启动的时候能够自动往服务注册中心注册,nacos就是实现了这套标准,其实不光nacos,什么eureka等实现都是实现了这套标准。接下来就让我看看springcloud提供的这套标准接口。

image.png

ServiceRegistry:服务注册接口,通过这个api直接可以向服务注册中心注册

image.png

image.png

Registration:服务实例的数据的封装,提供获取包括ip、端口之类的服务基本信息的方法

image.png

AbstractAutoServiceRegistration:自动注册类,这个类监听了WebServerInitializedEvent事件,容器启动的时候,会发布这个事件,然后触发自动注册

三个组件是如何协同工作的?

我这里先说结论,当容器启动的时候,AbstractAutoServiceRegistration监听到事件,然后调用ServiceRegistry#register方法将Registration(服务实例数据)注册到注册中心。

下面贴出源码

由于监听了事件,所以直接看onApplicationEvent方法的实现就行了

image.png

接下来进入start方法

image.png

核心就是这个register方法,这个方法就是往服务注册中心进行注册。

这里有两个细节,在注册前后发布了事件,这是个扩展的方式,就是允许你自己在服务注册前后进行自定义的操作。

接下来进入register方法

image.png

就是直接调用ServiceRegistry#register方法进行注册。而这些都需要具体的注册中心进行实现。

nacos整合springcloud的实现

上面我们说了springcloud提供的关于服务注册的标准,接下来我们就来看看nacos是如何实现的?

在看实现源码之前,我们不防进行猜想,我们来猜一猜nacos怎么实现。其实看源码猜想是个很重要的环节,带着自己的猜想去看验证源码,这样就能够加深印象。

通过上面说的三个组件的工作关系,我们来猜测一下。这三个接口最重要的是服务注册,那么核心是不是ServiceRegistry#register方法实现?Registration只是一个数据的封装,说白了就是跟new出来的User是一样的。那么ServiceRegistry该怎么实现呢?在 聊一聊nacos是如何进行服务注册的 一文中我剖析了,nacos是通过NamingService实现向服务端注册数据的,那么ServiceRegistry的register方法,是不是直接调用NamingService方法实现注册就可以了。接下来我们就来验证一下。

1)ServiceRegistry实现--NacosServiceRegistry

接下来看一看register方法实现。

image.png

果然,跟我们猜想的一样,其实就是通过nacos提供的api NamingService将服务实例进行数据进行注册,只不过只是将springcloud的Registration转换成nacos认识的Instance而已。

2)Registration实现 -- NacosRegistration

image.png

方法的实现其实就是通过NacosDiscoveryProperties来获取数据的,NacosDiscoveryProperties就是我们在application配置文件配置的属性的封装对象。

image.png

3)AbstractAutoServiceRegistration继承 -- NacosAutoServiceRegistration

nacos的实现重写了springcloud提供的register方法,我们看一下重写的方法

image.png

其实就是加了一些判断,最终还是调用父类的register方法,也就是调用ServiceRegistry#register方法。

上面这三个实现是通过自动装配来实现对象的构造,附上配置类NacosServiceRegistryAutoConfiguration,方便大家查看关系

image.png

nacos整合ribbon实现

首先抛出个问题,为什么nacos需要整合ribbon?

ribbon是负载均衡的组件,负载均衡,那是不是得有服务列表,不然怎么实现负载均衡?是的,基于这个原因,就可以解释nacos为什么需要适配ribbon,因为通过nacos提供的api,就可以从nacos服务端拉取服务注册表,这样服务数据的来源就有了。那么nacos是如何整合ribbon的呢?

ribbon提供了一个接口ServerList,ribbon会通过这个接口获取服务数据,nacos就是通过实现这个接口来实现整合nacos的。

ServerList 源码

image.png

就是提供了两个获取服务实例的方法。

接下来我们来看一看ServerList的实现NacosServerList源码。

image.png

可以看出,实现其实很简单,就是通过nacos提供的api NamingService来实现获取服务实例,然后转换成ribbon认识的NacosServer。

如果不清楚NamingService api的作用,请看一下 聊一聊nacos是如何进行服务注册的 这篇文章。

NacosServerList对象构造源码

image.png

个人的思考

其实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的获取服务列表的看法。最后谢谢大家。

PS:如果觉得这篇文章对你有帮助,欢迎大家关注公众号三友的java日记、分享、点赞、在看,感谢支持。

往期热门文章推荐

如何去阅读源码,我总结了18条心法

如何写出漂亮代码,我总结了45个小技巧

三万字盘点Spring/Boot的那些常用扩展点

三万字盘点Spring 9大核心基础功能

万字+20张图剖析Spring启动时12个核心步骤

1.5万字+30张图盘点索引常见的11个知识点

两万字盘点那些被玩烂了的设计模式

搜索关注公众号 三友的java日记 ,及时干货不错过,公众号致力于通过画图加上通俗易懂的语言讲解技术,让技术更加容易学习,回复 面试 即可获得一套面试真题。

相关文章
|
1天前
|
安全 Linux Nacos
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
如何使用公网地址远程访问内网Nacos UI界面查看注册服务
11 0
|
14天前
|
负载均衡 Cloud Native Java
Nacos 注册中心(2023旧笔记)
Nacos 注册中心(2023旧笔记)
17 0
|
14天前
|
负载均衡 监控 容灾
【SpringCloud】详解Eureka注册中心
【SpringCloud】详解Eureka注册中心
23 0
|
14天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
1月前
|
Dubbo Java 应用服务中间件
深度剖析:Dubbo使用Nacos注册中心的坑
2020年笔者在做微服务部件升级时,Dubbo的注册中心从Zookeeper切换到Nacos碰到个问题,最近刷Github又有网友提到类似的问题,就在这篇文章里做个梳理和总结。
深度剖析:Dubbo使用Nacos注册中心的坑
|
1月前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
1月前
|
Dubbo Java 应用服务中间件
双活工作下的数据迁移:Nacos注册中心实战解析
这篇内容介绍了如何使用NacosSync组件进行双活项目中的注册中心数据迁移。首先,准备包括64位OS、JDK 1.8+、Maven 3.2+和MySQL 5.6+的环境。接着,获取并解压NacosSync安装包,配置数据库连接,启动服务,并通过访问特定URL检查系统状态。然后,通过NacosSync控制台进行集群配置,添加Zookeeper和Nacos集群,并设置同步任务。当数据同步完成后,Dubbo客户端(Consumer和Provider)更新配置以连接Nacos注册中心。最后,迁移完成后,原有的Zookeeper集群可下线,整个过程确保了服务的平滑迁移。
38 1
|
1月前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
21 4
Spring boot与Spring cloud之间的关系
|
2月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
63 0
|
2月前
|
运维 Kubernetes Nacos
nacos常见问题之服务注册IP白名单如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
31 0