白话文实战Nacos(保姆级教程)
前言
上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。
注册中心
如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册上去,这些微服务是集群化启动的,在多台机器都有,也都应该注册到注册中心。这样注册中心就会保存一个微服务和它所在的机器清单列表,某一天订单服务想要调用商品服务,就先要问一下注册中心这些商品服务在哪些机器上,注册中心会给它返回服务器列表,这样订单服务就可以随便挑一台机器,发起远程调用,这个过程就是服务发现。
注册中心的两个核心功能就是服务注册和服务发现。
Nacos安装
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
-
官网
https://nacos.io/docs/next/quickstart/quick-start/ -
下载安装
-
下载版本:
直接下载解压即可: -
启动命令
切换到bin目录,cmd中输入启动命令即可
startup.cmd -m standalone
启动成功后我们可以访问nacos:
http://localhost:8848/nacos
重要的两个功能,一个是配置管理,就是作为配置中心,另外一个是服务管理,就是作为注册中心。
注册中心-服务注册
服务注册流程如下:
我们来到创建好的项目中进行服务注册测试,先以订单服务为例,先启动这个微服务,由于每个微服务都是springboot的web应用,而我们最大的项目cloud-demo已经继承了springboot,所以每个微服务也是springboot应用,我们只需要在微服务pom文件中导入web依赖,来开发web项目即可。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
由于要把自己注册到注册中心,所以还要导入alibaba-nacos-discovery依赖,但是我们在services中已经做了公共导入,它下面的每个模块默认都有这个依赖了:
<!-- 服务发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
来到service-order模块来启动微服务,需要先编写一个主程序(OrderMainApplication):
springboot主程序需要的第一个注解叫@SpringBootApplication,代表它是一个springboot应用:
package com.example.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}
}
启动之前先编写一下配置文件:
这个写好后,就可以启动微服务进行测试,看看能不能把自己注册到注册中心:
来到nacos注册中心:
可以看到service-order实例数为1,健康实例数为1,说明注册到nacos了。
同样把service-product也注册上来。端口用9000:
只要每个服务配置了nacos地址,只要启动了,就会自动连上nacos注册自己。而且我们从启动日志也能看到
来到nacos服务列表中查询:
那再注册中心注册的微服务都是什么东西呢?可以点进详情查看,其实就是微服务的名字以及其所在服务的ip和端口:
我们现在看到的实例数都是1,是因为我们是单机模式,代表之启动了一个微服务,如果启动多个效果是什么呢?我们可以在本机通过启动不同端口的方式模拟一个集群。
同理为了查看效果,我们把商品模块复制两份进行启动,端口分别为9001和9002,然后把所有微服务全部启动
这样我们就在本机通过不同端口模拟启动一个集群,当我们所有服务都启动完成后:
我们去nacos服务列表查询:
这样服务注册的功能,我们就测试通过了,其实非常简单,只要引入了nacos-discovery依赖,配置了nacos地址,项目启动自己就会注册到注册中心,而注册中心保存的就是所有服务的可以访问的ip和对应的端口列表。
注意:测试期间cmd窗口不能关闭,否则相当于nacos服务就没有运行。
注册中心-服务发现
想要通过代码获取到注册中心中注册的所有微服务以及所在机器的ip地址和端口列表,可以通过下面流程进行:
以商品服务为例,先标注开启服务发现功能注解
package com.example.product;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient // 开启服务发现功能
@SpringBootApplication
public class ProductMainApplication {public static void main(String[] args) {SpringApplication.run(ProductMainApplication.class, args);}
}
编写一个测试类来测试一下服务发现的api如何使用,测试类的包名要和主程序的包名一样:
要写单元测试,首先得在项目中导入测试依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
测试类代码:
package com.example.product;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;import java.util.List;@SpringBootTest
public class DiscoveryTest {@AutowiredDiscoveryClient discoveryClient;@Testvoid discoveryClientTest() {for (String service : discoveryClient.getServices()) {System.out.println(service);// 获取ip+portList<ServiceInstance> instances = discoveryClient.getInstances(service);for (ServiceInstance instance : instances) {System.out.println(instance.getHost() + ":" + instance.getPort());}}}
}
运行测试代码:
除了使用DiscoveryClient,nacos组件也提供了叫做NacosServiceDiscovery,用哪个都可以,唯一的区别就是DiscoveryClient是Spring家族的规范,无论你用哪个注册中心,都可以用它的api,而NacosServiceDiscovery是引入nacos时用的api
package com.example.product;import com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery;
import com.alibaba.nacos.api.exception.NacosException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;import java.util.List;@SpringBootTest
public class DiscoveryTest {@AutowiredNacosServiceDiscovery nacosServiceDiscovery;@Testvoid nacosServiceDiscoveryTest() throws NacosException {for (String service : nacosServiceDiscovery.getServices()) {System.out.println(service);// 获取ip+portList<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);for (ServiceInstance instance : instances) {System.out.println(instance.getHost() + ":" + instance.getPort());}}}
}
这两个api仅作为了解,我们要进行远程调用,第一步就是要服务发现,但是服务发现后来要封装成自动化的过程,无需我们调用底层代码。我们要做的仅仅就是在每个微服务中引入@EnableDiscoveryClient注解,因为微服务之间可能要互相调用,因此在每个微服务中服务发现功能是必备的。
注册中心-编写微服务api
上面我们测试了服务发现功能,基于它可以实现微服务之间的调用,基本流程就是:
我们模拟一个场景来实现上面的流程:
我们来编码实现上面的业务流程,我们先来编写商品服务,由于远程调用都是发起http请求,所以我们在商品服务里面编写一个controller。这controller可以按照商品id查询商品:
这里由于要写javabean类,需要用到Lombok,每个模块都要用,所以这里在services模块的pom中添加lombok依赖:
我们这里就快速简单生成controller、service、bean
代码如下:
Product类:
package com.example.product.bean;import lombok.Data;import java.math.BigDecimal;@Data
public class Product {private Long id;private BigDecimal price;private String productName;private int num;
}
ProductController类:
package com.example.product.controller;import com.example.product.bean.Product;
import com.example.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {@AutowiredProductService productService;// 查询商品@RequestMapping("/product/{id}")public Product getProduct(@PathVariable("id") Long productId) {
相关文章:

白话文实战Nacos(保姆级教程)
前言 上一篇博客 我们创建好了微服务项目,本篇博客来体验一下Nacos作为注册中心和配置中心的功能。 注册中心 如果我们启动了一个Nacos注册中心,那么微服务比如订单服务,启动后就可以连上注册中心把自己注册上去,这过程就是服务注册。每个微服务,比如商品服务都应该注册…...

7. 基于DeepSeek和智谱清言实现RAG问答
课件链接:https://cloud.189.cn/t/VNvmyimY7Vna(访问码:e4cb)天翼云盘是中国电信推出的云存储服务,为用户提供跨平台的文件存储、备份、同步及分享服务,是国内领先的免费网盘,安全、可靠、稳定、…...

【数据结构】双向链表(真正的零基础)
链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过指针的链接来实现的!在上篇我们学习了单向链表,而单向链表虽然空间利用率高,插入和删除也只需改变指针就可以达到!但是我们在每次查找、删除、访问..…...

【生产变更】- Oracle RAC添加配置ipv6地址
【生产变更】- Oracle RAC添加配置ipv6地址 一、概述二、环境检查及备份2.1 检查并备份系统层面IP配置2.2 检查并备份监听配置2.3 检查并备份网卡配置2.4 检查并备份/etc/hosts三、集群层面配置3.1 检查集群配置3.2 停止集群组件3.3 Bond0网卡设置3.4 /etc/hosts文件配置3.5 重…...

Ai无限免费生成高质量ppt教程(deepseek+kimi)
第一步:打开deepseek官网(DeepSeek) 1.如果deepseek官网网络繁忙,解决方案如下: (1)使用easychat官网(EasyChat)使用deepseek模型,如图所示: (2)本地部署&…...

python全栈-python基础
python基础 文章目录 python基础python入门基础概念序列列表元组 -- 不可变序列字典字典的本质集合 控制语句选择结构 - 条件判断结构循环结构zip()推导式 函数及原理参数LEGB规则 面向对象私有属性和私有方法面向对象的特征重写__str__()方法super获得父类的定义特殊方法和运算…...

Python 鼠标轨迹 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...

力扣 零钱兑换
完全背包,动态规划例题。 题目 这题跟完全背包跟完全平方数有点相似。在完全平方数中,用一个dp数组去取得目标金额的每一步的最优,当前状态可能来自上一个dp,也有可能比上一个dp更小,因此往回退一步加一做比较。在完全…...

C# OpenCV机器视觉:OSTU算法实现背景差分的自适应分割
在一个热闹的科技公司里,阿强是一个负责图像分析的员工。他的日常工作就是从各种复杂的图像中提取出有用的信息,可这可不是一件轻松的事情哦 最近,阿强接到了一个艰巨的任务:要从一堆嘈杂的监控图像中分离出运动的物体,…...

快速搭建 Elasticsearch 8 集群:零基础实战与升级注意事项
引言 随着大数据技术的飞速发展,Elasticsearch 成为许多应用场景中不可或缺的技术,它以其高效的全文搜索引擎和分布式存储架构在企业和个人项目中占据了一席之地。无论是在日志分析、实时搜索还是数据可视化中,Elasticsearch 都发挥着重要的作用。 在这篇文章中,我们将为…...

基于扑克牌分发效果制作时的问题总结
其基本效果如图 1. 在overlay模式下直接使用position来移动 实现代码 public class Card : MonoBehaviour {public RectTransform target;public Button cardButton;private bool isPack false;public List<RectTransform> cards new List<RectTransform>(…...

老榕树的Java专题:Redis 从入门到实践
一、引言 在当今的软件开发领域,数据的高效存储和快速访问是至关重要的。Redis(Remote Dictionary Server)作为一个开源的、基于内存的数据结构存储系统,因其高性能、丰富的数据类型和广泛的应用场景,成为了众多开发者…...

【玩转 Postman 接口测试与开发2_019】第15章:利用 Postman 初探 API 性能测试(含实战截图)
《API Testing and Development with Postman》最新第二版封面 文章目录 第十五章 API 接口性能测试1 性能负载的类型2 Postman 负载配置3 Postman 性能测试实战3.1 Fixed 型负载下的性能测试3.2 基于数据驱动的 Postman 接口性能测试 4 性能测试的注意事项 写在前面 终于来到了…...

在 Qt 开发中,可以将 QML 封装成库
在 Qt 开发中,可以将 QML 封装成库,以便在多个项目中复用 QML 组件或模块。下面通过一个简单的例子说明如何将 QML 封装成库并在其他项目中使用。 1. 创建 QML 库项目 首先,我们创建一个新的 Qt 项目,专门用于封装 QML 组件。假…...

换电脑了如何快速导出vscode里的插件
当你换电脑了,之前vscode里的插件又不想全部手动重装,那么恭喜你,刷到了这篇文章。 1. 将 VSCode 添加到系统路径 macOS 打开 VSCode。按下 Command Shift P 打开命令面板。 3。 输入 Shell Command: Install ‘code’ command in PATH …...

点大商城V2-2.6.6源码全开源uniapp +搭建教程
一.介绍 点大商城V2独立开源版本,版本更新至2.6.6,系统支持多端,前端为UNiapp,多端编译。 二.搭建环境: 系统环境:CentOS、 运行环境:宝塔 Linux 网站环境:Nginx 1.21 MySQL 5.…...

9 Pydantic复杂数据结构的处理
在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构&#…...

springboot+redis实现将树形结构存储到redis
1.pom配置redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.yml文件配置: spring:redis:database: 0host: 1.1.1.1port: 6379timeout:…...

6、使用one-api管理统一管理大模型,并开始使用本地大模型
文章目录 本节内容介绍集中接入:将大模型统一管理起来当使用了大模型代理大模型代理示例 开源模型:如何使用Hugging Face上的模型modelscope使用 pipeline 调用模型用底层实现调用模型流式输出 如何在项目中使用开源模型使用 LangChain使用集中接入开始使…...

Windows安装Lyx
Lyx介绍 LyX 是一个基于 LaTeX 的可视化编辑器,可以让在不编写 LaTeX 代码的情况下使用 LaTeX 的排版功能。 需要依赖Latex环境,如Tex live 或者 MiKTeX Lyx 官网 Lyx官网 安装包下载 点击download默认进入最新版本下载界面 在Recent News/ News里可选…...

一文讲透大模型部署工具ollama--结合本地化部署deepseek实战
Ollama 是一个开源的人工智能平台,专注于在本地高效运行大型语言模型(LLMs)。通过 Ollama,开发者可以在自己的机器上运行多种大规模语言模型,而不必依赖于云端服务。它支持对大模型的管理和本地化部署,并且…...

网络防御高级
接口配置: SW2: [sw2]vlan 10 [sw2]vlan 20 [sw2]interface GigabitEthernet 0/0/1 [sw2-GigabitEthernet0/0/1]port link-type trunk [SW2-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [sw2]interface GigabitEthernet 0/0/2 [sw2-GigabitEthernet0/0/…...

使用PyCharm进行Django项目开发环境搭建
如果在PyCharm中创建Django项目 1. 打开PyCharm,选择新建项目 2.左侧选择Django,并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一: 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…...

如何定义“破坏环境”
当我们谈论破坏环境时,通常会从人类活动对自然生态造成负面影响的角度来定义。例如,大规模的森林砍伐、工业污染排放、温室气体增加等,都是典型的破坏环境的行为。我们常常看到这些行为导致了生态系统的破坏、物种灭绝、气候变化等问题&#…...

现代前端开发的演进与未来趋势:从工具革新到技术突破
在过去的十年中,前端开发经历了翻天覆地的变化。从最初的静态页面到如今复杂的单页应用(SPA),从手动操作 DOM 到基于虚拟 DOM 的高效渲染,从前端“三剑客”(HTML/CSS/JS)到全栈框架的兴起&#…...

活动预告 |【Part1】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识
课程介绍 通过参加“Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中,你将获得所需的安全技能和培训,以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知识…...

idea Ai工具通义灵码,Copilot我的使用方法以及比较
我用过多个idea Ai 编程工具,大约用了1年时间,来体会他们那个好用,以下只是针对我个人的一点分享,不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot,我用它来干…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter8-对象、类与面向对象编程
八、对象、类与面向对象编程 ECMA-262 将对象定义为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的 值。对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值。正因为如此(以及其他还未讨论的原因)&…...

介绍下SpringBoot常用的依赖项
Spring Boot 是一个用于快速开发 Spring 应用程序的框架,它通过自动配置和依赖管理简化了开发过程。以下是一些 Spring Boot 项目中常用的依赖项: 1. Spring Boot Starter Web 作用: 用于构建 Web 应用程序,包括 RESTful 服务。依赖项: spr…...

深度解析策略模式:从理论到企业级实战应用
一、策略模式的本质:面向接口的算法工厂 策略模式(Strategy Pattern)是行为型设计模式的典型代表,其核心思想是将算法族抽象为独立对象,使其能够相互替换。这种模式完美体现了以下面向对象设计原则: 开闭原…...