自学内容网 自学内容网

[Spring] Nacos详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

1. Nacos简介

Nacos 是阿里巴巴开源的一款易于使用的动态服务发现、配置管理和服务管理平台,致力于帮助用户更轻松地构建、管理和维护微服务架构.功能类似于Eureka,但是又比Eureka强大.
在这里插入图片描述
官方网站: https://nacos.io/
仓库: https://github.com/alibaba/nacos

2. 安装Nacos

在我们学习阶段中,采用的都是单机安装即可.在实际的工作中,我们可能需要采用集群模式.

2.1 下载安装包

下载地址: https://github.com/alibaba/nacos/releases/tag/2.2.3
我们下载的时候推荐下载的版本是2.2.3版本,因为这个版本比较稳定,若是要下载其他的版本:
https://github.com/alibaba/nacos/releases

2.2 Windows环境下安装

2.2.1 解压

把压缩包解压到任意非中文的目录之下.
在这里插入图片描述

  • startup.cmd: windows操作系统的启动脚本
  • startup.sh: Linux操作系统的启动脚本
  • shutdown.cmd :windows操作系统的停止脚本
  • shutdown.sh :Linux操作系统的停止脚本

conf: Nacos配置文件
target: 存放Nacos应用的jar包

2.2.2 修改配置为单机模式

Nacos默认启动方式为集群,启动之前需要修改配置为单机模式

  1. 使用记事本打开startup.cmd
  2. 26行左右,修改启动模式
    set MODE="cluster"修改为set MODE="standalone".
    在这里插入图片描述

2.2.3 启动Nacos

双击startup.cmd即可启动Nacos.
在这里插入图片描述

在Windows环境下启动的默认端口号是8848.如果端口号发生冲突,也可以通过修改文件:${Nacos目录}/conf/application.properties,端口号的配置大概在23行左右.
在这里插入图片描述
访问Nacos主页,http://127.0.0.1:8848/nacos出现以下的页面,表示Nacos启动成功.
在这里插入图片描述

2.3 Linux

2.3.1 准备安装包

  1. 上传提前下载好的安装包到服务器上的某个目录.
  2. 安装解压缩软件
apt-get install unzip
  1. 解压安装包
unzip ${上传的安装包的名称}

进入解压缩之后的目录:

root@hcss-ecs-0bb1:/usr/local/src/nacos# pwd
/usr/local/src/nacos
root@hcss-ecs-0bb1:/usr/local/src/nacos# ll
total 44
drwxr-xr-x 5 root root 4096 May 25 2023 ./
drwxr-xr-x 3 root root 4096 Dec 25 15:07 ../
drwxr-xr-x 2 root root 4096 May 25 2023 bin/
drwxr-xr-x 2 root root 4096 May 25 2023 conf/
-rw-r--r-- 1 root root 16583 Mar 6 2023 LICENSE
-rw-r--r-- 1 root root 1305 May 14 2020 NOTICE
drwxr-xr-x 2 root root 4096 May 25 2023 target/

2.3.2 单机模式启动

进入nacos/bin目录,输入以下的命令.

bash startup.sh -m standalone

注意: 上述为Ubuntu系统的命令,在nacos安装之前,需要先安装openjdk.

启动成功之后,访问Nacos链接:http://IP:port/nacos.
在这里插入图片描述

10020为修改后的端口号,需要在服务器上开放对应的端口号
另外,再开放Nacos端口号 +1000 和Nacos端口号+1001 的端口
比如端口号为10020,则需要开放端口号为:10020,11020,11021
端口号为8848,则需要开放端口号为:9848,9849.

3. Nacos快速上手

Nacos是SpringCloud Alibaba的组件,SpringCloud Alibaba遵循SpringCloud中定义的注册服务,服务发现的规范,因此使用Nacos和使用Eureka对于微服务来说,没有什么太大的区别,两者都具有服务注册和服务发现的功能.

主要差异在于:

  • Eureka需要在项目中自己再搭建一个服务,比如我们之前搭建的eureka-service,而Nacos不需要自己搭建服务,安装之后开箱即用.
  • 对应的依赖和配置不同

3.1 服务注册/服务发现

  1. 引入SpringCloud Alibaba依赖
    首先在父工程的pom文件中的<dependencyManagement>中引入SpringCloud Alibaba的依赖:
<properties>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

注意: SpringBoot和SpringCloud的版本是有一定的对应关系的.Spring Cloud Alibaba也遵循Spring Cloud的标准,在引入依赖的时候,一定要确认各个版本之间的对应关系.具体的对应关系,可以参考:
https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/

  1. 引入Nacos依赖
    在两个子模块order-service和product-service中引入Nacos的依赖.order-service需要发现服务,product-service需要注册服务,注册服务和发现服务需要引入的依赖是一样的.
<dependency> 
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

同时引入LoadBalancer依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

3.2 在配置文件中配置nacos服务地址

我们可以使用Windows本地环境下的Nacos,也可以使用Linux环境下的服务器Nacos.

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3.3 远程调用

首先添加负载均衡,之后使用项目名称远程调用

  1. 使用@LoadBalanced为RestTemplate添加负载均衡
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  1. 把IP和端口改为应用名进行调用
@Service
@Slf4j
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    //设置原子类
    public OrderInfo selectOrder(Integer id){
        OrderInfo orderInfo = orderMapper.selectOrderById(id);
        //把获取到的服务URL拼接到远程调用的URL中
        String url = "http://product-service/product/select?id=" + orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

3.4 启动服务

启动服务之后,我们发现在Nacos的管理界面上,发现order-service和product-service都注册在了Nacos上.
在这里插入图片描述
测试接口是否可以调用成功:http://127.0.0.1:8080/order/select?id=1
在这里插入图片描述
远程调用成功,说明服务注册和服务发现都是正常的.

3.5 启动多个服务,测试负载均衡

启动三个product-service服务
在这里插入图片描述
我们发现,product-service的服务的实例数变为了3个.
在这里插入图片描述
接着调用接口,观察控制台日志:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们发现,发送的请求比较均匀地散落在了该服务上的三个实例上.

4. Nacos负载均衡调整策略

当生产环境比较恶劣的,我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等.

4.1 服务下线

当某一个结点上接口的性能较差或者是发生为止错误的时候,我们需要及时止损,对结点进行下线.
操作步骤; 服务—>详情—>下线
在这里插入图片描述
在这里插入图片描述
例如我们对9092服务进行下线:在多次调用API接口的时候,发现9092端口的服务实例没有请求进来
在这里插入图片描述
再次单击上线即可对实例再次进行上线:
在这里插入图片描述

4.2 权重配置

除了下线之外,我们也可以配置这个结点的流量权重.

4.2.1 配置权重

操作步骤: 详情—>编辑—>权重
在这里插入图片描述
在这里插入图片描述
在多次调用接口之后,我们通过观察后台日志发现,权重并没有生效.下面我们就来解释为什么.

4.2.2 开启Nacos负载均衡策略

如果我们在pom文件中引入了SpringCloud LoadBalance,由于SpringCloud LoadBalance组件自身有负载均衡配置方式,所以不支持Nacos的权重属性配置.
在这里插入图片描述
我们需要在配置文件中手动开启Nacos的负载均衡策略,让权重配置生效.

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

接下来再次对权重配置进行测试,我们发现,权重配置生效,9092实例的请求数量明显减少.

4.3 同集群优先访问

Nacos把同一个机房内的实例,划分为一个集群,同一个集群在同一个局域网之内,所以同集群优先访问.在一定程度上可以理解为同机房优先访问.
微服务架构中,一个服务通常有多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器可以分布在不同的机房,比如product-service:
实例1,2: 分布在北京机房.
实例3,4: 分布在上海机房.
在这里插入图片描述
微服务访问的时候,应该尽量访问同一个局域网中的实例,当本机房的实例不可用的时候,才访问其他机房的实例.
在这里插入图片描述

4.3.1 给集群配置名称

  1. 为product-service配置集群名称
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: shanghai

当9090这个端口的实例启动的时候,默认就会在上海集群中.
在这里插入图片描述

复制product-service启动配置,添加虚拟机选项
配置9091和9092端口号的实例为北京集群:
在这里插入图片描述
-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=beijing
配置9092端口号实例为北京集群.
-Dserver.port=9092 -Dspring.cloud.nacos.discovery.cluster-name=beijing
观察Nacos,beijing集群下多了两个实例
在这里插入图片描述
2. 为order-service配置集群名称为shanghai.

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: shanghai

开启Nacos负载均衡策略:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

重新启动实例进行测试:
多次调用接口,观察日志,会发现只有9090端口的实例收到了请求.而9090端口和order-service都是在上海集群.
在这里插入图片描述
我们把9090端口下线之后,发现请求就来到了北京集群中:
在这里插入图片描述
在这里插入图片描述

5. Nacos健康检查

5.1 两种健康检查机制

Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务.
Nacos中提供了两种健康检查机制:

  1. 客户端主动上报机制
    • 客户端通过心跳上报的方式告知Nacos服务中心的健康状态,默认的心跳间隔是5秒.
    • Nacos会在超过15秒之内未接收到心跳之后将实例设置为不健康的状态,超过30秒将实例删除.
  2. 服务器反向探测机制
    • Nacos主动探知客户端健康状态,默认间隔为20秒.
    • 健康检查失败之后实例会被标记为不健康,但是不会被立即删除.
      在这里插入图片描述

正式工和临时工:
临时工需要主动向上级汇报自己的工作,如果超过一定时间没有汇报工作,领导默认该员工已经离职(把实例删除)
正式工需要领导主动询问工作状态,如果超过一定时间没有来上班,不能立即开除(不会立即删除实例),因为还需要一些劳动合同的后续问题等待处理.

Nacos的健康检查机制不是主动设置的,而是和服务实例的类型相关的.也就是和正式工还是临时工相关.

5.2 Nacos服务实例类型

Nacos的服务实例分为临时实例和非临时实例.

  • 临时实例: 如果结点宕机超过一定的时间,会从服务列表中剔除.也是默认的服务实例类型.
  • 非临时实例: 如果实例宕机,不会从服务列表中立即剔除,会标记为不健康的实例,也可以叫做永久实例.

nacos对临时实例采用主动上报机制,对非临时实例采用主动探测机制.
在这里插入图片描述
我们可以通过配置文件来配置一个服务实例为永久实例.

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为⾮临时实例

配置好之后,停止服务.
如果在这个时候重新启动服务的时候,我们就会发现程序会报出一下错误:

Caused by: com.alibaba.nacos.api.exception.NacosException: failed to req 
API:/nacos/v1/ns/instance after all servers([110.41.51.65:10020]) tried: 
caused: errCode: 400, errMsg: Current service DEFAULT_GROUP@@product-service is
ephemeral service, can't register persistent instance. ;

原因就是Nacos会记录每个服务实例的端口号和IP,如果重启服务之后发现端口号和IP都没有发生变化,那么Nacos就不允许一个服务实例的类型发生变化.
解决办法:
删除nacos目录之下的data/protocol/raft中的所有信息.里面保存的是服务实例的元数据信息.
在这里插入图片描述
重新启动服务,查看nacos工作台:
在这里插入图片描述
我们发现实例product-service的实例全部变为了永久实例.
当我们停止掉实例的时候,也不会从列表中删除.只是健康状态会被标记为false.
在这里插入图片描述

6. Nacos环境隔离

企业开发中,一个服务会分为开发环境,测试环境和生产环境.
通常的情况之下,这几个环境是不能够相互通信的,nacos提供了namespace(命名空间)来实现环境之间的隔离.不同的namespace的服务相互不可见.

6.1 创建namespace

默认情况下,所有的服务都在同一个namespace,名为public.
在这里插入图片描述
点击左侧的命名空间,可以对namespace进行操作.
在这里插入图片描述
可以新增命名空间:
在这里插入图片描述
在这里插入图片描述

6.2 为实例配置所属的命名空间

namespace创建完成之后,可以对服务进行配置
比如我们修改order-service的命名空间,注意配置文件中需要填写命名空间的id.

spring:
  cloud:
    nacos:
      discovery:
        namespace: e3dcfb79-c0cf-4588-8bc5-7d057c5e09f3

6.3 测试远程调用

如果我们只修改order-service的命名空间而不修改product-service的命名空间,服务的远程调用就会失败.

  1. 两个服务不在一个命名空间之内
    在这里插入图片描述
    在这里插入图片描述
  2. 服务远程调用失败
    在这里插入图片描述

接下来我们修改product-service的命名空间为dev,再次进行接口调用的时候就不会出现远程调用失败.
在这里插入图片描述

7. Nacos配置中心

除了注册中心和负载均衡之外,nacos还是一个配置中心,具备配置管理的能力
Namespace的常用场景之一是不同环境的配置区分隔离,例如开发测试环境和生产环境的配置隔离.

7.1 为什么需要配置中心

当前项目的配置都在代码中,会存在以下的问题:

  1. 配置文件修改的时候,服务需要重新部署,微服务架构中,一个服务可能有成百上千个实例,挨个部署比较麻烦,而且容易出错.
  2. 多人开发的时候,配置文件可能要经常修改,使用同一个配置文件容易冲突.

配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件.
在这里插入图片描述

  • 服务启动的时候,从配置中心读取配置项的内容,进行初始化.
  • 配置项修改的时候,通知微服务,实现配置的更新加载.

7.2 快速上手

7.2.1 添加配置

在nacos控制台添加配置项
在这里插入图片描述
在这里插入图片描述

注意: 配置管理的命名空间和服务列表的命名空间是相互独立的,两个是分别设置的,互不干扰.也就是服务管理的命名空间!=配置管理的命名空间

比如我们配置的内容是:

nacos.test.num=5

注意,配置文件是什么格式的,配置格式就选择什么.
在这里插入图片描述
说明:

  1. DataID为项目名称,即spring.appliaction.name.
  2. 配置内容的数据格式,目前只支持properties和yaml类型.

7.2.2 在项目中获取配置内容

  1. 引入Nacos Config依赖和BootStrap依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  1. 配置bootstrap.properties
    在微服务启动之前,需要先获取Nacos中的配置,获取之后与application.yml配置合并.在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server地址,配置地址之后,需要通过DataID获取配置文件.
spring.application.name=product-service
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

说明: spring.application.name需要和nacos配置管理的DataID一致.
spring.cloud.nacos.config.server-add为nacos server的地址.

从配置中我们也可以看出来配置中心和注册中心是隔离的
Nacos配置中心: spring.cloud.nacos.config.server-add
Nacos注册中心: spring.cloud.nacos.discovery.server-addr

  1. 编写程序
@RestController
@RefreshScope//使用该注解配置热更新
@RequestMapping("/config")
public class NacosController {
    @Value("${nacos.test.num}")//使用Value读取配置
    private int config;
    @RequestMapping("/get")
    public int getConfig(){
        return config;
    }
}
  1. 启动服务,调用API接口进行测试
    http://127.0.0.1:9092/config/get
    在这里插入图片描述
    在Nacos控制台修改配置为6.
    在这里插入图片描述
    再次访问接口,值发生了改变.
    在这里插入图片描述
    [注意]
    如果我们不添加@RefreshScope注解,我们修改配置为18之后再次进行接口调用.
    在这里插入图片描述
    我们发现读取出来的配置还是6.配置不会进行热更新.

7.3 配置中心详解

7.3.1 设置命名空间

Nacos配置管理的命名空间和服务列表的命名空间是分别设置的.默认是public
Nacos命名空间配置依然在bootstrap.properties中进行配置.

spring.cloud.nacos.config.namespace=057de3f3-1bc3-42dc-b6ea-01fa8f744172

配置管理的命名空间可以直接复制下来:
在这里插入图片描述
如果为服务设置了命名空间之后,项目启动的时候,会从该命名空间之下找到对应的配置项.
下面进行测试:
首先在dev环境下创建配置文件.nacos.test.num=10
在这里插入图片描述
之后启动项目,调用接口,观察结果:
在这里插入图片描述
我们发现调用之后的结果就是我们配置的结果.

7.3.2 DataID

DataID格式介绍

在Nacos SpringCloud中,DataID的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置.
  • spring.profile.active即为当前环境对应的profile.当spring.profile.active为空时,对应的连接符-也不复存在.DataID的拼接格式变成${prefix}.${fileextension}.该配置一般是实现多环境的配置管理.
  • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持properties类型和yaml类型.默认是properties类型.

服务启动的时候,服务会按照bootstrap配置文件中的配置去读取对应的配置文件,读取的优先级如下:

  1. 首先读取${prefix}-${spring.profiles.active}.${file-extension}配置文件.比如product-service-dev.properties.
  2. 如果上面这个不存在,读取${prefix}.${file-extension},比如product-service.properties.
  3. ${prefix}比如product-service.

注意: spring.profiles.active,spring.cloud.nacos.config.prefix等配置项在配置文件中指定的时候,必须指定在bootstrap.properties文件中.

测试

bootstrap配置文件如下:

spring.application.name=product-service
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=057de3f3-1bc3-42dc-b6ea-01fa8f744172

之后在配置中心的dev命名空间之下添加如下的配置:
在这里插入图片描述
在这里插入图片描述
之后调用API接口,来查看配置文件的读取优先级:
第一次读取:读取的是product-service-dev.properties配置文件
在这里插入图片描述
第二次读取: 删除product-service-dev.properties,读取的是product-service.properties的配置
在这里插入图片描述
第三次读取: 删除product-service.properties,读取的是product-service.
在这里插入图片描述

8. Nacos和Eureka的区别

  • 共同点:
    都支持服务注册和服务发现.
  • 区别:
    • 功能上: Nacos处理服务发现和服务注册,还提供了配置中心,流量管理(实例上下限和权重配置),DNS服务(把服务名称转换为IP地址和端口号)等功能.
    • CAP理论: eureka遵循的是AP原则,Nacos可以切换为AP和CP模式,默认是AP.Nacos根据配置识别CP或者AP模式,如果注册Nacos的Client的结点是临时节点,那么Nacos对这个结点就是AP效果,反之是CP.AP和CP可以同时混合存在.
    • 服务发现: Eureka基于拉取模式,EurekaClient会定期从Server中拉取服务信息,默认30秒拉取一次.Nacos基于推送模式.服务列表有变化时会实时推送给订阅者,服务端和客户端保持心跳连接.

原文地址:https://blog.csdn.net/2301_80050796/article/details/145231184

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!