news 2026/4/18 5:38:40

Nacos 的微服务注册中心实现详解(基于黑马商城部署)(springcloud微服务课day4)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nacos 的微服务注册中心实现详解(基于黑马商城部署)(springcloud微服务课day4)

Nacos 的微服务注册中心实现详解

上一节课关于docker部署的知识点的讲解:Docker的部署使用详解

在微服务架构中,服务数量多、实例动态变化,如果仍然写死IP和地址进行调用,系统会非常脆弱。
注册中心就是为了解决这个问题而存在的基础设施。


📚 目录(点击跳转对应章节)

一、注册中心核心原理
二、常见注册中心对比
三、Docker 部署 Nacos
四、准备 MySQL 数据库
五、准备 Nacos 环境变量文件
六、启动 Nacos 容器
七、访问 Nacos 控制台
八、服务注册实战(item-service)
九、服务发现实战(cart-service)
十、使用 DiscoveryClient 做服务发现
十一、负载均衡策略说明
十二、完整调用链总结
十三、核心理解总结


一、注册中心核心原理

在微服务远程调用中,有两个基本角色:

  • 服务提供者:提供接口,例如item-service
  • 服务消费者:调用接口,例如cart-service

当服务变多后,会出现几个问题:

  • 服务地址经常变化
  • 实例会扩容或宕机
  • 调用方难以维护地址列表

因此引入第三个角色:

注册中心
其作用是存储、管理服务实例信息,并实现服务实例的动态发现。


注册中心三方结构

系统中包含三方:

  • 服务提供者
  • 服务消费者
  • 注册中心

服务注册流程

服务启动时会自动向注册中心注册:

  • 服务名称
  • IP 地址
  • 端口号

注册中心保存这些实例信息。


服务发现流程

服务消费者调用流程:

  1. 向注册中心订阅服务列表
  2. 获取实例列表
  3. 本地负载均衡选择实例
  4. 发起远程调用

健康检查机制

注册中心通过心跳机制维护实例健康:

  • 服务定期发送心跳

心跳机制:服务实例定期发送心跳包(心跳包是一个空的 HTTP 请求,默认5秒发送一次)到注册中心,证明自己正常运行。

  • 注册中心超时未收到 → 判定宕机
  • 自动剔除实例
  • 新实例启动 → 自动注册
  • 实例变化 → 推送更新

对于注册中心的简单理解

注册中心 = 动态地址簿 + 健康管理器 + 实例调度中心

动态地址簿:注册中心维护服务实例的地址列表,服务消费者可以从注册中心获取最新的实例地址。
健康管理器:注册中心通过心跳机制监控服务实例的健康状态,及时发现并剔除不健康的实例。
实例调度中心:注册中心根据负载均衡策略,为服务消费者分配可用的服务实例。

注意:

注册中心只提供列表,不做负载均衡


二、常见注册中心对比

注册中心出品公司特点
EurekaNetflixSpringCloud 原生
Nacos阿里注册 + 配置中心
ConsulHashiCorp多语言支持

一般情况下为什么选 Nacos?

原因如下:

  • 免费开源
  • 中文资料多
  • SpringCloud Alibaba 官方支持
  • 同时支持配置中心
  • 国内使用广泛

三、Docker 部署 Nacos

为了保证环境干净、部署简单、可重复搭建,我们这里采用 Docker 容器方式部署 Nacos 注册中心。相比直接安装方式,Docker 方式具有明显优势:

  • 环境隔离,不污染系统

  • 部署速度快

  • 配置简单

  • 可快速销毁重建

  • 便于团队统一环境

  • 更贴近生产部署方式

3.1 部署结构说明

本次部署包含两个核心容器:

MySQL 容器

用于存储:

  • 服务注册信息
  • 配置数据
  • 命名空间数据
  • 集群元数据

Nacos 容器

负责:

  • 服务注册
  • 服务发现
  • 心跳检测
  • 实例健康管理
  • 服务列表推送

3.2 前置环境要求

在开始之前,请确保环境满足:

必备软件

Docker >= 20.x Docker Compose(可选) MySQL 容器已运行

端口占用检查

确保以下端口未被占用:

8848 → Nacos 控制台 9848 → 集群通信端口 9849 → Raft 通信端口

检查命令:

netstat-tunlp|grep8848

四、准备 MySQL 数据库

创建数据库

CREATEDATABASEnacos_config;

导入初始化表结构

下载 Nacos 官方 SQL:

conf/nacos-mysql.sql

导入到 MySQL 容器:

dockerexec-it mysql容器名bashmysql -uroot -p use nacos_config;source/路径/nacos-mysql.sql;

五、准备 Nacos 环境变量文件

新建文件:

custom.env

内容如下:

MODE=standalone SPRING_DATASOURCE_PLATFORM=mysql MYSQL_SERVICE_HOST=你的MySQL容器IP MYSQL_SERVICE_PORT=3306 MYSQL_SERVICE_DB_NAME=nacos_config MYSQL_SERVICE_USER=root MYSQL_SERVICE_PASSWORD=你的密码

关键点:

MYSQL_SERVICE_HOST 必须写 MySQL 容器IP


六、启动 Nacos 容器

dockerrun -d\--name nacos\--env-file ./custom.env\-p8848:8848\-p9848:9848\-p9849:9849\--restart=always\nacos/nacos-server:v2.1.0-slim

七、访问 Nacos 控制台

浏览器访问:

http://服务器IP:8848/nacos

默认账号密码:

nacos / nacos

注册中心部署完成。


八、服务注册实战(item-service)

目标:把item-service注册到 Nacos。


1. 添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

说明:

  • 同时支持注册 + 发现
  • 所有微服务都可以使用

2. 配置 Nacos 地址

spring:application:name:item-servicecloud:nacos:server-addr:192.168.150.101:8848

3. 启动服务

启动后自动注册到 Nacos。

控制台可见:

item-service

4. 多实例测试

修改端口再启动一个实例:

server:port:8082

控制台可看到:

item-service ├── 实例1 └── 实例2

九、服务发现实战(cart-service)

目标:让 cart-service 调用 item-service。


1. 添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2. 配置地址

spring:cloud:nacos:server-addr:192.168.150.101:8848

十、使用 DiscoveryClient 做服务发现


注入组件

@AutowiredprivateDiscoveryClientdiscoveryClient;

获取实例列表

List<ServiceInstance>instances=discoveryClient.getInstances("item-service");

随机负载均衡

ServiceInstanceinstance=instances.get(newRandom().nextInt(instances.size()));

构造调用地址

Stringurl=instance.getUri()+"/item/"+id;Itemitem=restTemplate.getForObject(url,Item.class);

十一、负载均衡策略说明

常见负载均衡算法:

  • 随机
  • 轮询
  • IP Hash
  • 最少连接
  • 权重调度

后续可以升级为:

SpringCloud LoadBalancer OpenFeign

自动负载均衡调用。


十二、完整调用链总结


服务提供者

启动 → 注册 → 心跳 → 健康维护


注册中心

存储 → 检测 → 剔除 → 推送更新


服务消费者

订阅 → 获取列表 → 负载均衡 → 调用


十三、核心理解总结

注册中心解决的不是"调用问题",而是:

  • 地址解耦
  • 实例动态管理
  • 容错与高可用

自此,微服务之间不用再记住彼此地址,而是通过注册中心找到彼此。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:23:28

MySQL 对前N条数据求和的优化方案(含完整示例)

在数据分析场景中&#xff0c;我们经常需要计算分组数据中排名前N的记录的合计值。本文将详细介绍在MySQL中实现这一需求的几种方法&#xff0c;并对比它们的性能差异。 一、基础需求场景 假设我们有一个销售数据表sales_data&#xff0c;结构如下&#xff1a; CREATE TABLE…

作者头像 李华
网站建设 2026/4/15 9:09:48

【计算机毕业设计案例】基于Android二手图书交易系统设计基于Android的旧物交易平台的设计与实现(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/29 11:35:51

期刊投稿总被拒?宏智树AI解锁核心刊适配密码,新手也能高效见刊

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被期刊投稿焦虑刷屏&#xff1a;“改了6版的期刊论文&#xff0c;被审稿人批‘文献引用不权威’”“实证图表没规范&#xff0c;返修花了整整一周”“选题贴合热点&#xff0c;却不符合期刊发文调性”——其实多数人投稿失…

作者头像 李华
网站建设 2026/4/12 3:14:27

【课程设计/毕业设计】基于安卓Android的闲置旧物二手交易平台的设计与实现基于Android的旧物交易平台的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 19:45:23

python对接mysql和模型类的故障

你疑惑的这两段代码&#xff08;detail 接口的 mappings() 查询、Videos 模型类&#xff09;本质上是「定义」和「查询实现」的关系&#xff0c;本身没有逻辑冲突&#xff0c;但存在「字段约束不匹配」和「查询方法兼容性」两个关键小坑&#xff0c;这也是为什么数据库有数据&a…

作者头像 李华
网站建设 2026/4/13 10:06:29

比官方便宜一半以上!OpenAI Responses API 教程

OpenAI 最近提供了一个创建模型响应的接口。提供文本或图像输入以生成文本或图像输出。让模型调用您自己的自定义代码或使用内置工具&#xff0c;如 web 搜索或文件搜索&#xff0c;以使用您自己的数据作为模型响应的输入。 本文档主要介绍 OpenAI Responses API 操作的使用流…

作者头像 李华