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

news/2025/1/22 23:16:03/

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-inventorycloud: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-ordercloud:nacos:server-addr: icoolkj-mall-nacos-server:8848loadbalancer:nacos:enabled: true
6.2.3. RestTemplate 添加通过 @LoadBalanced 注解接入 LoadBalancer
@Configuration
public class RestTemplateConfig {@LoadBalanced@BeanRestTemplate 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 注册中心可以实现微服务的注册与发现。


http://www.ppmy.cn/news/1565330.html

相关文章

SpringBoot快速接入OpenAI大模型(JDK8)

使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型&#xff0c;并且如何实现流式与非流式的输出&#xff0c;以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3&#xff0c;但是目前很多应用依旧使用的JDK8版本&…

32单片机从入门到精通之测试与验证——单元测试(十五)

人生苦短&#xff0c;我们都会面临困难和挑战。但是&#xff0c;只要我们保持积极的心态和勇往直前的精神&#xff0c;我们就能战胜一切困难&#xff0c;实现自己的目标。 成功并不是一蹴而就的&#xff0c;它需要我们付出努力和坚持不懈。就像爬山一样&#xff0c;我们可能会遇…

物联网技术正在如何影响我们的生活

物联网改变生活 引言 在今天这个数字化迅猛发展的时代&#xff0c;物联网&#xff08;IoT&#xff09;已经悄然渗透了我们生活的每一个角落。想象一下&#xff0c;当你的冰箱能够自动订购牛奶时&#xff0c;你是否会感到惊喜&#xff1f;这就是物联网的魔力&#xff0c;它不仅…

InVideo AI技术浅析(五):生成对抗网络

一、特效生成 1. 工作原理 特效生成是计算机视觉中的高级应用,旨在通过算法生成高质量的视觉特效,如风格迁移、图像到图像的翻译等。InVideo AI 使用生成对抗网络(GAN)来实现这一功能。GAN 通过生成器和判别器两个网络的对抗训练,生成逼真的视觉特效。 2. 关键技术模型…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

Chapter 3-14. Detecting Congestion in Fibre Channel Fabrics

Port Monitor Policy Parameters Each policy contains one or more counters to monitor. Counters have the following parameters: 每个策略包含一个或多个要监控的计数器。计数器有以下参数: Counter name: The name of the counter which describes its function. 说明…

uniapp封装websocket

WebSocket介绍 后端使用的是springbootnetty做websocket的服务端&#xff0c;参考我其他博文 项目使用场景 开发uniapp项目时&#xff0c;需要进行实时通信&#xff0c;比如聊天等。需要封装一个工具类&#xff0c;统一对socket进行管理。 uniapp websocket官方文档&#xff1…

【PowerQuery专栏】PowerQuery提取XML数据

XML数据和Json 数据类型都是比较典型的层次数据类型,XML的数据格式非常的对称。所有的数据均是由标签对组成,图为典型的XML文件类型的数据。 在PowerQuery中进行XML数据类型解析采用的是Xml.Document 函数来进行文件内容的解析,Xml.Document 目前有三个可用参数。 参数1为数…