Spring Cloud 如何实现服务注册?
Spring Cloud 如何实现服务注册?
回答重点
SpringCloud 服务注册和发现需要依赖其它注册中心。
项目在启动时,会自动将本身服务的服务名、IP、端口信息通过引入的注册中心依赖注册到服务注册中心的服务端。
扩展知识
说到服务注册,我们得先从注册中心讲起。
对于任何注册中心来说,都有客户端和服务端的概念
- 服务端需要单独部署,用来保存服务实例数据的
- 客户端就是用来跟服务端通信的SDK,带到Java里面就是一个pom依赖
这里我就拿 Nacos 举例。
当需要向 Nacos 服务端注册或者获取服务实例数据的时候,只需要通过 Nacos 提供的客户端 SDK 就可以了,就像下面这样:
引入依赖
1 | <dependency> |
示例代码
1 | Properties properties = new Properties(); |
通过上述代码就成功将order服务实例注册到注册中心了
我们再回到 SpringCloud。
其实 SpringCloud 本身并没有服务注册的能力。
真正进行服务注册的,还是注册中心的客户端。
所以我们在项目中需要引入对应注册中心的依赖。
比如在 SpringCloud 下使用 Nacos 作为注册中心,就得引入对应的 Nacos 的依赖
1 | <dependency> |
而 SpringCloud,说得简单其实就是定义了一套规范,不同的注册中心只需要适配这套注册规范。
那么在项目启动的时候自然而然就可以吧服务注册到服务注册中心。
那么下面来讲一讲SpringCloud的服务注册的规范是什么。
服务自动注册三板斧
SpringCloud提供的服务自动注册的规范,其实就是三个接口,只要注册中心实现这些接口,就能够在服务启动时自动注册到注册中心,而这三个接口我称为服务自动注册三板斧。
服务实例数据封装–Registration
Registration 是 SpringCloud 提供的一个接口,继承了 ServiceInstance 接口:
从 ServiceInstance 的接口定义可以看出,这是一个服务实例数据的封装,比如这个服务的 ip 是多少,端口号是多少。
所以 Registration 就是当前服务实例数据封装,封装了当前服务的所在的机器 ip 和端口号等信息。
Nacos 既然要整合 SpringCloud,自然而然也实现了这个接口:
这样当前服务需要被注册到注册中心的信息就封装好了。
服务注册–ServiceRegistry
ServiceRegistry也是个接口,泛型就是上面提到的服务实例数据封装的接口:
这个接口的作用就是把上面封装的当前服务的数据Registration注册通过register方法注册到注册中心中。
Nacos也实现了这个接口:
并且核心的注册方法的实现代码跟前面的demo几乎一样
服务自动注册–AutoServiceRegistration
AutoServiceRegistration是一个标记接口,所以本身没有实际的意义,仅仅代表了自动注册的意思。
AutoServiceRegistration有个抽象实现AbstractAutoServiceRegistration
AbstractAutoServiceRegistration实现了ApplicationListener,监听了WebServerInitializedEvent事件。
WebServerInitializedEvent这个事件是SpringBoot在项目启动时,当诸如tomcat这类Web服务启动之后就会发布,注意,只有在Web环境才会发布这个事件。
ServletWebServerInitializedEvent继承自WebServerInitializedEvent。
所以一旦当SpringBoot项目启动,tomcat等web服务器启动成功之后,就会触发AbstractAutoServiceRegistration监听器的执行。
最终就会调用ServiceRegistry注册Registration,实现服务自动注册
Nacos自然而然也继承了AbstractAutoServiceRegistration
对于Nacos而言,就将当前的服务注册的ip和端口等信息,就注册到了Nacos服务注册中心。
所以整个注册流程就可以用这么一张图概括
当然,不仅仅是 Nacos 是这么实现的,常见的比如Eureka,Zookeeper等注册中心在整合SpringCloud都是实现上面的三板斧
所以总得来说,SpringCloud 服务注册的本质其实就是在启动的时候,交由服务注册中心的客户端来操作。
而 SpringCloud 本身提供了其实仅仅只是一个规范接口而已。