SpringCloud之Nacos的学习、快速上手

1、什么是Nacos

Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案,用来实现配置中心和服务注册中心。

Nacos 快速开始

2、安装运行nacos

nacos下载地址

下载地址: https://github.com/alibaba/nacos/releases
zip为Windows压缩包        tar.gz为linux压缩包

个人百度网盘分享链接:https://pan.baidu.com/s/1RTNA0Gx5chpyb-HXCOuJuw?pwd=8848 
提取码:8848 

下载解压后运行nacos    进入bin目录  执行下面命令即可        -m为启动模式,设置为单机模式运行

startup.cmd -m standalone

如果不想每次输入-m standalone可以右键startup.cmd使用文本打开修改配置即可

这样我们只需要双击startup.bat文件即可自动在单机模式下运行nacos

默认端口8848        

浏览器访问localhost:8848/nacos即可进入nacos控制台        账号密码默认都是nacos

3、Nacos注册中心的使用

将微服务注册到nacos

准备了两个微服务分别是订单微服务商品微服务

需要引入的依赖为

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

3.1在application.yml文件中需要配置服务名称和nacos连接地址        

注意:服务名称不能重复        服务名称不能没有

重复则nacos视为一个服务        没有nacos扫描不到则服务列表不显示

spring:application:name: product-servicecloud:nacos:discovery:server-addr: localhost:8848

3.2在启动类是加上注解@EnableDiscoveryClient(不加也可以)

@SpringBootApplication
@EnableDiscoveryClient
public class OrderServer {public static void main(String[] args) {SpringApplication.run(OrderServer.class,args);}
}

启动两个微服务

观察nacos控制台在服务列表可以看到刚刚启动的两个微服务

4、Nacos注册中心的原理

Nacos将服务可以分为服务消费者服务提供者        

在我的项目中现在有订单和商品微服务,在订单服务中需要调用商品服务查询商品信息

则可以将订单微服务称为服务消费者,将商品微服务称为服务提供者

4.1服务注册流程:

1、product-service服务向nacos注册中心进行服务注册,同时对nacos上现有的已经存在的服务进行服务拉取,并将拉取到的服务列表缓存到本地列表

2、注册成功后定时向nacos发送心跳,告诉nacos这个服务正常运行

3、同时,order-service服务也执行上述操作,注册服务、拉取服务、缓存服务到本地、定时发送心跳

 4.2服务怎么从注册中心获取呢

@RestController
@Slf4j
public class NacosController {//注入服务发现接口@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("test")public void test(){//获取服务名称为product-service的服务,得到的是一个List的实例集合//因为有可能有多个实例List<ServiceInstance> instances = discoveryClient.getInstances("order-service");//获取第一个实例,也就是获取的实例列表中的第一个实例ServiceInstance serviceInstance = instances.get(0);//获取这个实例的端口int port = serviceInstance.getPort();//获取这个实例的访问地址String host = serviceInstance.getHost();log.info("获取服务名为order-service的第一个服务:{}",serviceInstance);log.info("获取服务名为order-service的第一个服务port:{}",port);log.info("获取服务名为order-service的第一个服务host:{}",host);}
}

我们对这个接口进行访问

4.3对接口进行调用

在需要调用的服务的启动类上加上@Bean交给Spring管理

@SpringBootApplication
public class OrderServer {public static void main(String[] args) {SpringApplication.run(OrderServer.class,args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

然后在我们的order-service业务中进行调用

@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {@Autowiredprivate OrderDao orderDao;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@Overridepublic void createOrder(Long productId,Long userId) {log.info("接收到{}号商品的下单请求,接下来调⽤商品微服务查询此商品信息",productId);//远程调⽤商品微服务,查询商品信息List<ServiceInstance> instances = discoveryClient.getInstances("product-service");ServiceInstance serviceInstance = instances.get(0);int port = serviceInstance.getPort();String host = serviceInstance.getHost();Product product = restTemplate.getForObject("http://" + host + ":" + port + "/product/" + productId, Product.class);log.info("查询到{}号商品的信息,内容是:{}", productId,JSON.toJSONString(product));}
}

我们写一个方法执行上面的逻辑即可

@RestController
@Slf4j
public class OrderController {@Autowiredprivate IOrderService orderService;@RequestMapping("/save")public void order(Long pid,Long uid){return orderService.createOrder(pid, uid);}
}

当我们访问这个接口后,查看控制台

已经成功调用商品服务

当然这样服务调用很麻烦,所以后面我们会使用openfeign替换

4.4当nacos检测到某个服务出现问题

此时我们查看nacos控制台

两个服务都正常

当我们停掉product-service服务        当大概十五秒后查看nacos可以看到商品服务成为了不健康实例        这是因为nacos十五秒没有收到这个服务发送的心跳就认为这个服务是不健康的

再大概过十五秒        发现商品服务已经没有了,这是因为nacos超过三十秒没有感知到这个服务,则这个服务则会被Nacos剔除。

4.5关闭Nacos服务会怎么样

当Nacos意外停止时,还能调用服务吗

我们将商品服务和订单服务重新都启动起来

这时候我们关闭Nacos的控制台

这时候我们访问localhost:8848/nacos已经访问不到了,但是此时我们调用服务会怎么样呢?

我们继续调用刚才的/save方法

可以看到仍然获取到了商品信息,即调用到了商品服务的接口

这是因为当nacos关闭时,但是本地缓存的依然存在(在上面我们说了每次获取到服务列表后会将服务列表缓存到本地),所以才能仍然获取到这个实例的信息并进行调用。

但是当我们关闭商品服务后,测试获取商品服务的实例

@RestController
@Slf4j
public class NacosController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("test")public void test(){List<ServiceInstance> instances = discoveryClient.getInstances("product-service");ServiceInstance serviceInstance = instances.get(0);int port = serviceInstance.getPort();String host = serviceInstance.getHost();log.info("获取服务名为product-service的第一个服务:{}",serviceInstance);log.info("获取服务名为product-service的第一个服务port:{}",port);log.info("获取服务名为product-service的第一个服务host:{}",host);}
}

访问test接口

可以看到即使商品服务关闭了,但是仍能获取到商品服务的实例,这是因为缓存到本地之后,没有了nacos的推送更新,导致只从缓存中获取实例信息,就会导致我们后面业务调用异常

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树&#xff0c;并命名为“stm32mp157d-atk”。 和“TF-A移植”有关的知识点&#xff1a; 1)设备树英文名字叫做Device tree&#xff0c;用来描述板子硬件信息的&#xff0c;比如开发板上的 CPU有几个核 、每个CPU核主频是多少&#xff0c;IIC、…

使用 MinIO 和 PostgreSQL 简化数据事件

本教程将教您如何使用 Docker 和 Docker Compose 在 MinIO 和 PostgreSQL 之间设置和管理数据事件&#xff0c;也称为存储桶或对象事件。 您可能已经在利用 MinIO 事件与外部服务进行通信&#xff0c;现在您将通过使用 PostgreSQL 自动化和简化数据事件管理来增强数据处理能力…

【C++】STL 算法 - 累加填充算法 ( 元素累加算法 - accumulate 函数 | 元素填充算法 - fill 函数 )

文章目录 一、元素累加算法 - accumulate 函数1、函数原型分析2、代码示例 二、元素填充算法 - fill 函数1、函数原型分析2、代码示例 一、元素累加算法 - accumulate 函数 1、函数原型分析 在 C 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 accu…

2024 年最佳 PDF 编辑器:我的首选清单

在我们日益多设备、跨平台的世界中&#xff0c;PDF 可能比以往任何时候都更有用。有大量免费的 PDF 阅读器可让您审阅和评论这些文件&#xff0c;但不可避免地&#xff0c;您需要具有编辑 PDF 的能力。这通常需要升级到高级 PDF 编辑器。 Adobe Acrobat 是最著名的&#xff0c…

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr&#xff0c;求 min(b) 的总和&#xff0c;其中 b 的范围涵盖 arr 的每个&#xff08;连续&#xff09;子数组。由于答案可能很大&#xff0c;因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…

Unity3D学习之Unity基础——3D数学

文章目录 1. 前言2 Mathf和Math基础2.1 一般用于只计算一次的函数2.1.1 PI Π PI2.1.2 取绝对值 Abs2.1.3 向上取整 CeilToInt2.1.4 向下取整 FloorToInt2.1.5 钳制函数 Clamp2.1.6 获取最大值 Max2.1.7 获取最小值 Min2.1.8 一个数的n次幂 Pow2.1.9 四舍五入 RoundToInt2.1.10…

苹果Find My可查找添加32件物品,伦茨科技ST17H6x芯片加速产品赋能

苹果最近更新的支持文档证实&#xff0c;从 iOS 16 开始&#xff0c;"Find My"可查找添加物品从16件增加到32件&#xff0c;AirTag 和“查找”网络中的物品利用“查找”网络的强大功能来发挥作用&#xff0c;这个网络由数亿台加密的匿名 Apple 设备构成。“查找”网络…

【Unity】AB包下载

【Unity】AB包下载 1.使用插件打AB包 a.AB包分类 一般地&#xff0c;将预制体作为AB包资源&#xff0c;不仅需要对预制体本身进行归类&#xff0c;还要对其涉及的动画&#xff08;AnimationClip&#xff09;、动画状态机&#xff08;AnimatorController&#xff09;、以及所…

golang学习笔记——http.Handle和http.HandleFunc的区别与type func巧妙运用

文章目录 http.Handle和http.HandleFunc的区别http.Handle分析type func巧妙运用 http.HandleFunc分析总结参考资料 http.Handle和http.HandleFunc的区别 http.Handle和http.HandleFunc的区别体现了Go语言接口的巧妙运用 下面代码启动了一个 http 服务器&#xff0c;监听 808…

Android学习之路(22) 从模块化到组件化

从模块化到组件化 一、从模块化到组件化 Android 应用项目 , 都存在一个应用模块 ( Application Module ) , 在 build.gradle 构建脚本中 , 第一个插件配置 com.android.application , 表明 该 Module 编译打包后的输出是 APK 安装包 ; 该项目可以直接运行 ; plugins {id co…

基础+常用的数据结构

基础 java基础 JDK 和 JRE JDK&#xff0c;它是功能齐全的 Java SDK&#xff0c;是提供给开发者使用&#xff0c;能够创建和编译 Java 程序的开发套件。它包含了 JRE,同时还包含了编译 java 源码的编译器 javac 以及一些其他工具比如 javadoc&#xff08;文档注释工具&#…

AI 的未来是开源的

想象一下&#xff0c;在未来&#xff0c;人工智能不会被锁在公司的金库里&#xff0c;而是由全球创新者社区一砖一瓦地在开放中构建的。协作&#xff0c;而不是竞争&#xff0c;推动进步&#xff0c;道德考虑与原始绩效同等重要。这不是科幻小说&#xff0c;而是人工智能发展核…

代码随想录 Leetcode1047. 删除字符串中的所有相邻重复项

题目&#xff1a; 代码(首刷自解 2024年1月21日&#xff09;&#xff1a; class Solution { public:string removeDuplicates(string s) {if (s.size() < 2) return s;stack<char> t;for (int i 0; i < s.size(); i) {if (t.empty()) t.push(s[i]);else {if (s[i…

广和通AI解决方案“智”赋室外机器人迈向新天地!

大模型趋势下&#xff0c;行业机器人将具备更完善的交互与自主能力&#xff0c;逐步迈向AI 2.0时代&#xff0c;成为人工智能技术全面爆发的重要基础。随着行业智能化&#xff0c;更多机器人应用将从“室内”走向“室外”&#xff0c;承担更多高风险、高智能工作。复杂的室外环…

使用easyexcel 导出多级表头demo

先看效果&#xff1a; 1、引入maven依赖 <!--EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency> 2、实体类 package com.…

【算法练习Day50】下一个更大元素II接雨水

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 下一个更大元素II接雨水单调…

应用层—HTTPS详解(对称加密、非对称加密、密钥……)

文章目录 HTTPS什么是 HTTPSHTTPS 如何加密HTTPS 的工作过程对称加密非对称加密 HTTPS 什么是 HTTPS HTTPS 也是一个应用层的协议。是在 HTTP 协议的基础上引入的一个加密层。 由来&#xff1a;HTTP 协议内容都是按照文本的方式明纹传输&#xff0c;这就导致在传输过程中出现…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

GaussDB数据库中的MERGE INTO介绍

一、前言 二、GaussDB MERGE INTO 语句的原理概述 1、MERGE INTO 语句原理 2、MERGE INTO 的语法 3、语法解释 三、GaussDB MERGE INTO 语句的应用场景 四、GaussDB MERGE INTO 语句的示例 1、示例场景举例 2、示例实现过程 1&#xff09;创建两个实验表&#xff0c;并…

css-盒子等样式学习

盒子居中&#xff0c;继承外层盒子的宽高 兼容性&#xff08;border-box&#xff09;将边框收到盒子内部 初始化div 不用管box-setting content-box 还原 创建为一个类 &#xff0c;让所有需要还原的类 进行继承 padding 用法表示margin上下左右边距 body 外边距&…