微服务学习-Nacos 作为注册中心使用

Nacos 实现服务的注册与发现

1. 作用

服务的注册与发现

2. 为什么要引入注册中心

微服务中的订单服务调用商品、库存、账户等服务的 IP 地址和端口都是硬编码,会存在很多问题

  • 如果商品、库存、账户等服务的 IP 地址或端口发生了变化,则订单服务将变得不可用,需要同步修改订单服务调用的地址和端口。
  • 如果系统中提供多个商品、库存、账户等服务,则无法实现微服务的负载均衡功能。
  • 如果需要支持更高的并发,需要部署多个商品、库存账户服务,订单服务中的硬编码后续维护变得异常复杂。

所以,微服务开发过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

3. Nacos 是什么

官方文档:Nacos 配置中心简介, Nacos 是什么 | Nacos 官网

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。--简单理解就是注册中心+配置中心

4. Nacos 下载安装

目前使用版本:Nacos Version: 2.3.2

官方下载地址:https://github.com/alibaba/nacos/tags

官方安装文档:Nacos支持三种部署模式 | Nacos 官网

安装成功后直接访问 http://icoolkj-mall-nacos-server:8848/nacos注意配置 hosts 地址映射,使用云服务器需要开放端口策略),默认账号密码都是 nacos

5. 微服务整合 Nacos 注册中心

官方参考文档:快速开始-阿里云Spring Cloud Alibaba官网

融合 Spring Cloud 文档:Nacos 融合 Spring Cloud,成为注册配置中心 | Nacos 官网

5.1. 整合 Nacos 的服务提供者(库存服务)

服务提供者可以通过 Nacos 的服务注册功能将其服务注册到 Nacos server 上。

5.1.1. 引入依赖:库存服务的 pom.xml 添加 nacos-discovery 注册中心依赖
复制代码
<!--nacos-discovery  注册中心依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
5.1.2. 库存服务的 application.yml 中配置 Nacos server 的地址
复制代码
spring:
  application:
    name: icoolkj-mall-inventory
  cloud:
    nacos:
      server-addr: icoolkj-mall-nacos-server:8848/
5.1.3. 在库存服务启动类上使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
复制代码
@EnableDiscoveryClient
public class InventoryApplication {
5.1.4. 重新启动库存服务,然后进入 nacos 控制台查看库存服务是否成功注册
5.1.5. 同理,商品、账户服务配置同上。
5.2. 整合 Nacos 的服务调用(消费)者(订单服务)
5.2.1. 服务注册

订单服务也需要注册到 Nacos,具体配置同上。

5.2.2. 服务发现

服务调用者可以通过 Nacos 的服务发现功能从 Nacos server 上获取到它要调用的服务。

发现问题:订单服务作为服务调用(消费)者,需要获取库存服务列表,然后选择一个库存服务节点发起调用,那么多个库存服务节点,到底调用那个库存服务节点呢?

新的需求:如果实现选择一个库存服务节点发起调用?

解决方案:RestTemplate + LoadBalancer

6. RestTemplate + LoadBalancer

6.1. 什么是 LoadBalancer

官方文档:Spring Cloud LoadBalancer :: Spring Cloud Commons

SpringCloud LoadBalancer 是由 SpringCloud 官方提供的一个开源的,简单易用的客户端负载均衡器。它包含在 SpringCloud-commons 中用来替换以前的 Ribbon 组件。相比较 Ribbon,SpringCloud LoadBalancer 不仅能够支持 RestTemplate,还支持 WebClient (WebClient 是 Spring Web Flux 中提供的功能,可以实现响应异步请求)。

6.2. 订单服务如何使用 LoadBalancer

订单服务利用负载均衡器 LoadBalancer,从多个库存列表中选择一个节点,再通过 RestTemplate 实现库存服务调用。

6.2.1. 订单服务的 pom.xml 中添加 LoadBalancer 的依赖
复制代码
<!-- loadbalancer 负载均衡器依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
6.2.2. 订单服务的 application.yml 中添加配置 spring.cloud.loadbalancer.nacos.enabled-true
复制代码
spring:
  application:
    name: icoolkj-mall-order
  cloud:
    nacos:
      server-addr: icoolkj-mall-nacos-server:8848
    loadbalancer:
      nacos:
        enabled: true
6.2.3. RestTemplate 添加通过 @LoadBalanced 注解接入 LoadBalancer
复制代码
@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
6.2.4. 订单服务调用逻辑调整

RestTemplate 远程调用,将库存服务的 localhost:8081 使用微服务名称 icoolkj-mall-inventory 替代

复制代码
//String inventoryUrl = "http://localhost:8081/api/inventory/reduce-inventory";
String inventoryUrl = "http://icoolkj-mall-inventory/api/inventory/reduce-inventory";
int inventoryCode = restTemplate.postForObject(inventoryUrl, inventoryRequest, Result.class).getCode();

7. 重启所有服务,测试

7.1. 借助 idea 工具,增加一个库存服务(服务端口:8086)

通过 idea 复制一个启动程序,增加 vm 选项,配置 -Dserver.port=8086

7.2. Nacos 控制台查看服务是否都注册成功
7.3. 多次下单,查看是否成功扣减库存,并查看当前 2 个库存服务的调用的时候,能否调用到新库存服务(服务端口:8086) 。

库存正常扣减,负载均衡器也成功达到效果。

8. RestTemplate + LoadBalancer 这种方式进行微服务调用存在那些问题?

8.1.1. 代码可读性差,编程体验不统一,无法像本地方法调用那样,参数复杂的 URL 难以维护。
8.1.2. 是否有比 RestTemplate + LoadBalancer 更方便好用的服务调用组件?

可以选择 OpenFeign 简化服务调用。

9. 下单业务场景(订单服务调用库存服务为例)

10. 小结

通过 Nacos 注册中心可以实现微服务的注册与发现。

相关推荐
m0_626535205 分钟前
qwen2.5vl学习
学习
索西引擎14 分钟前
【React】React Fiber 架构:设计动机、核心机制与调度策略分析
前端·react.js·架构
Sirius Wu24 分钟前
OpenClaw SubAgent 三层安全约束完整详解
人工智能·安全·ai·架构·aigc
铅笔侠_小龙虾33 分钟前
Rust 学习(8)-切片类型
学习·rust·c#
HZZD_HZZD1 小时前
从单体到微服务:能源计费系统的领域拆分、数据一致性与Spring Cloud实战落地
spring cloud·微服务·能源
自信不摆烂美女1 小时前
从0开始学习3个月进入网络安全行业
学习
mCell6 小时前
从 VS Code 学系统架构:回到当时,理解它为什么这样演进
架构·源码阅读·visual studio code
AOwhisky10 小时前
Python 学习笔记(第一期与第二期)——基础语法——核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发
STLearner10 小时前
ICML 2026 | LLM×Graph论文总结[1]【图基础模型,文本属性图,多模态属性图,图对齐,图提示学习,关系深度学习
论文阅读·人工智能·python·深度学习·学习·机器学习·数据挖掘
国科安芯11 小时前
航天电子模拟前端三大支柱:精密运放、高速运放与电压监控的协同设计方法——ASL8522S/ASL622S/ASL706S技术解析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试