【SpringCloud】Nacos 组件:服务注册与发现


第2章 Nacos 服务注册与发现【动力】

2.1 概述

2.1.1 注册中心简介

复制代码
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================ 🌟 =======

所有提供者,将自己提供服务的名称、及自己主机详情(IP、端口、版本等) 写入到另一台 主机中的一个列表中,这台主机称为服务注册中心,而这个表称为服务注册表。

所有消费者,需要调用微服务时, 其会从注册中心,首先将服务注册表下载到本地, 然后根 据消费者本地设置好的负载均衡策略选择一个服务提供者进行调用。这个过程称为服务发现。

可以充当 Spring Cloud 服务注册中心的服务器很多,如 Zookeeper 、Eureka 、Consul 等。 Spring Cloud Alibaba 中,使用的注册中心为 Alibaba 的中间件 Nacos。

2.1.2 Nacos 简介

Nacos 简介在其官网https://nacos.io/ 中描述的很详细。

云原生应用简单来说就是 SaaS,就是跑在 IaaS 、PaaS 上的 SaaS。

云原生 = 微服务 + DevOps + CD + 容器化
img img

2.2 Nacos 下载与启动

2.2.1 下载

从官网页面可以看出, 有两种资源下载方式: 源码下载与打过包的工程下载。

点击"最 新稳定版本",可以选择性地下载最新版的这两种资源。 这里选择编译过的 zip 压缩资源。
img

2.2.2 安装与配置

(1) 配置端口号

解压压缩包。在压缩包的 conf 目录中,找到 application.properties 文件。
img

从配置文件可以看出, 默认 Nacos 服务器的端口号为 8848,上下文路径为/nacos。

一般都是 采用默认值,但也可以修改。
img

(2) 配置鉴权

从 nacos<2.2.0.1> 版本开始, nacos 配置文件中去掉了默认的鉴权配置,需要用户手工添 加,否则无法启动 nacos。
img

(3) 启动

在 nacos/bin 目录中有启动命令文件。其中 cmd 是 Windows 系统中的命令, sh 是 Linux 系统中的命令。

由于其默认是集群方式启动,所以若要单机启动,则需要在 cmd 中通过命令启动。
img img

2.2.3 访问控制台

(1) 登录

在浏览器地址栏通过 http://localhost:8848/nacos/index.html 可打开 Nacos 控制台的登录页面。
img

默认账号/密码为 nacos/nacos。不过,该默认账号与密码存放在 nacos 内置 mysql 数据 库中的, 而非存放在某配置文件中。若要添加账号或修改密码,可在登录后通过页面修改。

输入账号/密码后即可看到如下界面,说明 nacos server 已经启动成功了。
img

(2) 修改登录信息

在该页面中可以添加、删除普通用户,修改所有用户的密码。但不能删除管理员用户, 也不能将普通用户指定为管理员角色。
img

2.3 定义提供者

2.3.1 定义工程

复制 01-provider-8081 工程,并重命名为 02-provider-nacos-8081。

2.3.2 添加 spring cloud 依赖管理

当前的工程首先是个 Spring Cloud 工程, 所以需要在 pom 文件中添加 Spring Cloud 依赖 管理模块。

复制代码
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2022.0.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

2.3.3 添加 alibaba 依赖管理

还需要添加上 spring cloud alibaba 的依赖。

复制代码
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2022.0.0.0-RC1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

2.3.4 添加 nacos-discovery 依赖

在 标签下添加 Nacos Discovery 依赖。

com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery

2.3.5 pom 内容

修改后的 pom 文件依赖如下:

复制代码
<properties>
  <java.version>19</java.version>
</properties>
<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
  </dependency>
  <!--修改MySQL驱动版本-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2022.0.0.0-RC1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2022.0.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
          </exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
</build>

</project>

2.3.6 修改配置文件

添加如下配置, 指定 nacos server 的地址及微服务名称。
img

2.3.7 查看 nacos 控制台

启动该工程后, 在浏览器中直接访问该提供者是没有问题的,说明该提供者已经启动。
img

在 nacos server 已经启动的情况下,查看 nacos 控制台,就可以看到该提供者。说明该 微服务已经被 nacos 发现。

2.4 定义消费者

2.4.1 定义工程

复制 01-consumer-8080 工程, 并重命名为 02-consumer-nacos-8080。

这个消费者是通过 RestTemplate 进行消费的。

2.4.2 修改 pom

与定义 provider 时的相同, consumer 的 pom 也做了如下几处的修改:

. 添加 spring cloud 依赖管理

. 添加 spring cloud alibaba 依赖管理

. 添加 nacos-discovery 依赖

. 添加 spring-cloud-starter-loadbalance 依赖

修改后的 POM 文件中的依赖情况如下:

复制代码
<properties>
  <java.version>19</java.version>
</properties>
<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2022.0.0.0-RC1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2022.0.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <excludes>
          <exclude>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
          </exclude>
        </excludes>
      </configuration>
    </plugin>
  </plugins>
</build>

</project>

2.4.3 修改配置文件
img

2.4.4 修改控制器类

原来 consumer 中采用的是直连方式访问 provider,现在要根据微服务名称来访问。
img

2.4.5 修改 JavaConfig

当使用微服务名称来访问 provider 时, 其是通过负载均衡方式进行访问的。所以, 需要 添加如下注解。这里的负载均衡采用的是 spring cloud 自己开发的 spring cloud loadbalancer。
img

2.4.6 查看 ncos 控制台
img

当启动 consumer 后,直接在浏览器访问 consumer,可以看到正确的结果,说明 consumer 已经发现并调用到了 provider 。然后查看 nacos 控制台,也可以看到这两个服务。
img

2.5 获取服务列表

除了可以在 Nacos 控制台直观的查看到 Nacos 注册中心中注册的微服务信息外, 也可以 在代码中通过 DiscoveryClient API 获取服务列表。

2.5.1 修改 controller

在任何微服务的提供者或消费者处理器中,只要获取到"服务发现 Client",即可读取 到注册中心的微服务列表。

本例直接修改 02-provider-nacos-8081 中的控制器类。
img img

2.5.2 运行效果

启动 02-provider-nacos-8081 与 02-consumer-nacos-8080 两个工程。
img

在 provider 的控制台,可以看到如下的服务信息。
img

2.5.3 注册表缓存

服务在启动后, 当发生调用时,会自动从 Nacos 注册中心,下载并缓存注册表到本地。

所以, 即使 Nacos 发生宕机, 会发现消费者仍然是可以调用到提供者的。只不过此时已经不能再有 服务进行注册了,服务中缓存的注册列表信息无法更新。

2.6 临时实例与持久实例

Nacos 中的实例分为临时实例与持久实例。

2.6.1 配置

在服务注册时有一个属性 ephemeral ,用于描述当前实例在注册时,是否以临时实例出现。

为 true 则为临时实例,默认值;为 false 则为持久实例。
img

2.6.2 区别

临时实例与持久实例的实例存储的位置与健康检测机制是不同的。

. 临时实例:

默认情况。服务实例仅会注册在 Nacos 内存, 不会持久化到 Nacos 磁盘。

其 健康检测机制为 Client 模式, 即 Client 主动向 Server 上报其健康状态。默认心跳间隔为 5 秒。在 15 秒内 Server 未收到 Client 心跳, 则会将其标记为"不健康"状态; 在 30 秒 内若收到了 Client 心跳,则重新恢复"健康"状态,否则该实例将从 Server 端内存清除。

. 持久实例:

服务实例不仅会注册到 Nacos 内存, 同时也会被持久化到 Nacos 磁盘。

其健 康检测机制为 Server 模式,即 Server 会主动去检测 Client 的健康状态,默认每 20 秒检 测一次。健康检测失败后服务实例会被标记为"不健康"状态, 但不会被清除, 因为其 是持久化在磁盘的。

2.7 将数据持久化到外置 MySQL

默认情况下, Nacos 使用的是内置 storage,使用内置 storage 存在两个很大的问题:

. 数据是存放在内存中的,无法持久化

. 无法搭建集群。当 Nacos 作为配置中心时,要求必须是外置的 DBMS

2.7.1 DBMS 说明

Nacos 对于 DBMS 的要求:

. 安装数据库,版本要求: 5.6.5+

. 初始化 mysql 数据库,数据库初始化文件: mysql-schema.sql

. 修改 conf/application.properties 文件,增加支持 mysql 数据源配置(目前只支持 mysql), 添加 mysql 数据源的 url、用户名和密码。

2.7.2 修改 SQL 脚本文件

若要连接外置 MySQL,则外置 MySQL 中就要有相应的数据库及表。这些表的创建脚本 文件在 Nacos 解压目录的 config 子目录中的 mysql-schema.sql。

打开 mysql-schema.sql 文件,发现其中只能表的创建语句,并没有数据库的创建语句, 且文件中给出数据库的名称建议使用 nacos_config 。为了方便后面对这个脚本文件的执行, 在该文件中添加如下的 DB 创建语句。
img

2.7.3 运行脚本文件

这里对于该脚本文件的运行, 放在 Idea 中进行。在 Idea 的数据库连接上右击, 选择 SQL Scripts/Run SQL Scripts,在弹出的窗口中找到这个 sql 文件运行即可。

2.7.4 修改 Nacos 配置

打开 Nacos 安装目录下的 conf/application.properties 文件,把用于注释的#去掉。
img

变为以下内容:
img

2.7.5 修改 Nacos 平台登录账号

为了验证已经换为了外置 MySQL,现在 MySQL 中添加一个新的 nacos 用户。

(1) 添加新用户

插入一个新的用户,用户名为 hello,密码仍为 nacos 。当然, 若要使用新密码, 可以通 过 MD5 工具加密后,将加密后的字符串放到这里。
img

(2) 重启 Nacos 后再登录

SQL 执行成功后, 将原来启动的 Nacos 服务器关闭后重新启动。
img

在启动日志中可以看到,已经使用外部存储设备了。
img

然后再次打开 Nacos 浏览器平台,登出原来的账号后,使用 hello 账号 nacos 密码再次 登录,可以正常登录到平台,说明现在已经由内置 MySQL 成功转换到了外置 MySQL 了。

2.8 Nacos 集群搭建

单机版 Nacos 都存在单点问题, 所以需要搭建高可用的 Nacos 集群。

2.8.1 Nacos 集群搭建

(1) 修改配置

这里要搭建的 Nacos 集群中包含三台 Nacos 服务器,由于这些 Nacos 都在同一台主机, 所以这里创建的集群实际只有端口号不同,是个伪集群。

首先随意创建一个目录,用于存放三个 Nacos 服务器。例如在 D 盘创建一个 nacos_cluster 目录。然后再复制原来配置好的单机版的 Nacos 到这个目录,并重命名为 nacos8847。将来 要这里要存放三个子目录,分别为 nacos8847 、nacos8849 、nacos8851。
img

打开 nacos8847/conf,重命名其中的 cluster.conf.example 为 cluster.conf。然后打开该文 件, 在其中写入三个 nacos 的 ip:port。注意, 不能写为 localhost 与 <127.0.0.1>,且这三个端口 号不能连续。否则会报地址被占用异常。
img

然后再打开 nacos8847/conf/application.properties 文件,修改端口号为 8847。
img

(2) 复制目录

将 nacos8847 目录复制三份,分别命名为 nacos8849 、nacos8851。
img

并修改各自目录中 conf/application.properties 文件中 nacos 的端口号为 8849 与 8851。
img img

(3) 启动集群

逐个双击三个 nacos 目录中的 bin/startup.cmd 命令,逐个启动三台 nacos 。 从启动日志上可以看到其提供的 SLB 服务访问地址及三台 Nacos 节点地址。
img

(4) 查看 nacos 平台

在浏览器中使用 SLB 的VIP 访问地址即可打开 nacos 服务器平台,查看到集群节点列表。 点击"节点元数据"可查看 nacos 的节点元数据。
img

2.8.2 Client 连接 Nacos 集群

直接将微服务配置文件 application.yml 中的 nacos 地址更换为 Nacos 集群的 VIP 地址。
img

微服务重启后便可以 Nacos 平台中查看到它们的信息了。
img

2.9 服务隔离

2.9.1 数据模型

Nacos 中的服务是由三元组唯一确定的: namespace 、group 与服务名称 service。

namespace 与 group 的作用是相同的,用于划分不同的区域范围,隔离服务。不同的是,

namespace 的范围更大,不同的 namespace 中可以包含相同的 group。不同的 group 中可以 包含相同的 service 。namespace 的默认值为 public ,group 的默认值为 DEFAULT_GROUP。

它们之间的关系就如官方给出的下图所示。
img

2.9.2 新建命名空间

新建一个命名空间 hello,其会自动生成该命名空间的 ID。
img img

2.9.3 启动三个 provider

启动三个 02-provider-nacos-8081 实例,它们提供的服务相同,不同的是 namespace、 group 与 port:

. public + DEFAULT_GROUP + 8081

. public + MY_GROUP + 8082

. hello + MY_GROUP + 8083

2.9.4 查看 Nacos 服务列表

查看 Nacos 服务列表,在 public 命名空间中有两个服务,服务名称相同,但分组不同。
img

查看 hello 命名空间,其中也有一个服务,服务名称与 public 中的相同,但分组为 MY_GROUP。
img

2.9.5 调用 provider

修改 02-consumer-nacos-8080 的配置文件,指定 nacos 服务发现的 group 与 namespace, 就只会调用到指定范围中的服务。这就是 namespace+group 的服务隔离。

本文由mdnice多平台发布

相关推荐
2401_8955213412 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare12 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL12 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本14 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole17 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉17 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠18 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet18 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明18 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端