当前位置: 首页 > news >正文

Nacos基本应用

Nacos 基本应用

Nacos 提供了 SDK 和 OpenAPI 方式来完成服务注册与发现等操作,SDK 实际上是对于 http 请求的封装。

微服务架构的电子商务平台,其中包含订单服务、商品服务和用户服务。可以使用 Nacos 作为服务注册和发现的中心,以便各个微服务可以相互发现和调用。

首先在 Nacos 中注册订单服务、商品服务和用户服务的实例。每个微服务会向 Nacos 注册自己的服务名和实例信息,包括 IP 地址和端口号。 当订单服务需要调用商品服务时,它可以通过 Nacos 的服务发现功能获取商品服务的实例列表。然后,订单服务可以根据负载均衡策略选择一个商品服务的实例进行调用。 另外当用户服务需要调用订单服务时,它也可以通过 Nacos 的服务发现功能获取订单服务的实例列表。然后用户服务可以根据负载均衡策略选择一个订单服务的实例进行调用。

通过使用 Nacos,可以实现微服务之间的动态调用和发现,提高系统的可伸缩性和可扩展性。此外 Nacos 还提供了配置管理和服务路由等功能,可以进一步优化和管理微服务架构。很明显使用 Nacos 可以简化微服务架构的管理和调用,提高系统的可靠性和可维护性。

windows 下安装简单,下载后解压到任意不包含中文内容的路径位置,在 conf/application.properties 中可以配置服务端口号,默认端口号为 8848。

bin/startup.cmd -m standalone 即可启动 nacos 服务器,参数 m 就是模式的含义,nacos 有单机和集群启动不同的模式

http://localhost:8848/nacos 即可访问服务,默认密码是 nacos/nacos

服务注册:

首先在父工程中添加 spring-cloud-alibaba 的管理依赖<dependencyManagement>

spring-cloud-alibaba-denpendencies pom import

dependencyManagement 元素提供了一种管理依赖版本号的方式。在 dependencyManagement 元素中声明所依赖的 jar 包的版本号等信息,那么所有子项目再次引入此依赖 jar 包时则无需显式的列出版本号。Maven

会沿着父子层级向上寻找拥有dependencyManagement元素的项目,然后使用它指定的版本号。

添加客户端依赖:spring-cloud-starter-alibaba-nacos-discovery

application.yml 中添加 nacos 服务的地址 spring.cloud.nacos.discovery.server-addr=localhost:8848,默认值实际上就是 localhost:8848

服务消费:

@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;

专门负责服务注册和发现的,可以通过它获取到注册到注册中心的所有服务

List<ServiceInstance> instances = discoveryClient.getInstances("nacos-service");
Random r=new Random();
ServiceInstance si=instances.get(r.nextInt(instances.size()));
String str = restTemplate.getForObject("http://" + si.getHost() + ":" + si.getPort()     +"/test/hello?name=" + name, String.class);
String url = serviceInstance.getUri().toString();
Product p=restTemplate.getForObject(url+"/product/"+pid,Product.class);

通过 restTemplate 调用商品微服务

将一个服务多次启动,在启动配置中设置端口号

在这里插入图片描述

对应 VM 配置:设置端口号

在这里插入图片描述

每个 SpringCloud 服务器启动后向注册中心注册本服务器信息,如服务别名、服务器 IP、端口号等,其他服务进行请求时先根据服务别名从注册中心获取到目标服务器 IP 和端口号,并将获取到的信息缓存到本地,然后通过本地使用 HttpClient 等技术进行远程调用。

在这里插入图片描述

Nacos 服务注册发现步骤

1、服务提供者将注册信息写入到 Nacos 注册中心的服务注册表中

2、服务注册中心将服务提供者的实例交给服务持有容器 Service Holder 处理,服务实例将会挂载在 ServiceHolder 的空间下

3、服务注册成功后,提供者将与服务中心维持心跳,未能及时发送心跳的服务将会被剔除

4、服务发现支持两种场景

  • 消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况

  • List<ServiceInstance> serviceInstances = discoveryClient.getInstances("hello-service");

    服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的

服务注册

1、微服务在启动时,将自己的网络地址等信息注册到服务发现组件 nacos server 中,服务发现组件会存储这些信息。

2、各个微服务与服务发现组件使用一定机制通信,在一定的时间内发送心跳包。服务发现组件若发现与某微服务实例通信正常则保持注册状态(up 在线状态)、若长时间无法与某微服务实例通信,就会自动注销(即删除)该实例

3、服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口。

4、当微服务网络地址发生变更(例如实例增减或者 IP 端口发生变化等)时,会重新注册到服务发现组件。

负载均衡 loadbalance

可以利用 DiscoveryClient 实现客户端的数据拉取和负载均衡,但是处理过程需要自行编码实现,重复编码就是一个问题。事实上编码没有这么麻烦,可以使用 Ribbon 组件或者 Springcloud loadbalance 组件实现的。

List<ServiceInstance> serviceInstances = discoveryClient.getInstances("hello-service");
Random r=new Random();
ServiceInstance instance = serviceInstances.get(r.nextInt(serviceInstances.size()));

负载均衡 Load Balance 就是将用户的请求平均的分配到多个服务上,从而达到系统的高可用,它是一种算法,可以通过该算法实现从地址列表中获取一个地址进行服务调用,LB 实现方式包含集中式(在消费者和服务提供方中间使用独立的代理方式进行负载均衡)和进程内(根据自己的请求情况做负载均衡)两种。

Nginx 服务器负载均衡,客户端所有请求都会交给 Nginx,然后 Nginx 实现转发请求,属于集中式实现负载均衡;Ribbon 本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到本地,从而在本地实现 RPC 远程服务调用,属于进程内实现负载均衡。

依赖:spring-cloud-starter-loadbalancer,需要添加 alibaba 和 cloud

RestTemplate 的生成方法上添加@LoadBalanced 注解

@LoadBalanced 是标识注解,用于告知系统这里的请求应该通过负载均衡组件进行拦截和处理。实际上是通过实现了 ClientHttpRequestInterceptor 接口的 LoadBalancerInterceptor 实现拦截的,可以在 intercept 方法上添加断点查看源码

@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate(); }
@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/say")public String say(@RequestParam(required = false) String name) {String ss = restTemplate.getForObject("http://provider-service/hello?name={0}", 
String.class, name);ss = "{ConsumerController}---" + ss;return ss; }
}

在这里插入图片描述

相关文章:

Nacos基本应用

Nacos 基本应用 Nacos 提供了 SDK 和 OpenAPI 方式来完成服务注册与发现等操作&#xff0c;SDK 实际上是对于 http 请求的封装。 微服务架构的电子商务平台&#xff0c;其中包含订单服务、商品服务和用户服务。可以使用 Nacos 作为服务注册和发现的中心&#xff0c;以便各个微…...

UML的类图规则

public:号 private:-号 protected:#号类图多重关系&#xff1a; 泛化关系&#xff1a; 概念&#xff1a;也就是继承关系。表示方式&#xff1a;用带空心三角形的直线来表示。例子&#xff1a;动物和猫&#xff0c;人和老师关联关系&#xff1a; 概念&#xff1a;用于表示一类对…...

uniapp实现微信小程序长按二维码扫码加群或好友

<template><view><view class"tit">欢迎扫码加入</view><image show-menu-by-longpress"true" src"/static/img/qrcode/1.jpg" class"btn-icon" click"previewImage"></image></vie…...

轮转数组(每日一题)

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 ☕今日份刷题&#xff1a;轮转数组 题目链接&#xff1a;轮转数组 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入…...

jmeter使用步骤

jmeter 使用步骤 1&#xff0c;进入jmeter目录中的bin目录&#xff0c;双击jmeter.bat 打开 2&#xff0c;右键test plan 创建线程组 3&#xff0c;配置线程组参数 4&#xff0c;右键刚刚创建的线程组&#xff0c;创建请求&#xff0c;填写请求地址 5&#xff0c;需要携带to…...

Ts中泛型的理解与使用

一、什么是泛型 在定义函数&#xff0c;定义接口或定义class类的时候&#xff0c;不先规定其类型&#xff0c;在使用的时候进行定义类型。 二、使用 1、定义函数&#xff1a; // 函数类型 function AA<T>(arg:T):T{return arg } AA<number>(1) AA<string>…...

uniapp使用eatchs雷达图

引入插件 <template><view class"page"><view class"AllBox"><view class"topTit">标题</view><view class"leftTit">对比分析</view><view class"tableBox"><view cl…...

PostgreSQL jsonb

PostgreSQL jsonb jsonb 函数以及操作符 在PostgreSQL中&#xff0c;有许多用于处理JSONB数据类型的内置函数和操作符。下面列出了一些常用的JSONB函数和操作符&#xff1a; jsonb_pretty(jsonb) 该函数将JSONB数据格式化为易读的多行字符串。jsonb_typeof(jsonb) 该函数返回…...

Spring系列四:AOP切面编程

文章目录 &#x1f497;AOP-官方文档&#x1f35d;AOP 讲解&#x1f35d;AOP APIs &#x1f497;动态代理&#x1f35d;初始动态代理&#x1f35d;动态代理深入&#x1f35d;AOP问题提出&#x1f4d7;使用土方法解决&#x1f4d7; 对土方法解耦-开发最简单的AOP类&#x1f4d7;…...

VS+Qt+C++旅游景区地图导航源码实例

程序示例精选 VSQtC旅游景区地图导航 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQtC旅游景区地图导航>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。…...

回调函数和一般函数的区别

回调函数&#xff1a;不是我能控制的&#xff0c;通过外界信号触发调用&#xff0c;例如下面是chatter 一般函数&#xff1a;我能控制的&#xff0c;顺序调用...

使用vite创建Vue/React前端项目,配置@别名和Sass样式,又快又方便

Vite官方网站&#xff1a;Vite | 下一代的前端工具链 Vite 并不是基于 Webpack 的&#xff0c;它有自己的开发服务器&#xff0c;利用浏览器中的原生 ES 模块。这种架构使得 Vite 比 Webpack 的开发服务器快了好几个数量级。Vite 采用 Rollup 进行构建&#xff0c;速度也更快…...

从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

目录 从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树 题目链接 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返…...

【JS常见数据结构】

JS数据结构 前言数组JavaScript 中数组的常见操作&#xff1a;1. 创建数组&#xff1a;2. 访问数组元素&#xff1a;3. 插入元素&#xff1a;4. 删除元素&#xff1a;5. 查询元素&#xff1a; 链表单向链表双向链表循环链表 栈队列树二叉树示例 图图的定义图的分类图的表示方法…...

算法基础之插入排序

1、插入排序基本思想 插入排序的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-place排序&#xff08;即只需用到O(1)的额外空间的排序&#xff09;&a…...

InfoQ 分享

...

Jupyter Notebook 遇上 NebulaGraph,可视化探索图数据库

在之前的《手把手教你用 NebulaGraph AI 全家桶跑图算法》中&#xff0c;除了介绍了 ngai 这个小工具之外&#xff0c;还提到了一件事有了 Jupyter Notebook 插件: https://github.com/wey-gu/ipython-ngql&#xff0c;可以更便捷地操作 NebulaGraph。 本文就手把手教你咋在 J…...

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类&#xff0c;我们可以将事物或概念进行归类和组织&#xff0c;从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用&#xff0c;它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域&#xff0c;分类同…...

WEB安全-SQL注入,CSRF跨站伪造,OXX跨站脚本

SQL 注入攻击 SQL 注入是一种网络攻击手段&#xff0c;攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码&#xff0c;试图访问、篡改或删除数据库中的数据。这种攻击通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。 举个例子&#xff0c;例如&#xff0c;…...

【HDFS】客户端读某个块时,如何对块的各个副本进行网络距离排序?

本文包含如下内容: ① 通过图解+源码分析/A1/B1/node1和 /A1/B2/node2 这两个节点的网络距离怎么算出来的 ② 客户端读文件时,副本的优先级。(怎么排序的,排序规则都有哪些?) ③ 我们集群发现的一个问题。 客户端读时,通过调用getBlockLocations RPC 获取文件的各个块。…...

告别闪烁!用STM32CubeMX快速配置PWM+DMA驱动WS2812彩灯(F4系列实测)

告别闪烁&#xff01;用STM32CubeMX快速配置PWMDMA驱动WS2812彩灯&#xff08;F4系列实测&#xff09; 在嵌入式开发中&#xff0c;驱动WS2812彩灯往往需要精确的时序控制&#xff0c;传统软件延时方式不仅占用CPU资源&#xff0c;还容易因中断干扰导致灯光闪烁。本文将展示如何…...

技术从业者的面试技巧:如何通过大厂的技术面试

在软件行业的招聘生态中&#xff0c;大厂的技术面试如同一场严苛的专业试炼&#xff0c;尤其对于软件测试从业者而言&#xff0c;不仅要展现扎实的技术功底&#xff0c;更要体现出符合大厂标准的工程思维与问题解决能力。想要在竞争激烈的面试中脱颖而出&#xff0c;需要从面试…...

告别手动摆放!UE5.2+PCG插件:程序化实现枯木生蘑菇、岩石长苔藓的生态细节

UE5.2程序化生态细节&#xff1a;用PCG插件实现枯木生蘑菇的魔法 当游戏场景中的枯木自动长出蘑菇&#xff0c;岩石表面自然覆盖苔藓时&#xff0c;这种生态细节的呈现往往能让虚拟世界瞬间"活"起来。传统手动摆放的方式不仅耗时耗力&#xff0c;更难以实现自然生长的…...

2026年大模型内容精准收录实操,企业长效流量布局核心方法论

引言&#xff1a;大模型正在成为企业品牌认知的新前置入口。当越来越多用户绕过搜索引擎、直接向AI提问"哪家公司更适合""某个方案值不值得选"时&#xff0c;企业在AI回答中的位置、语气和引用来源&#xff0c;已经构成真实的竞争格局。本文将从大模型内容…...

ESP32-S2开发入门:用VSCode远程连接WSL,打造丝滑的嵌入式开发工作流

ESP32-S2开发环境优化&#xff1a;VSCode与WSL的高效协作方案 嵌入式开发工程师常面临跨平台协作的挑战——既需要Linux环境的强大工具链&#xff0c;又依赖Windows的图形界面友好性。本文将揭示如何通过VSCode远程连接WSL&#xff0c;构建一个无缝衔接的ESP32-S2开发环境&…...

K3s离线安装保姆级避坑指南:从镜像准备到集群验证(含Harbor私有仓库配置)

K3s离线安装全流程实战&#xff1a;从私有仓库搭建到集群高可用 在金融、军工、政务等对网络安全要求极高的领域&#xff0c;离线环境部署Kubernetes集群已成为刚需。作为轻量级Kubernetes发行版&#xff0c;K3s凭借其小于50MB的二进制体积和内置组件简化设计&#xff0c;成为隔…...

别再手动编译库了!一招永久设置Vivado全局Modelsim仿真环境

永久配置Vivado与Modelsim联调环境的终极方案 每次新建FPGA工程都要重新配置仿真工具路径和编译库文件&#xff1f;这种重复劳动不仅浪费时间&#xff0c;还容易因配置不一致导致仿真失败。本文将揭示一种被多数工程师忽略的"一劳永逸"配置方案&#xff0c;通过系统级…...

保姆级教程:STM32CubeMX配置ADC扫描模式,并封装一个灵活的Get_Adc()函数

STM32CubeMX实战&#xff1a;构建可动态配置的ADC多通道扫描系统 在嵌入式开发中&#xff0c;ADC&#xff08;模数转换器&#xff09;的灵活配置一直是硬件工程师面临的常见挑战。许多开发者在使用STM32CubeMX配置多通道ADC时&#xff0c;往往止步于基础扫描模式的应用&#xf…...

开题不是写作文,是做设计——百考通AI助你交出一份真实可行的研究蓝图

开题报告是毕业论文或学位研究的“第一道学术关卡”&#xff0c;它不仅需要明确“研究什么”“为何研究”&#xff0c;更要清晰规划“如何研究”。然而&#xff0c;许多学生在撰写过程中常因经验不足而陷入困境&#xff1a;选题空泛、问题意识薄弱、文献综述缺乏主线、研究方法…...

小白程序员必备:从零基础到大模型实战,这份学习路线图请收藏!

本文结合530名开发者的经验&#xff0c;为AI初学者提供从零基础到项目实战的完整学习路线。核心内容包括&#xff1a;Python编程、数学基础、机器学习、深度学习框架&#xff08;PyTorch&#xff09;、科学计算库&#xff08;NumPy&#xff09;等关键技能&#xff0c;并避开了常…...