当前位置: 首页 > news >正文

Nacos 注册中心介绍与实操

前言

本文为个人SpringCloud学习笔记,主要记录Nacos的注册中心实操、SpringBoot多模块编程实操等

注册中心

注册中心介绍

注册中心是微服务的一个重要组件,用于实现服务的注册与发现,主要作用包括以下:

  • 服务注册: 服务实例启动时,将自身信息注册到注册中心,包括服务名称、地址、端口等。
  • 服务发现:消费者向注册中心查询服务,并获取服务实例信息来访问服务。
  • 服务健康检测:注册中心定期检测服务实例健康状况,过滤不健康实例。
  • 服务路由:提供服务的路由与负载均衡功能。
  • 服务监控:统计服务调佣次数,时长等,用于监控服务状态。
  • 服务更新:当服务实例信息变更时,向注册中心发送更新信息通知。通过注册中心,服务提供者和消费者只需与注册中心交互即可,从而实现服务的注册与发现,减低服务间的耦合度。

注册中心交互流程

这张图非常重要
在这里插入图片描述

注册中心通常有两个角色

  • 服务提供者(也叫生产者):对外提供服务的微服务应用。它会把自身的服务地址注册到注册中心,以供消费者发现和调用。
  • 服务调用者(也叫消费者) :调用其他微服务的应用程序。它会向注册中心订阅自己需要的服务,并基于服务提供者注册的信息发起远程调用。这个具体服务调用的受到负载均衡控制

生产者实现

使用多模块编程的方式实现生产者

1.构建父模块
在这里插入图片描述
2.父模块添加依赖
在这里插入图片描述
3.删除无用文件
在这里插入图片描述
4.父依赖修正
在这里插入图片描述
在这里插入图片描述
4.构建子模块生产者(prodiver)
在这里插入图片描述
在这里插入图片描述
5.子类依赖
在这里插入图片描述
6.删除重复依赖

因为父模块中已经有配置,那么子模块下面图示代码删除即可

在这里插入图片描述
在这里插入图片描述
7.添加所属父类说明
在这里插入图片描述
8.父类添加拥有子类说明
在这里插入图片描述
9. 子类配置application.yml

spring:application:# 服务注册站点name: nacos-provider #命名不能使用‘_’,早期SpringCloud不支持cloud:nacos:# Nacos认证信息discovery:username: nacospassword: nacos# Nacos 服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口server-addr: localhost:8848namespace: public # 注册到nacos的指定namespace,默认public
server:port: 0 #动态端口

补充:这里使用动态端口是因为微服务中,消费者在调用生产者服务的时候是通过Nacos作为中间人的,具体调用到哪个一个实际上并不关心,所以实际生产者端口号分配工作不妨丢给操作系统去分配,这样也不怕端口被占有的问题。同时,也是因为微服务的随机调用生产者服务,不需要写死服务调用端口号,所以机器处理可靠下,为什么不让机器来考虑这种问题呢?而且微服务体量大,如果人为去分配,也可以导致两个服务分配到相同的端口号,所以这种工作不妨让机器去苦恼。

10.子模块启动
在这里插入图片描述
项目启动:
在这里插入图片描述

在项目启动后,会自动注册到Nacos中作为一个服务站点中的一员

访问成功:
在这里插入图片描述
11.最终说明
到此多模块的创建便结束了,以下是父模块pom.xml与子模块provider的pom.xml

父模块pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>SpringCloudDiscoveryDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringCloudDiscoveryDemo</name><description>SpringCloudDiscoveryDemo</description><!--  标识当前为父模块  --><packaging>pom</packaging><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version><spring-cloud.version>2022.0.0</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><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-test</artifactId><scope>test</scope></dependency></dependencies><modules><module>provider</module></modules><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><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></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

provider----->pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>provider</artifactId><version>0.0.1-SNAPSHOT</version><name>provider</name><description>provider</description><parent><groupId>com.example</groupId><artifactId>SpringCloudDiscoveryDemo</artifactId><version>0.0.1-SNAPSHOT</version></parent><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.example.provider.ProviderApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

消费者

注册中心的消费者的实现比生产者更为复杂一些,首先因为消费者要通过调用生产者提供API来完成服务,这其中就需要HTTP接口作为中间人,那么就需要引入Spring Cloud OpenFeign,其次为了实现负载均衡,我们还需要添加客户端负载均衡器Spring Cloud LoadBalancer

  • Spring Cloud OpenFeign: Spring Cloud OpenFeign 是 SpringCloud 生态系统中的一个组件,它是基于 Netflix 的 Feign 库开发的,用于简化和优化微服务架构中的服务间通信。
  • Spring Cloud LoadBalancer: Spring Cloud 团队提供的一种客户端负载均衡器
  • 负载均衡(Load Balancer) :一种在多个服务实例之间分配负载和流量的技术,目的是提高服务的整体性能和可靠性。

消费者创建步骤如下:
1.子模块消费者(Consumer)
还是一样的配方
在这里插入图片描述
2.添加依赖
父模块添加OpenFegin与LoadBalance依赖

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

父模块添加子模块说明

<modules><module>provider</module><module>consumer</module>
</modules>

子模块添加父模块说明

<parent><groupId>com.example</groupId><artifactId>SpringCloudDiscoveryDemo</artifactId><version>0.0.1-SNAPSHOT</version>
</parent>

3.启动配置

spring:application:# 服务注册站点name: nacos-consumer#命名不能使用‘_’,早期SpringCloud不支持cloud:nacos:# Nacos认证信息discovery:username: nacospassword: nacos# Nacos 服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口server-addr: localhost:8848namespace: public # 注册到nacos的指定namespace,默认publicregister-enabled: false
server:port: 8080 

这里需要注意的是:对于消费者而已,我们需要把它的注册功能关闭,因为消费者本身是调用服务而不提供服务,所以没必要注册服务,所以这里使用“register-enabled: false”将其关闭,而且消费者生产者的服务注册站点名字配置上也不同,方便管理

除此之外还有一点,对于客户端来说,他不再想服务端那样端口动态化,因为客户端主要还是面向人的,如果人要使用,端口动态,那么我要如何才能准确访问到呢?所以客户端端口需要明确指定

4.开启OpenFegin
在消费者的启动类上加上注解@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}
  1. 创建消费者调用服务接口

在这里插入图片描述

@Service
@FeignClient(name = "nacos-provider")
public interface UserService {@RequestMapping("/user/getInfo")public String getInfo(@RequestParam("name") String name);
}

这里我们需要注意到的是@FeignClient(name = “nacos-provider”),就是告诉这个接口:服务站点在这个位置

@RequestMapping(“/user/getInfo”)而这一句注解则是告诉这个服务接口具体路由,所以消费者的接口就可以通过路由访问调用到生产者的API了

6.调用服务API

import com.example.consumer.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@Autowiredprivate UserService userService;@RequestMapping("/order")public String getInfo(){return userService.getInfo(" Spring Cloud");}
}

7.实际效果

在这里插入图片描述

注册中心参数介绍

注册中心详情页:
在这里插入图片描述
重要参数说明

  • 分组:注册服务所在组名,默认是DEFAULT_GROUP,
  • 保护阈值:健康节点要求的最小百分比。用于在服务出现不健康实例时,阻止流量过度向少量健康实例集中,保护服务的整体可用性。保护闻值应设置为一个0到1之间的浮点数,默认值为0。当集群中的健康实例占比小于设置的保护闻值时,就会触发闻值保护功能。触发保护闻值后,Nacos会将全部实例(健康实例+非健康实例)返回给调用者,虽然可能会损失一部分流量,但能保证集群中剩余的健康实例能正常工作。
  • 服务路由类型: 用于实现不同的路由需求,常见的路由类型有以下两种:
    • none:默认路由,基于权重的轮询负载均衡路由策略0
    • label:标签路由,相同标签的实例会被聚合为一个集群,不同标0签则实现流量隔离。
  • 实例:
    • 临时实例: Nacos 中的实例分为临时实例和永久实例(也叫持久实例),临时实例的生命周期和服务的运行周期相同,服务停止运行Nacos 中就会将临时实例删除;
    • 永久示例:即时程序终止,也会保留在Nacos 中。在配置文件中通过:spring.cloud.nacos.discovery.ephemeral=true 设置
  • 权重:用于实现负载均衡,取值范围0到10000,数值越大,权重越大,负载均衡被分配的概率也就越高。设置为0的时候表示下线

label 标签实现就近访问,官方实现: https://nacos.io/zh-cn/blog/cmdb.html
民间实现:
https://blog.csdn.net/lr309283175/article/details/116030428

健康检测机制

Nacos中的健康检测机制是用来检查服务健康状态的,只有健康的节点才会被服务消费端调用,这样才能保证程序稳定、正常的运行。Nacos中提供了两种健康检测的机制:

  1. 客户端主动上报(健康状态的) 机制
  2. 服务器端反向探测(健康状态的) 机制

举个简单的例子:
面对灾害,对于被困人,ta需要主动求助:“救救我,救救我”,而对于搜救员,是“你在哪,你在哪”的反向询问确认

所以就是说,客户端每隔一段时间,跟服务端上报状态,而服务端则通过反向探测来确定客户端是否健康

所以这两种机制时间上是对应两个服务实例
临时实例:对应客户端主动上报状态
永久实例:反向探测客户端状态


END
希望对你有帮助

相关文章:

Nacos 注册中心介绍与实操

前言 本文为个人SpringCloud学习笔记&#xff0c;主要记录Nacos的注册中心实操、SpringBoot多模块编程实操等 注册中心 注册中心介绍 注册中心是微服务的一个重要组件&#xff0c;用于实现服务的注册与发现&#xff0c;主要作用包括以下&#xff1a; 服务注册&#xff1a;…...

基于51单片机的智能手机充电器设计

**单片机设计介绍&#xff0c;1660【毕设课设】基于51单片机和MAX1898的智能手机充电器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 51单片机智能手机充电器设计介绍 51单片机智能手机充电器是一种可以实现智能快速充电的…...

nginx 和gateway配置实现动静分离和反向代理

这两个配置文件分别是Nginx和Spring Cloud Gateway的配置文件&#xff0c;它们用于构建网关服务&#xff0c;进行请求的路由和转发。 前端发送请求的时候为了不暴露服务器地址,所以会使用nginx做反向代理的一个主要作用是隐藏后端服务器的真实地址&#xff0c;从而增加网络安全…...

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…...

系统韧性研究(3)| 工程系统韧性要求

从最基本的层面上说&#xff0c;系统韧性指的是系统在逆境中继续执行其任务的程度。虽然对操作连续性至关重要&#xff0c;但系统的服务&#xff08;能力&#xff09;只是系统继续执行其任务所必须保护的一些资产。该系统必须检测不利因素&#xff0c;对其作出反应&#xff0c;…...

.net 5 发布后swagger页面不显示问题

1&#xff1a;项目右键属性-》生成xml--用于swagger文件读取 2&#xff1a;开启文件配饰swagger读取指定文件...

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…...

1985-2020年我国30m土地利用覆盖数据介绍

土地覆盖(LC)决定了地球各圈层之间的能量交换、水和碳循环。准确的 LC 信息是环境和气候研究的基本参数。考虑到在过去几十年中&#xff0c;随着经济建设的发展&#xff0c;中国发生了巨大的变化&#xff0c;连续和精细的 LC 监测是迫切需要的。然而&#xff0c;目前&#xff0…...

Django 社区志愿者管理系统

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 社区志愿者服务管理系统&#xff0c;主要的模块包括查看首页、个人中心、通知公告管理、志愿者管理、普通管理员管理、志愿活动管理、活动宣…...

wordpress如何修改数据库里用户ID下一个自增值的开始数字

有时候我们为了让别人认为网站有很多注册用户&#xff0c;会想把网站用户ID的起始数改大一点&#xff0c;因为WP默认的用户ID是从1开始&#xff0c;注册一个就加1&#xff0c;这样别人就很容易知道网站的用户量。 那么如何改呢&#xff1f;首先进phpmyadmin&#xff0c;找到wp…...

利用chatgpt大语言模型来做数据预处理

数据预处理是机器学习中的一个重要步骤&#xff0c;包括数据清洗、数据转换、特征选择等。这些步骤通常需要人工进行&#xff0c;或者使用专门的数据预处理工具和库&#xff0c;如Python的Pandas库、Scikit-learn库等。 今天我们将利用chatgpt(国内版本-小策智能问答)的辅助帮…...

【机器学习】五、贝叶斯分类

我想说&#xff1a;“任何事件都是条件概率。”为什么呢&#xff1f;因为我认为&#xff0c;任何事件的发生都不是完全偶然的&#xff0c;它都会以其他事件的发生为基础。换句话说&#xff0c;条件概率就是在其他事件发生的基础上&#xff0c;某事件发生的概率。 条件概率是朴…...

k8s 资源管理方式

k8s中资源管理方式可以划分为下面的几种&#xff1a;命令式对象管理、命令式对象配置、声明式对象配置。 命令式对象管理 命令式对象管理&#xff1a;直接使用命令的方式来操作k8s资源, 这种方式操作简单&#xff0c;但是无法审计和追踪。 kubectl run nginx-pod --imagengi…...

Golang Gin 接口返回 Excel 文件

文章目录 1.Web 页面导出数据到文件由后台实现还是前端实现&#xff1f;2.Golang Excel 库选型3.后台实现示例4.xlsx 库的问题5.小结参考文献 1.Web 页面导出数据到文件由后台实现还是前端实现&#xff1f; Web 页面导出表数据到 Excel&#xff08;或其他格式&#xff09;可以…...

实战之巧用header头

案例&#xff1a; 遇到过三次 一次是更改accept&#xff0c;获取到tomcat的绝对路径&#xff0c;结合其他漏洞获取到shell。 一次是更改accept&#xff0c;越权获取到管理员的MD5加密&#xff0c;最后接管超管权限。 一次是更改accept&#xff0c;结合参数获取到key。 这里以越…...

[AUTOSAR][诊断管理][ECU][$36] 数据传输

文章目录 一、简介二、服务请求报文定义三、服务请求报文中参数定义(1)blockSequenceCounter(2)transferRequestParameterRecord三、肯定响应(1)blockSequenceCounter(2)transferResponseParameterRecord四、支持的NRC五、示例代码36_transfer_data.c一、简介 这个服务…...

sw 怎么装新版本

我们在安装solidworks时&#xff0c;有时候会提示A newer version of this applic ation is already installed. Installation stopped.如下图所示 这时候需要点继续安装 然后会出现下图所示情况&#xff0c;vba7.1安装未成功 这是因为我们电脑中以前安装过更高版本的solidw…...

正点原子嵌入式linux驱动开发——Linux 音频驱动

音频是最常用到的功能&#xff0c;音频也是linux和安卓的重点应用场合。STM32MP1带有SAI接口&#xff0c;正点原子的STM32MP1开发板通过此接口外接了一个CS42L51音频DAC芯片&#xff0c;本章就来学习一下如何使能CS42L51驱动&#xff0c;并且CS42L51通过芯片来完成音乐播放与录…...

conda相关的命令操作

准备切换conda环境 cd C:\ProgramData\Anaconda3\Scripts查看所有环境 conda info --envs选择环境 activate pytorch安装torch pip install D:\installPackage\torch-1.2.0-cp36-cp36m-win_amd64.whl安装torchvision pip install D:\installPackage\torchvision-0.4.0-cp3…...

如何快速使用Vue3在electron项目开发chrome Devtools插件

1、建立Vue项目 为了方便快速建立项目&#xff0c;我已经写好脚手架&#xff0c;直接clone项目&#xff0c;快速开发 点击快速进入源代码 拉取代码 git clone https://github.com/xygengcn/electron-devtool.git安装依赖 yarn运行项目 yarn dev打包项目 yarn build2、安装…...

Java Stream 高级实战:并行流、自定义收集器与性能优化

一、并行流深度实战&#xff1a;大规模数据处理的性能突破 1.1 并行流的核心应用场景 在电商用户行为分析场景中&#xff0c;需要对百万级用户日志数据进行实时统计。例如&#xff0c;计算某时段内活跃用户数&#xff08;访问次数≥3次的用户&#xff09;&#xff0c;传统循环…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…...

04 Deep learning神经网络编程基础 梯度下降 --吴恩达

梯度下降在深度学习的应用 梯度下降是优化神经网络参数的核心算法,通过迭代调整参数最小化损失函数。 核心公式 参数更新规则: θ t + 1 = θ t − η ∇ J ( θ...

Spring Boot SSE流式输出+AI消息持久化升级实践:从粗暴到优雅的跃迁

在 AI 应用落地过程中&#xff0c;我们常常需要将用户和 AI 的对话以“完整上下文”的形式持久化到数据库中。但当 AI 回复非常长&#xff0c;甚至接近上万字时&#xff0c;传统的单条消息保存机制就会出问题。 在本篇文章中&#xff0c;我将深入讲解一次实际项目中对 对话持久…...

【JJ斗地主-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …...

打卡第47天

作业&#xff1a;对比不同卷积层热图可视化的结果 核心差异总结 浅层卷积层&#xff08;如第 1-3 层&#xff09; 关注细节&#xff1a;聚焦输入图像的边缘、纹理、颜色块等基础特征&#xff08;例&#xff1a;猫脸的胡须边缘、树叶的脉络&#xff09;。热图特点&#xff1a;区…...

电力系统时间同步系统之三

2.6 电力系统时间同步装置 时间同步装置主要完成时间信号和时间信息的同步传递&#xff0c;并提供相应的时间格式和物理接口。时间同步装置主要由三大部分组成&#xff1a;时间输入、内部时钟和时间输出&#xff0c;如图 2-25 所示。输入装置的时间信号和时间信息的精度必须不…...

LinkedList、Vector、Set

LinkedList 基本概念 LinkedList 是一个双向链表的实现类&#xff0c;它实现了 List、Deque、Queue 和 Cloneable 接口&#xff0c;底层使用双向链表结构&#xff0c;适合频繁插入和删除操作。 主要特点 有序&#xff0c;可重复。 查询速度较慢&#xff0c;插入/删除速度较…...

AndroidR车机TextToSpeech音频焦点异常问题分析

一、引言 文章《Android车机之TextToSpeech》介绍了TextToSpeech的使用,当前较多座舱系统语音服务都接入了原生TextToSpeech接口调用。 我司自研语音TTS服务,也接入了此TTS接口调用,对外提供TextToSpeech能力,播报时由客户端Client自行管理音频焦点,播报前申请音频焦点,…...

thinkphp-queue队列随笔

安装 # 创建项目 composer create-project topthink/think 5.0.*# 安装队列扩展 composer require topthink/think-queue 配置 // application/extra/queue.php<?php return [connector > Redis, // Redis 驱动expire > 0, // 任务的过期时间…...