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; }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/58865.html

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

相关文章

链式二叉树统计结点个数的方法和bug

方法一&#xff1a; 分治&#xff1a;分而治之 int BTreeSize1(BTNode* root) {if (root NULL) return 0;else return BTreeSize(root->left)BTreeSize(root->right)1; } 方法二&#xff1a; 遍历计数&#xff1a;设置一个计数器&#xff0c;对二叉树正常访问&#…

protobuf 2定义string常量

背景 protobuf 2中定义的enum枚举值必须为数字类型&#xff0c;故不支持string类型&#xff0c;但有些业务场景又确实需要定义string常量。 目标 在protobuf 2中定义string常量。 方案 思路&#xff1a;通optional default实现string常量。 细节&#xff1a; 1、protobu…

论文浅尝 | 面向多步推理任务专业化较小语言模型

笔记整理&#xff1a;张沈昱&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://github.com/FranxYao/FlanT5-CoT-Specialization 动机 本文的动机是探索如何在多步推理任务中通过大型语言模型提升较小的语言模型的性能。作者认为&#xff0…

AVS3:跨多通道预测PMC

前面的文章中介绍了TSCPM&#xff0c;它是AVS3中用于intra模式的跨通道预测技术&#xff0c;它利用线性模型根据亮度重建像素预测色度像素&#xff0c; 跨通道预测技术用于去除不同通道间的冗余信息&#xff0c;TSCPM可以去除Y-Cb、Y-Cr通道间的冗余&#xff0c;然而却忽略了…

什么是训练数据?

算法从数据中学习。算法从得到的训练数据中找到关系&#xff0c;形成理解&#xff0c;做出决策&#xff0c;并评估信心。训练数据越好&#xff0c;模型的表现就越好。 实际上&#xff0c;与算法本身一样&#xff0c;训练数据的质量和数量与数据项目的成功有很大关系。 现在&…

LeetCode150道面试经典题-删除有序数组中的重复项(简单)

1.题目 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…

libmpv使用滤镜处理视频进行播放

一、前言 作为一个功能强大的多媒体框架,libmpv为开发者提供了广泛的功能和灵活的控制权。滤镜是libmpv的一个重要特性,允许开发者对视频进行各种实时处理和增强,从而满足用户对于个性化、创意化和高质量视频体验的需求。 滤镜是一种在视频渲染过程中应用特定效果的技术。…

【计算机网络】TCP协议超详细讲解

文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…

记录一次electron打包提示文件找不到的解决方法

没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…

解析隧道代理被封的几个主要原因

Hey&#xff0c;各位爬虫高手&#xff0c;你是不是经常遇到爬虫代理HTTP被封的问题&#xff1f;不要慌&#xff0c;今天我来分享一些信息&#xff0c;帮你解析这个问题&#xff01;告别封禁&#xff0c;让你的爬虫工作更顺利&#xff0c;赶快跟随我一起了解吧&#xff01; 在爬…

auto-changelog的简单使用

auto-changelog的简单使用 自动化生成Git提交记录&#xff0c;CHANGELOG.md文件 github&#xff1a;https://github.com/cookpete/auto-changelog 安装 npm install -g auto-changelog配置脚本 package.json文件下 "scripts": {"changelog": "aut…