Nacos服务注册与发现的原理
1.为何需要注册中心
我们在拆分单体springboot项目的时候,无法避免服务之间的互相调用,因此首先会想到使用restTemplate来进行远程调用。
但是这种方式存在明显的缺点,首先就是硬编码问题。restTemplate中远程调用的方法参数中需要传入url,但是被多次调用的服务为了应对高并发一般上可能会有多个实例,而这些实例的ip或者端口号都不相同,这样一来,就引发了好几种问题。
- 服务提供者这么多实例,消费者(服务调用端)如何知道每一个实例的地址?
- http请求要写url地址,消费者到底该调用哪个实例呢?
- 如果在运行过程中,某一个服务提供者实例宕机,消费者依然在调用该怎么办?
- 如果并发太高,服务提供者临时多部署了N台实例,消费者如何知道新实例的地址?
为了解决上述问题,就必须引入注册中心的概念了,接下来我们就一起来分析下注册中心的原理。
2.注册中心原理
注册中心、服务提供者、服务消费者三者间关系如下:

流程如下
- 服务开启时,会将自己的服务信息(服务名、IP、端口)注册到注册中心中
- 服务调用者会去注册中心订阅自己想要的服务,然后获得服务对应的实例列表
- 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表
- 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表
3.Nacos注册中心
3.1部署Nacos
- 创建名为
nacos的数据库 - 导入
nacos\conf\nacos-mysql.sql文件到nacos数据库中

- 修改
nacos\conf\application.properties配置文件

3.2启动Nacos
DOS进入nacos/bin目录下
-
windows
startup.cmd -m standalone
-
mac/Linux
sh startup.sh -m standalone
-
启动成功如下

-
访问Nacos
这里我将Nacos部署到了本机,因此访问Nacos的地址为http://localhost:8848/nacos
登录用户名密码均为nacos

3.3服务注册
步骤如下
- 引入依赖
- 配置Nacos地址
- 重启
3.3.1.添加依赖
在服务提供者的pom.xml中添加依赖:
点击查看代码
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3.2.配置nacos地址
在服务调用者的application.yml中添加nacos地址配置:
点击查看代码
spring:
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
3.3.3.启动服务

为了方便验证,这里将item-service多配置一个实例


然后访问Nacos控制台

3.4.服务发现
服务的消费者要去nacos订阅服务,这个过程就是服务发现,步骤如下:
- 引入依赖
- 配置Nacos地址
- 发现并调用服务
3.4.1.引入依赖
点击查看代码
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.4.2配置nacos地址
点击查看代码
spring:
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
启动消费者服务


我们会发现cart-service也被注册进来了
3.4.3发现并调用服务
接下来,服务调用者cart-service就可以去订阅item-service服务了。不过item-service有多个实例,而真正发起调用时只需要知道一个实例的地址。
因此,服务调用者必须利用负载均衡的算法,从多个实例中挑选一个去访问。常见的负载均衡算法有:
- 随机
- 轮询
- IP的hash
- 最近最少访问
- ...
这里我们可以选择最简单的随机负载均衡。
另外,服务发现需要用到一个工具,DiscoveryClient,SpringCloud已经帮我们自动装配,我们可以直接注入使用:

我们通过DiscoveryClient发现服务实例列表,然后通过负载均衡算法,选择一个实例去调用:


浙公网安备 33010602011771号