Spring Cloud 如何实现服务注册?

Sherwin.Wei Lv8

Spring Cloud 如何实现服务注册?

回答重点

SpringCloud 服务注册和发现需要依赖其它注册中心。

项目在启动时,会自动将本身服务的服务名、IP、端口信息通过引入的注册中心依赖注册到服务注册中心的服务端。

扩展知识

说到服务注册,我们得先从注册中心讲起。

对于任何注册中心来说,都有客户端和服务端的概念

  • 服务端需要单独部署,用来保存服务实例数据的
  • 客户端就是用来跟服务端通信的SDK,带到Java里面就是一个pom依赖

这里我就拿 Nacos 举例。

当需要向 Nacos 服务端注册或者获取服务实例数据的时候,只需要通过 Nacos 提供的客户端 SDK 就可以了,就像下面这样:

引入依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.4.4</version>
</dependency>

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
Properties properties = new Properties();
// Nacos服务端的地址
properties.setProperty("serverAddr", "localhost");
properties.setProperty("namespace", "8848");

NamingService naming = NamingFactory.createNamingService(properties);

//服务注册,注册一个order服务,order服务的ip是192.168.2.100,端口8080
naming.registerInstance("order", "192.168.2.100", 8080);

//服务发现,获取所有的order服务实例
List<Instance> instanceList = naming.selectInstances("order", true);

通过上述代码就成功将order服务实例注册到注册中心了

我们再回到 SpringCloud。

其实 SpringCloud 本身并没有服务注册的能力。

真正进行服务注册的,还是注册中心的客户端。

所以我们在项目中需要引入对应注册中心的依赖。

比如在 SpringCloud 下使用 Nacos 作为注册中心,就得引入对应的 Nacos 的依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

而 SpringCloud,说得简单其实就是定义了一套规范,不同的注册中心只需要适配这套注册规范。

那么在项目启动的时候自然而然就可以吧服务注册到服务注册中心。

那么下面来讲一讲SpringCloud的服务注册的规范是什么。

服务自动注册三板斧

SpringCloud提供的服务自动注册的规范,其实就是三个接口,只要注册中心实现这些接口,就能够在服务启动时自动注册到注册中心,而这三个接口我称为服务自动注册三板斧。

服务实例数据封装–Registration

Registration 是 SpringCloud 提供的一个接口,继承了 ServiceInstance 接口:

Registration ServiceInstance

从 ServiceInstance 的接口定义可以看出,这是一个服务实例数据的封装,比如这个服务的 ip 是多少,端口号是多少。

所以 Registration 就是当前服务实例数据封装,封装了当前服务的所在的机器 ip 和端口号等信息。

Nacos 既然要整合 SpringCloud,自然而然也实现了这个接口:

NacosRegistration

这样当前服务需要被注册到注册中心的信息就封装好了。

服务注册–ServiceRegistry

ServiceRegistry也是个接口,泛型就是上面提到的服务实例数据封装的接口:

ServiceRegistry

这个接口的作用就是把上面封装的当前服务的数据Registration注册通过register方法注册到注册中心中。

Nacos也实现了这个接口:

NacosServiceRegistry

并且核心的注册方法的实现代码跟前面的demo几乎一样

image.png
服务自动注册–AutoServiceRegistration
AutoServiceRegistration

AutoServiceRegistration是一个标记接口,所以本身没有实际的意义,仅仅代表了自动注册的意思。

AutoServiceRegistration有个抽象实现AbstractAutoServiceRegistration

AbstractAutoServiceRegistration是个抽象类

AbstractAutoServiceRegistration实现了ApplicationListener,监听了WebServerInitializedEvent事件。

WebServerInitializedEvent这个事件是SpringBoot在项目启动时,当诸如tomcat这类Web服务启动之后就会发布,注意,只有在Web环境才会发布这个事件。

image.png

ServletWebServerInitializedEvent继承自WebServerInitializedEvent。

所以一旦当SpringBoot项目启动,tomcat等web服务器启动成功之后,就会触发AbstractAutoServiceRegistration监听器的执行。

最终就会调用ServiceRegistry注册Registration,实现服务自动注册

image.png

Nacos自然而然也继承了AbstractAutoServiceRegistration

NacosAutoServiceRegistration

对于Nacos而言,就将当前的服务注册的ip和端口等信息,就注册到了Nacos服务注册中心。

所以整个注册流程就可以用这么一张图概括

image.png

当然,不仅仅是 Nacos 是这么实现的,常见的比如Eureka,Zookeeper等注册中心在整合SpringCloud都是实现上面的三板斧

image.png

所以总得来说,SpringCloud 服务注册的本质其实就是在启动的时候,交由服务注册中心的客户端来操作。

而 SpringCloud 本身提供了其实仅仅只是一个规范接口而已。

Comments
On this page
Spring Cloud 如何实现服务注册?