微服务架构 --- Nacos的项目实战操作

news2024/11/20 21:33:46

目录

一.什么是Nacos?

二.什么是注册中心?

1.注册中心的定义:

2.为什么需要使用注册中心?

3.注册中心原理:

三.Nacos的使用:

1.安装与启动Nacos:

2.集成 Nacos 服务注册与发现:

(1)导入Nacos依赖:

 (2)配置Nacos注册中心:

(3)使用Nacos发现并调用服务:

3.常见错误以及解决方案:

总结:


资源参考:SpringCloud微服务开发与实战 --- java黑马商城项目微服务实战开发文档

一.什么是Nacos?

Nacos 是阿里巴巴开源的一款服务发现、配置管理和动态 DNS的工具,适用于微服务架构。它是 Spring Cloud Alibaba 生态的重要组件,用于解决微服务之间的服务注册与发现,以及配置的集中管理问题。

  • 特点:服务注册与发现 + 配置管理一体化,支持健康检查和动态配置。
  • 优点:支持多种协议(HTTP、gRPC),UI 管理方便,适用于 Spring Cloud。

二.什么是注册中心?

1.注册中心的定义:

注册中心是微服务架构中的一个核心组件,用于服务注册与发现。在分布式系统中,多个微服务实例需要互相通信,但每个服务的地址可能动态变化,比如因为自动扩展、实例重启、故障恢复等。因此,注册中心充当了服务地址的目录,实现了服务实例的动态管理和发现,保证服务间的高效通信。

2.为什么需要使用注册中心?

 假如商品微服务被调用较多,为了应对更高的并发,我们进行了多实例部署:

 

此时,每个item-service的实例其IP或端口不同,问题来了:

  • item-service这么多实例,cart-service如何知道每一个实例的地址?

  • http请求要写url地址,cart-service服务到底该调用哪个实例呢?

  • 如果在运行过程中,某一个item-service实例宕机,cart-service依然在调用该怎么办?

  • 如果并发太高,item-service临时多部署了N台实例,cart-service如何知道新实例的地址?

带着这四个问题,我们开始学习注册中心: 

在微服务架构中,每个服务可能分布在不同的节点或容器内。由于这些服务的IP地址和端口号可能会变化,传统的静态配置方法无法满足需求。注册中心解决了以下问题:

  1. 动态服务地址管理:当服务实例启动或关闭时,地址会自动更新到注册中心。
  2. 自动负载均衡:注册中心记录了所有可用的服务实例,可以根据策略实现负载均衡。
  3. 故障恢复:如果某个实例不可用,注册中心会标记其状态,避免请求发送到无效实例。
  4. 去中心化:客户端可以动态发现服务,不需要硬编码服务地址。

3.注册中心原理:

按照上面箭头进行流程分析如下:

  • 服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心

  • 调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可多实例部署)

  • 调用者自己对实例列表负载均衡,挑选一个实例

  • 调用者向该实例发起远程调用

当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?(心跳请求机制)

  • 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求机制)

  • 当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除

  • 当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表

  • 当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表

三.Nacos的使用:

1.安装与启动Nacos:

我们基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。由于是Docker部署,所以我们需要将资料中的SQL文件导入到我们自己的Docker中的MySQL容器中:Nacos的相关资料-CSDN博客

导入后再Linux虚拟机内的/root/nacos目录内导入custom.env文件,文件内容见Nacos的相关资料-CSDN博客

进入root目录后执行下面的Docker命令:

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

随后启动完成后,访问下面的地址:http://虚拟机IP地址:8848/nacos/,首次访问会跳转到登录页,账号密码都是nacos。

2.集成 Nacos 服务注册与发现:

如果我们想在cart-service模块远程调用item-service的接口,我们进行下面操作:

(1)导入Nacos依赖:

在两模块导入依赖: 

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

任何一个微服务都可以调用别人,也可以被别人调用,即可以是调用者,也可以是提供者。 

 (2)配置Nacos注册中心:

在item-service的application.yml中添加Nacos地址配置:

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 虚拟机IP地址:8848 # nacos地址

在cart-service的application.yml中添加Nacos地址配置:

spring:
  application:
    name: cart-service # 服务名称
  cloud:
    nacos:
      server-addr: 虚拟机IP地址:8848 # nacos地址

(3)使用Nacos发现并调用服务:

可参考下面博客进行理解: 微服务架构 --- OpenFeign的项目实战操作-CSDN博客

在启动类中添加 @EnableDiscoveryClient 注解:

@MapperScan("com.hmall.cart.mapper")
@SpringBootApplication
@EnableDiscoveryClient  
public class CartApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);
    }

    //RestTemplate
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

随后在Service层使用discoveryClient客户端来完成远程服务的拉取: 

@Service
@RequiredArgsConstructor //推荐restTemplate以构造方法导入,这个注解仅构造final修饰的成员属性
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
    private final RestTemplate restTemplate;

    //用discoveryClient客户端完成服务的拉取
    private final DiscoveryClient discoveryClient;

    private void handleCartItems(List<CartVO> vos) {
        // TODO 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
        // 2.查询商品
        List<ItemDTO> items = itemClient.queryItemByIds(itemIds);

        //  2.1根据服务名称获取服务的实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
        if(CollUtils.isEmpty(instances)){
            return ;
        }
        //  2.2手写负载均衡,从实例列表中挑选实例
        ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));

        //  2.3利用RestTemplate发起http请求,得到http的响应
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                serviceInstance.getUri() + "/items?{ids}",
                HttpMethod.GET,
                null,
                //写集合泛型的class,因为new的对象可以拿到泛型,随后用反射就可以拿到对象的数据类型返回值
                new ParameterizedTypeReference<List<ItemDTO>>() {},
                Map.of("ids",CollUtils.join(itemIds,","))//集合拼接
        );
        //  2.4解析响应
        if(!response.getStatusCode().is2xxSuccessful()){
            //查询失败,直接结束11
            return ;
        }
        List<ItemDTO> items = response.getBody();
        if (CollUtils.isEmpty(items)) {
            return;
        }
        // 剩余操作...
    }
}

3.常见错误以及解决方案:

  • 无法连接到 Nacos 服务器

    • 检查 Nacos 是否启动,并确保端口号 8848 未被占用。
    • 如果是集群模式,检查集群节点的状态。
  • 服务无法注册到 Nacos

    • 检查 application.yml 中的服务名是否正确。
    • 确保网络连接正常,且服务能访问到 Nacos。
  • 配置未刷新

    • 检查是否在 Controller 中添加了 @RefreshScope 注解。
    • 检查是否已触发 /actuator/refresh 端点。

总结:

Nacos 是一款功能强大的工具,集成了服务注册与发现配置管理动态 DNS等功能,非常适合微服务架构。通过与 Spring Boot 的深度集成,开发者可以轻松地使用 Nacos 管理微服务的生命周期和配置,提升系统的灵活性可维护性。所以我们可以通过使用Nacos来轻松的管理微服务模块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2213869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

邀你一起共建谷歌封号申诉共享库

大家好&#xff0c;我是牢鹅&#xff01;相信很多老粉是通过谷歌封号的三篇文章《聊聊「谷歌8.3」账号封禁解析与应对思路 》和《聊聊谷歌「高风险」封号问题解析与应对思路》、《聊聊这半年来&#xff0c;谷歌为何频繁封号&#xff1f;》关注牢鹅的&#xff0c;在这将近半年的…

架构设计笔记-13-层次式架构设计理论与实践

目录 知识要点 综合知识 案例分析 1.SSM框架 2.MVC模式&#xff0c;XML 3.MVC架构脆弱性 4.容器技术的优势 5.对象关系映射ORM技术 知识要点 一般来说&#xff0c;架构可以分为表现层、中间层和持久层三个层次。 表现层&#xff1a;表现层主要负责接收用户的请求&…

【论文翻译】TITAN:用于交通流量预测的异构专家混合模型

题目A TIME SERIES IS WORTH FIVE EXPERTS: HETEROGENEOUS MIXTURE OF EXPERTS FOR TRAFFIC FLOW PREDICTION论文链接https://arxiv.org/pdf/2409.17440源码地址https://github.com/sqlcow/TITAN&#xff08;作者说论文被接受后&#xff0c;代码将更新&#xff09; 摘要 准确的…

API项目4:开发SDK

面临另一个问题 作为开发者&#xff0c;每次调用接口都需要自己生成时间戳&#xff0c;编写签名算法&#xff0c;生成随机数等等&#xff0c;这些都是相当繁琐的工作。 因此&#xff0c;要想办法让开发者能够以最简单的方式调用接口。开发者只需要关心传递哪些参数以及他们的…

如何通过计算巢在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具&#xff0c;专为开发者构建定制的语言学习模型&#xff08;LLM&#xff09;应用而设计。 通过其拖放式界面&#xff0c;用户可以轻松创建和管理AI驱动的交互式应用&#xff0c;如聊天机器人和数据分析工具。 它基于Lang…

网站分享 | 六个插件搜索下载网站

网站分享&#xff1a; 今天分享几个搜索插件的网站。 &#x1f527; Chrome Web Store —— 官方插件库&#xff0c;选择最多 谷歌官方的 Chrome 插件商店&#xff0c;拥有丰富的插件供你选择。无论你是办公党、学生党&#xff0c;还是娱乐爱好者&#xff0c;这里都能找到提…

第 4 章:Vue 中的 ajax

1. 解决开发环境 Ajax 跨域问题 vue脚手架配置代理 原理图&#xff1a; 1.1 方法一 在vue.config.js中添加如下配置&#xff1a; devServer:{proxy:"http://localhost:5000" // 这个5000 是请求目标的端口号 }说明&#xff1a; 优点&#xff1a;配置简单&…

杰理AC632N---发射功率问题

AC632N的发射功率SDK默认0dbm左右&#xff0c;在实际做产品时&#xff0c;如果使用SDK默认的发射功率&#xff0c;则测试到的发射功率达不到规格书上面的8dbm. 查看代码流程发现SDK中修改发射功率的文职如下&#xff1a; 修改到level 10 则是最大功率8dbm , 使用频谱仪可以测得…

OpenAI 最新发布的 o1 模型在 ARC-AGI-Pub 数据集上的测试结果与分析

在过去的24小时内&#xff0c;我们有幸获得了 OpenAI 新发布的 o1-preview 和 o1-mini 模型的使用权限。这些模型经过特别训练&#xff0c;旨在模拟推理过程&#xff0c;并在给出最终答案之前给予更多时间生成和修正推理步骤。 成百上千的人都在问&#xff0c;o1 在 ARC 奖项上…

linux线程 | 线程的控制(一)

前言&#xff1a;本节内容为线程的控制。在本篇文章中&#xff0c; 博主不仅将会带友友们认识接口&#xff0c; 使用接口。 而且也会剖析底层&#xff0c;带领友友们理解线程的底层原理。 相信友友们学完本节内容&#xff0c; 一定会对线程的控制有一个很好的把握。 那么&#…

Gin框架官方文档详解03:HTML渲染

官方文档&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;强烈建议没用过Gin的读者先阅读第一节&#xff1a;第一个Gin应用。 目录 一、简单渲染二、使用不同目录下名称相同的模板三、自定义模板渲染器四、自定义分隔符五、自定义模板函数六、总结 一、简单渲染 …

数通--5

一、链路聚合 背景&#xff1a;带宽不够&#xff0c;加线&#xff0c;但是stp判断是环路&#xff0c;阻塞&#xff0c;等于没加线。通过链路聚合解决&#xff08;如果我把千兆换成万兆&#xff0c;老子有钱任性的话&#xff0c;没得说&#xff09; 现在我要的不是备份而是带宽…

电能表预付费系统-标准传输规范(STS)(4)

5.4 TokenCarrier 到 MeterApplicationProcess 的数据流 The flow of data from the TokenCarrier to the MeterApplicationProcess is shown in Figure 4.此数据流见图 4。 图 4 TokenCarrier 到 MeterApplicationProcess 的数据 The token entry process from the TokenCarr…

抢单超卖? 并发问题解决思路

1. 问题介绍 在用户抢单或者商品售卖的过程中&#xff0c;正常情况下是一人一件&#xff0c;但是当网络流量剧增时多个用户同时抢到一个商品应该如何分配&#xff1f;假设这样一个场景A商品库存是100个&#xff0c;但是秒杀的过程中&#xff0c;一共卖出去500个A商品。对于卖家…

AXI GPIO按键控制——ZYNQ学习笔记4

一、AXI GPIO接口简介 是什么&#xff1f;是PL部分的一个IP软核&#xff0c;实现通用输入输出接口的功能&#xff0c;并通过AXI协议实现与处理系统通信&#xff0c;方便控制与拓展GPIO接口。 AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。 与 PS 端的 GPIO 不同&…

【YOLO系列】YOLO11原理和深入解析——待完善

文章目录 前言一、主要新增特性二、主要改进2.1 C3K2网络结构2.2 C2PSA网络结构2.3 Head部分 三、对比与性能优势四、X-AnyLabeling4.1 目标检测&#xff1a;4.2 实例分割&#xff1a;4.3 图像分类&#xff1a;4.4 姿态估计&#xff1a;4.5 旋转目标检测&#xff1a; 五、总结 …

Vue+Vant实现7天日历展示,并在切换日期时实时变换

效果图&#xff1a; 主要使用 moment.js 插件完成 HTML部分 <div class"day-content"><div class"day-content-t"><div>{{ monthVal }}</div><div click"onCalendar()">更多>></div></div><…

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…

【C++】二叉搜索树的概念与实现

目录 二叉搜索树 概念 key类型 概念 代码实现 key_value类型 概念 代码实现 二叉搜索树 概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: 左子树的值默认小于根节点&#xff0c;右子树的值默认大于根节点 。 ⼆…

具备技术三:通用类型any实现

一、背景 一个连接必须拥有请求接收与解析的上下文。 上下文的结构不能固定&#xff0c;因为服务器支持的协议很多&#xff0c;不同协议有不同的上下文结构&#xff0c;所以必须拥有一个容器保存不同的类型结构数据。 二、设计思路 目标&#xff1a;一个容器保存各种不同数…