SpringCloud之Nacos的学习、快速上手

news2024/9/22 4:06:25

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-service
  cloud:
    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 {

    //注入服务发现接口
    @Autowired
    private 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);
    }
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

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

@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {

    @Autowired
    private OrderDao orderDao;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Override
    public 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 {
    @Autowired
    private 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 {

    @Autowired
    private 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.coloradmin.cn/o/1398406.html

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

相关文章

go语言(一)----声明变量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

【C++ 记忆站】内联函数

文章目录 一、概念二、特性1、inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段,会用函数体替换函数调用2、inline对于编译器而言只是一个建议若一个函数代码很长则编译器不会将它变成内联3、一般来说,函数代码在10行及以内时这时编译器会将它优化为…

将 SQL Server 2022 数据库备份到 MinIO

Microsoft 在将 S3 连接器和 Polybase 添加到 SQL Server 2022 时取得了重大飞跃。因此&#xff0c;企业可以利用他们保存到对象存储中的大量数据&#xff0c;并使用它来丰富 SQL Server 表。他们还可以利用对象存储来备份 SQL Server&#xff0c;这是开放性和云原生灵活性的又…

通达信主图指标修改为文华公式源码

最近有几位朋友说只用过通达信的软件&#xff0c;咨询有没有通达信指标&#xff0c;我做期货一直是用文华的软件&#xff0c;今天有一位炒股的朋友拿着通达信的指标源码让帮忙修改成文华的&#xff0c;经过他同意分享给大家。 这位朋友是用于辅助股票技术分析&#xff0c;建议做…

【llm 微调code-llama 训练自己的数据集 一个小案例】

这也是一个通用的方案&#xff0c;使用peft微调LLM。 准备自己的数据集 根据情况改就行了&#xff0c;jsonl格式&#xff0c;三个字段&#xff1a;context, answer, question import pandas as pd import random import jsondata pd.read_csv(dataset.csv) train_data data…

深度解析 Compose 的 Modifier 原理 -- DrawModifier

" Jetpack Compose - - Modifier 系列文章 " &#x1f4d1; 《 深入解析 Compose 的 Modifier 原理 - - Modifier、CombinedModifier 》 &#x1f4d1; 《 深度解析 Compose 的 Modifier 原理 - - Modifier.composed()、ComposedModifier 》 &#x1f4d1; 《 深入解…

牛客小白月赛86 解题报告 | 珂学家 | 最大子数组和变体 + lazy线段树动态区间树

前言 整体评价 终于回归小白月赛的内核了&#xff0c;希望以后也继续保持&#xff0c;_. A. 水盐平衡 思路: 模拟 题目保证没有浓度相等的情况 盐度 a/b&#xff0c; c/d 的比较关系 演变为 ad, bc 两者的大小关系 #include <bits/stdc.h>using namespace std;int …

【北京】买套二手房需要多少钱?

上次我们看了苏州和上海的二手房&#xff0c;这次我们一起来看下北京的二手房价格如何。 数据来源 数据来自贝壳二手房&#xff0c;每个区最多获取了3千条房源信息&#xff0c;数据共计4万条左右 对数据感兴趣的朋友&#xff0c;公众号后台发送北京二手房获取数据文件 各区房…

面试之Glide如何绑定Activity的生命周期

Glide绑定Activity生命周期 Glide.with() 下面都是它的重载方法&#xff0c;Context&#xff0c;Activity&#xff0c;FragmentActivity, Fragment, android.app.Fragment fragment,View都可以作为他的参数&#xff0c;内容大同小异&#xff0c;都是先getRetriever&#xff0…

【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、简介二、成员函数三、使用示例四、C模拟实现五、std::shared_ptr的线程安全问题六、总结温馨提示 引言 在 C 动态内存管理中&#xff0c;除了 auto_ptr 和 unique_ptr 之外&#xff0c;还有一种智能指针 shared_ptr&#xff0c;它可以让多个指针共享同一个动…

关于大模型学习中遇到的3

来源&#xff1a;网络 Embedding模型 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…

STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键 代码 #include "stm32f4xx.h" #include "GT9147.h" #include "Touch.h" #include "C_Touch_I2C.h" #include "usart.h" #include "delay.h" #include "LCD.h" #incl…

HarmonyOS 页面跳转控制整个界面的转场动画

好 本文 我们来说 页面间的转场动画 就是 第一个界面到另一个界面 第一个界面的退场和第二个界面的进场效果 首先 我这里 创建了两个页面文件 Index.ets和AppView.ets index组件 编写代码如下 import router from "ohos.router" Entry Component struct Index {b…

视频监控需求记录

记录一下最近要做的需求&#xff0c;我个人任务还是稍微比较复杂的 需求&#xff1a;需要实现一个视频实时监控、视频回放、视频设备管理&#xff0c;以上都是与组织架构有关 大概的界面长这个样子 听着需求好像很简单&#xff0c;但是~我们需要在一个界面上显示两个厂商的视…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟&#xff0c;引脚&#xff0c;将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

我们应该了解的⽤户画像

当我们谈⽤户画像时&#xff0c;到底在谈什么 对于互联⽹公司来说&#xff0c;企业的增⻓、内容、活动、产品等⼯作基本上都是围绕着“⽤户”来做的&#xff0c;可以说都是在做“⽤户运营”这个⼯作&#xff0c;⽽⽤户画像是⽤户运营⼯作中⾮常重要的⼀环 ⽤户画像的主要特征是…

Linux命令手册

简介 Multics&#xff08;大而全&#xff09;项目失败&#xff0c;吸取教训启动Unix&#xff08;小而精&#xff09;&#xff0c;Linus Benedict Torvalds受Unix启发开发初始版本Linux内核&#xff0c;Git也由其开发&#xff0c;目的是为了更好的管理Linux内核开发。Unix是商业…

Windows如何部署TortoiseSVN客户端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130&#xff0c;总分380顺利考上哈尔滨工程大学&#xff0c;一年的努力终于换来最后的录取&#xff0c;期中复习有得有失&#xff0c;以下总结一下自己的复习经历&#xff0c;希望对大家有帮助&#xff0c;天道酬勤&#xff0c;加油&#xff01;专业课&…

Java找二叉树的公共祖先

描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节…