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.hqwc.cn/news/418831.html

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

相关文章

【复现】Apache Solr信息泄漏漏洞_24

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Apache Solr是一个独立的企业级搜索应用服务器&#xff0c;它对外提供类似于Web-service的API接口。用户可以通过http请求&#x…

Spark面试题

1. spark core 1.简述hadoop 和 spark的不同点&#xff08;为什么spark更快&#xff09;♥♥♥ shuffle都是需要落盘的&#xff0c;因为在宽依赖中需要将上一个阶段的所有分区数据都准备好&#xff0c;才能进入下一个阶段&#xff0c;那么如果一直将数据放在内存中&#xff0c…

套接字通信(附带单线程TCP套接字通信代码)

套接字-Socket 1. 概念 1.1 局域网和广域网 局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09;是两种不同范围的计算机网络&#xff0c;它们用于连接多台计算机以实现数据共享和通信。 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

一键完成,批量转换HTML为PDF格式的方法,提升办公效率

在当今数字化的时代&#xff0c;HTML和PDF已经成为两种最常用的文件格式。HTML用于网页内容的展示&#xff0c;而PDF则以其高度的可读性和不依赖于平台的特性&#xff0c;成为文档分享和传播的首选格式。然而&#xff0c;在办公环境中&#xff0c;我们经常需要在这两种格式之间…

漏洞补丁修复之openssl版本从1.1.1q升级到1.1.1t以及python版本默认2.7.5升级到2.7.18新版本和Nginx版本升级到1.24.0

​ 一、Openssl升级 1、查看Openssl安装的版本 openssl version 2、查看Openssl路径 which openssl 3、上传openssl安装包到服务器:openssl-1.1.1t.tar.gz,并且解压,安装: mv /usr/local/openssl /usr/local/backup_openssl_1.1.1q_20240120 mkdir /usr/local/openssl tar…

AI日报:扎克伯格瞄准AGI通用人工智能

文章目录 Meta瞄准通用人工智能领域Meta的目标Meta的产品 FAIR移动和装载H100扎克伯格对人工智能竞争对手的真实动机持怀疑态度Meta抛弃了元宇宙吗&#xff1f; Meta瞄准通用人工智能领域 Meta首席执行官马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;在一份可能改变全…

2024.1.17 用户画像day02 - Elastic Search

目录 ES和数据库的类比 ELK集中日志协议栈介绍 ES的介绍 ES的架构 ES中的名词 ES中的角色 分片与副本的区别在于: MYSQL分库与分表: 倒排序索引: ES写入数据原理: ES读取、检索数据原理: 重点: ES 的架构 , ES读写的原理 ES和数据库的类比 关系型数据库非关系型数…

百度大脑 使用

百度大脑&#xff1a; 官方网址&#xff1a;https://ai.baidu.com/ 文档中心&#xff1a;https://ai.baidu.com/ai-doc 体验中心&#xff1a;https://ai.baidu.com/experience 百度大脑则是百度AI核心技术引擎&#xff0c;它包括基础层、感知层、认知层和安全&#xff0c;是百…

上门按摩系统的开发对于按摩行业有哪些意义

随着科技的迅猛发展&#xff0c;人们的生活水平逐渐提高&#xff0c;对健康与舒适的需求也日益增强。作为古老而又充满现代感的保健方式&#xff0c;按摩已受到广大民众的喜爱与接纳。然而&#xff0c;传统的按摩店往往需要顾客亲自上门&#xff0c;这对于忙碌的上班族或行动不…

ChatGPT时代对大数据应用的展望

前言&#xff1a; 2022年底&#xff0c;科技圈有个爆炸性新闻&#xff0c;ChatGPT的诞生&#xff0c;引发了世界范围内的震惊&#xff1b;人工智能在与人交流上有了划时代的技术突破&#xff0c;可以和人深入的理解交流&#xff0c;让许多公司和领域对这项技术有了更多遐想。对…