当前位置: 首页 > 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 获取文件的各个块。…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...