Nacos服务注册与发现的原理

1.为何需要注册中心

我们在拆分单体springboot项目的时候,无法避免服务之间的互相调用,因此首先会想到使用restTemplate来进行远程调用。
但是这种方式存在明显的缺点,首先就是硬编码问题。restTemplate中远程调用的方法参数中需要传入url,但是被多次调用的服务为了应对高并发一般上可能会有多个实例,而这些实例的ip或者端口号都不相同,这样一来,就引发了好几种问题。

  • 服务提供者这么多实例,消费者(服务调用端)如何知道每一个实例的地址?
  • http请求要写url地址,消费者到底该调用哪个实例呢?
  • 如果在运行过程中,某一个服务提供者实例宕机,消费者依然在调用该怎么办?
  • 如果并发太高,服务提供者临时多部署了N台实例,消费者如何知道新实例的地址?
    为了解决上述问题,就必须引入注册中心的概念了,接下来我们就一起来分析下注册中心的原理。

2.注册中心原理

注册中心、服务提供者、服务消费者三者间关系如下:
image

流程如下
  • 服务开启时,会将自己的服务信息(服务名、IP、端口)注册到注册中心中
  • 服务调用者会去注册中心订阅自己想要的服务,然后获得服务对应的实例列表
  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表
  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

3.Nacos注册中心

3.1部署Nacos
  1. 创建名为nacos的数据库
  2. 导入nacos\conf\nacos-mysql.sql文件到nacos数据库中
    image
  3. 修改nacos\conf\application.properties配置文件
    image
3.2启动Nacos

DOS进入nacos/bin目录下

  1. windows

    startup.cmd -m standalone

  2. mac/Linux

    sh startup.sh -m standalone

  3. 启动成功如下
    image

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

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.启动服务

image

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

image

然后访问Nacos控制台
image

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地址

启动消费者服务
image

image

我们会发现cart-service也被注册进来了

3.4.3发现并调用服务

接下来,服务调用者cart-service就可以去订阅item-service服务了。不过item-service有多个实例,而真正发起调用时只需要知道一个实例的地址。
因此,服务调用者必须利用负载均衡的算法,从多个实例中挑选一个去访问。常见的负载均衡算法有:

  • 随机
  • 轮询
  • IP的hash
  • 最近最少访问
  • ...
    这里我们可以选择最简单的随机负载均衡。

另外,服务发现需要用到一个工具,DiscoveryClient,SpringCloud已经帮我们自动装配,我们可以直接注入使用:
image

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

posted @ 2024-10-12 12:14  我睡觉时候不困  阅读(433)  评论(0)    收藏  举报