【JavaEE】【SpringCloud】注册中心_nacos

目录

  • 一、介绍
  • 二、安装nacos
    • [2.1 windows 安装](#2.1 windows 安装)
    • [2.2 Linux 安装](#2.2 Linux 安装)
  • 三、快速使用
    • [3.1 服务注册/发现](#3.1 服务注册/发现)
      • [3.1.1 引⼊Spring Cloud Alibaba依赖](#3.1.1 引⼊Spring Cloud Alibaba依赖)
      • [3.1.2 引入 nacos依赖](#3.1.2 引入 nacos依赖)
      • [3.1.3 引⼊Load Balance依赖](#3.1.3 引⼊Load Balance依赖)
    • [3.2 修改配置](#3.2 修改配置)
    • [3.3 远程调用](#3.3 远程调用)
  • 四、Nacos负载均衡
    • [4.1 服务下线](#4.1 服务下线)
    • [4.2 权重配置](#4.2 权重配置)
    • [4.3 开启Nacos负载均衡策略](#4.3 开启Nacos负载均衡策略)
  • 五、同集群优先
    • [5.1 配置集群名称](#5.1 配置集群名称)
    • [5.2 开启Nacos负载均衡策略](#5.2 开启Nacos负载均衡策略)
    • [5.3 测试](#5.3 测试)
  • 六、Nacos健康检查
    • [6.1 两种检查机制](#6.1 两种检查机制)
    • [6.2 Nacos服务实例类型](#6.2 Nacos服务实例类型)
  • 七、Nacos环境隔离
    • [7.1 创建Namespace](#7.1 创建Namespace)
    • [7.2 配置Namespace](#7.2 配置Namespace)
  • 八、Nacos配置中⼼
    • [8.1 使用配置中心](#8.1 使用配置中心)
      • [8.1.1 添加配置](#8.1.1 添加配置)
      • [8.1.2 获取配置](#8.1.2 获取配置)
      • [8.1.3 编写程序](#8.1.3 编写程序)
    • [8.2 详解](#8.2 详解)
      • [8.2.1 设置命名空间](#8.2.1 设置命名空间)
      • [8.2.2 Data Id](#8.2.2 Data Id)
  • [九、 Euraka和Nacos的区别](#九、 Euraka和Nacos的区别)

一、介绍

Nacos (Dynamic Naming and Configuration Service):

在最初开源时,Nacos选择进⾏内部三个产品合并统⼀开源(Configserver ⾮持久注册中⼼,VIPServer 持久化注册中⼼,Diamond 配置中⼼)。定位为:⼀个更易于构建云原⽣应⽤的动态服务发现,配置管理和服务管理平台。所以Nacos是⼀个注册中⼼组件,但它⼜不仅仅是注册中⼼组件。

官网:https://nacos.io/

仓库:https://github.com/alibaba/nacos

二、安装nacos

2.1 windows 安装

nacos 跟eureka不一样,nacos官方给我们了一个程序,我们下在对应的Windows版本就行了。

解压缩后bin目录下会有:

由于windows默认启动nacos是集群模式,用记事本打开后需要将set MODE="cluster" 改为:set MODE="standalone"

这样就可以启动nacos了,如果还有报错,可以看log目录里面的错误日志logs/nacos.log,看是不是4888端口被占用了。

启动成功后就可以访问http://127.0.0.1:8848/nacos

2.2 Linux 安装

上传提前下载好的安装包到服务器上。

安装unzip命令:

apt-get install unzip

解压安装包:unzip nacos-server-2.3.2.zip

解压后目录

进⼊nacos/bin⽬录,启动单机模式:bash startup.sh -m standalone

然后通过服务器ip加上端口访问即可。

三、快速使用

还是跟前面eureka一样,我们也使用第一次微服务的启动项目来学习nacos。复制一份,将项目名字和文件里面的项目名改一下即可。

3.1 服务注册/发现

3.1.1 引⼊Spring Cloud Alibaba依赖

在父工程文件中引入Spring Cloud Alibaba依赖。

xml 复制代码
<properties>
	 <spring-cloud-alibaba.version>2022.0.0.0</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>

3.1.2 引入 nacos依赖

在order-service和product-service中引⼊nacos依赖:

xml 复制代码
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

3.1.3 引⼊Load Balance依赖

在order-service和product-service中引⼊Load Balance依赖:

xml 复制代码
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

3.2 修改配置

配置Nacos地址:

java 复制代码
spring:
 application:
 	name: product-service
 cloud:
 	nacos:
 		discovery: 
 			server-addr: 服务器ip加端口

3.3 远程调用

  1. 修改IP为项⽬名:

  2. 为restTemplate添加负载均衡注解 @LoadBalanced

  3. 网站验证

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

四、Nacos负载均衡

⽣产环境相对是⽐较恶劣的,我们需要对服务的流量进⾏更加精细的控制。 Nacos⽀持多种负载均衡略,包括权重,同机房,同地域,同环境等。

4.1 服务下线

当某⼀个节点上接⼝的性能较差时,我们可以直接在nacos中第⼀时间对该节点进⾏下线。下线后这个端口就不会在接收到请求。

4.2 权重配置

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

找到对应节点 -> 编辑 -> 在弹出的窗⼝修改权重值

但是这样直接修改是我们后端使用的复杂均衡就是nacos的,如果不兼容需要去查兼容方法。
如何解决MSENacos上修改服务实例的权重不⽣效问题_微服务引擎(MSE)-阿⾥云帮助中⼼

4.3 开启Nacos负载均衡策略

由于我们现在使用的Spring Cloud LoadBalance组件⾃⾝有负载均衡配置⽅式,所以不⽀持Nacos的权重属性配置。

我们需要开启Nacos的负载均衡策略,让权重配置⽣效。

在yml文件中配置:

yml 复制代码
spring:
 cloud:
 	loadbalancer:
 		nacos:
 			enabled: true

五、同集群优先

Nacos把同⼀个机房内的实例,划分为⼀个集群。所以同集群优先访问,在⼀定程度上也可以理解为同机房优先访问。

微服务架构下一个服务通常有多个实例,这些实例可以在不同的服务器上,而服务器也可以在不同的机房内。而同一个机房一般在同一个局域网之下,所以当访问服务的时候,同机房的服务速度会更快。

⽐如order-service 在上海机房,product-service 在北京和上海机房都有实例,那我们希望可以优先访问上海机房,如果上海机房没有实例,或者实例不可⽤,再访问北京机房的实例。

5.1 配置集群名称

yml文件配置集群名称:

yml 复制代码
spring:
 cloud:
 	nacos:
 		discovery:
 			cluster-name: SH #集群名称: 上海集群 

设置其他复制的服务:

-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ

这样我们就可以在nacos管理页面看见集群的分布了:

5.2 开启Nacos负载均衡策略

同权重配置

yml 复制代码
spring:
	cloud:
 		loadbalancer:
 			nacos:
 				enabled: true

5.3 测试

当前的order-service服务是在SH集群下,现在就只有9091和9092端口的服务可以收到请求,9090服务是收不到的。

当9091和9092端口下线之后,9090必须要接收请求了。

六、Nacos健康检查

6.1 两种检查机制

Nacos作为注册中⼼,需要感知服务的健康状态,才能为服务调⽤⽅提供良好的服务。

Nacos 中提供了两种健康检查机制:

客⼾端主动上报机制:

  • 客⼾端通过⼼跳上报⽅式告知服务端(nacos注册中⼼)健康状态,默认⼼跳间隔5秒;
  • nacos会在超过15秒未收到⼼跳后将实例设置为不健康状态,超过30秒将实例删除
    服务器端反向探测机制:
  • nacos主动探知客⼾端健康状态,默认间隔为20秒
  • 健康检查失败后实例会被标记为不健康,不会被⽴即删除

Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的。

6.2 Nacos服务实例类型

Nacos的服务实例(注册的节点)分为临时实例和⾮临时实例:

  • 临时实例:如果实例宕机超过⼀定时间,会从服务列表剔除,默认类型。
  • ⾮临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
    Nacos对临时实例,采取的是 客⼾端主动上报机制,对⾮临时实例,采取服务器端反向探测机制。

配置⼀个服务实例为永久实例:

yml 复制代码
spring:
 cloud:
 	nacos:
 		discovery:
 			ephemeral: false # 设置为⾮临时实例 

Nacos会记录每个服务实例的IP和端⼝号,当发现IP和端⼝都没有发⽣变化时,Nacos不允许⼀个服务实例类型发⽣变化,⽐如从临时实例,变为⾮临时实例,或者从⾮临时实例,变成临时实例。

解决办法:

  1. 停掉nacos
  2. 删除nacos ⽬录下 /data/protocol/raft 信息,⾥⾯会保存应⽤实例的元数据信息。

七、Nacos环境隔离

企业开发中,⼀个服务会分为开发环境,测试环境和⽣产环境。

  1. 开发环境:开发⼈员⽤于开发的服务器,是最基础的环境。⼀般⽇志级别设置较低,可能会开启⼀些调试信息。
  2. 测试环境:测试⼈员⽤来进⾏测试的服务器,是开发环境到⽣产环境的过渡环境。
  3. ⽣产环境:正式提供对外服务的环境,通常关掉调试信息。

通常情况下,这⼏个环境是不能互相通信的。Nacos提供了namespace(命名空间)来实现环境的隔离。不

同的namaspace的服务不可⻅。

7.1 创建Namespace

默认情况下所有服务都在public空间下:

我们可以新建命名空间:

7.2 配置Namespace

在yml文件中配置

yml 复制代码
spring:
 cloud:
 	nacos:
 		discovery:
 			namespace: 005dd957-fa48-41b6-9c1c-9a8a3d7ec7a5 #命名空间id 

八、Nacos配置中⼼

除了注册中⼼和负载均衡之外,Nacos还是⼀个配置中⼼,具备配置管理的功能。

配置中⼼就是对配置项进⾏统⼀管理。通过配置中⼼,可以集中查看,修改和删除配置,⽆需再逐个修改配置⽂件。提⾼效率的同时,也降低了出错的⻛险。

8.1 使用配置中心

8.1.1 添加配置

选中配置列表,选择配置环境,为当前所选环境添加配置即可。

  1. Data ID 设置为项⽬名称
  2. 配置内容的数据格式,⽬前只⽀持 properties 和 yaml 类型
  3. 设置配置内容

8.1.2 获取配置

引入依赖:

引⼊Nacos Config依赖:

xml 复制代码
<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>

配置bootstrap.properties:

微服务启动前,需要先获取nacos中配置,并与application.yml配置合并。在微服务运⾏之前,Nacos要求

必须使⽤ bootstrap.properties 配置⽂件来配置Nacos Server 地址。

yml 复制代码
spring.application.name=product-service
spring.cloud.nacos.config.server-addr=ip:端口

spring.application.name 需要和nacos配置管理的Data ID⼀致

spring.cloud.nacos.config.server-addr 为Nacos Server的地址

8.1.3 编写程序

  • @Value 读取配置
  • @RefreshScope 配置进⾏热更新
java 复制代码
package com.cloud.product.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/config")
@RefreshScope
@RestController
public class NacosController {
    @Value("${nacos.config}")
    private String nacosConfig;
    @RequestMapping("/get")
    public String get() {
        return "从nacos获取的配置项:"+nacosConfig;
    }

}

测试:

8.2 详解

8.2.1 设置命名空间

Nacos配置管理的命名空间和服务列表的命名空间是分别设置的.默认是public

Nacos命名空间配置依然在bootstrap.properties中进⾏配置:

yml 复制代码
spring.cloud.nacos.config.namespace=命名空间

8.2.2 Data Id

Data Id 格式介绍

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
  • spring.profiles.active 即为当前环境对应的 profile,当 spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。⽬前只⽀持 properties 和 yaml 类型。默认为properties

微服务启动时,会从Nacos读取多个配置⽂件:

  1. ${prefix}-${spring.profiles.active}.${file-extension} 如:product-servicedev.properties
  2. ${prefix}.${file-extension} , 如: product-service.properties
  3. ${prefix} 如product-service

九、 Euraka和Nacos的区别

共同点:

  • 都⽀持服务注册和服务拉取

区别:

  1. 功能
    Nacos除了服务发现和注册之外,还提供了配置中⼼,流量管理和DNS服务等功能
  2. CAP理论
    Eureka遵循AP原则,Nacos可以切换AP和CP模式,默认AP。
    Nacos 根据配置识别CP或者AP模式。如果注册Nacos的Client的节点是临时节点,那么Nacos对这个Client节点的效果就是AP,反之是CP。AP和CP可以同时混合存在。
  3. 服务发现
    Eureka:基于拉模式。Eureka Client会定期从Server拉取服务信息,有缓存,默认每30秒拉取⼀次。
    Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客⼾端保持⼼跳连接。
相关推荐
二哈赛车手1 天前
新人笔记---最终版智能体图片分析完整方案,包括一些总结于经验,以及各种优化点讲解
java·笔记·spring·ai·springboot
泡^泡1 天前
Spring AI简单高仿DeepSeek问答页面
java·人工智能·spring
带刺的坐椅1 天前
Solon v4.0 正式发布,高考记忆版
java·ai·solon·flow·solon-ai
worilb1 天前
Spring Cloud 学习与实践(9):Gateway + JWT 统一鉴权
学习·spring cloud·gateway
山东点狮信息科技有限公司1 天前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
JAVA面经实录9171 天前
操作系统(面试全覆盖)
java·计算机网络·面试
编程的一拳超人1 天前
Maven 国内高速镜像推荐(按速度排序)
java·maven
云烟成雨TD1 天前
Spring AI 1.x 系列【61】Spring AI 2.0 升级指南
java·人工智能·spring
lulu12165440781 天前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi