【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:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客⼾端保持⼼跳连接。
相关推荐
云上凯歌2 小时前
01 GB28181协议基础理解
java·开发语言
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试系统DDD(领域驱动设计)实现步骤详解
java·数据库·人工智能·spring boot
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Java的运动器材销售网站为例,包含答辩的问题和答案
java·开发语言
workflower2 小时前
软件需求规约的质量属性
java·开发语言·数据库·测试用例·需求分析·结对编程
TracyCoder1233 小时前
Java String:从内存模型到不可变设计
java·算法·string
想用offer打牌3 小时前
Spring AI Alibaba与 Agent Scope到底选哪个?
java·人工智能·spring
黄晓琪3 小时前
Java AQS底层原理:面试深度解析(附实战避坑)
java·开发语言·面试
我是大咖3 小时前
二维数组与数组指针
java·数据结构·算法
姓蔡小朋友3 小时前
Java 定时器
java·开发语言