微服务day02-Ribbon负载均衡与Nacos安装与入门
一.Ribbon负载均衡
在上一节中,我们通过在RestTemplte实例中加上了注解 @LoadBalanced,表示将来由RestTemplate发起的请求会被Ribbon拦截和处理,实现了访问服务时的负载均衡,那么他是如何实现的呢?
1.1 Ribbon负载均衡的原理

Ribbon实现负载均衡的流程如上图所示,order-service需要请求user-service的服务,根据user-service在eureka注册中心的注册的服务名称是userservice,order-service直接使用usersivce作为“IP地址+端口号”进行访问,发起了请求http:userservice/user/1,然后Ribbon会收到该请求,于是访问eureka注册中心拉取userservice所有的服务列表,然后负载均衡访问中的一个。

具体的Ribbon的负载均衡实现原理如上图所示:
- 1.order-service发送的请求会被LoadBalancerInterceptor负载均衡拦截器拦截
- 2.由RibbonLoadBanlancerClient获取url中的服务id(就是你注册的服务名称)userservice
- 3.将该服务id交给DynamicServerListLoadBalancer,从eureka注册中心中拉取服务列表,并根据IRule选择一个负载均衡的策略,比如随机调度,轮询调度等选择某个服务。
- 4.将该服务返回给RibbonLoadBanlacnedClient
- 5.RibbonLoadBanlacnedClient修改url并发起请求。
1.2 Ribbon负载均衡的策略
有多种负载均衡的策略,默认是轮询,如果想要自己修改负载均衡的策略,需要在对应的服务中(该服务访问其他服务)进行配置.
方式一
代码方式,在比如order-service的application中提供一个定义一个新的IRule,该方式是全局配置,只要配置之后,无论是在order-service中调用哪个微服务,都会执行该负载均衡的策略;
/*** 代码方式配置负载均衡策略* @return*/@Beanpublic IRule randomRule(){return new RandomRule();}
方式二
配置yml方式,局部配置,配置某一个微服务的访问时的负载均衡的策略。
# 配置某个服务的负载均衡策略
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡的策略
1.3 Ribbon饥饿加载
首先,明确什么是懒加载与饥饿加载?
懒加载(Lazy Loading)是一种延迟加载数据或资源的策略,它通常在需要时才加载数据,而不是在初始化时就立即加载。这个概念在软件开发中经常被用来提高性能和减少资源消耗。
“饥饿加载”(Eager Loading)是一种加载数据或资源的策略,它与懒加载相对。在饥饿加载中,数据或资源在初始化或启动时就被加载,而不管是否立即需要使用。
Ribbon默认是采用懒加载,即第一次访问时才会创建LoadBanlacnedClient,因此第一次请求的时间会很长,但之后就好了(因为加载好的内容会被缓存到内存中)。
修改Ribbon的加载方式为饥饿加载,于是便会在项目启东时就创建LoadBanlacnedClient,降低第一次访问的耗时,通过配置的方式开启饥饿加载。
# 配置饥饿加载
ribbon:eager-load:enabled: true
二.Nacos安装与入门
Nacos(全称为"Dynamic Naming and Configuration Service")是阿里巴巴开源的一款服务发现、配置管理和服务管理平台。它可以帮助开发者轻松构建云原生应用,实现动态服务发现、服务注册与配置管理,并提供服务治理、流量管理等功能。
2.1 认识Nacos
Nacos也是服务注册中心,但是相对Eureka有着更加丰富的功能,且在国内更受欢迎。
2.2 安装Nacos
当前使用的Nacos的版本是1.4.1,直接解压安装包即可。可以在nacos/conf目录下的application.properties文件中修改端口号信息,默认是8848(8848钛金手机,成功男人的标志)。
2.3 启动Nacos
进入Nacos安装目录下的bin目录,输入命令:
startup.cmd -m standalone
启动成功截图,然后按住ctrl+点击启动地址即可启动


登陆的默认账号和密码都是nacos,登陆成功页面

2.4 Nacos快速入门
由于Nacos是后续加入的,所以父工程spring-cloud的依赖并不包含之,需要在父工程中额外加入Nacos管理依赖。
1.修改依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
将user-service,order-service中的原来eureka客户端依赖注释掉,修改为nacos客户端依赖。
<!-- nacos客户端依赖包 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.修改配置文件
注释掉user-service,order-service的eureka服务注册信息的配置

在spring相关配置中添加:
cloud:nacos:server-addr: localhost:8848 # nacos服务地址
然后启动即可,nacos与eureka的其他代码都相同,只需要修改配置文件和导入依赖即可。修改之后直接启动各个服务,随后各个服务会被注册到nacos注册中心之中,如下图所示:

2.5 Nacos服务分级存储模型
Nacos还引入了服务集群的概念,在一个服务可以包含多个实例的同时(这点与eureka相同),每个实例还会有一个隶属的集群,比如北京集群,上海集群,广州集群,深圳集群,在一个服务需要调用另一个服务时应该尽可能的调用本地集群的服务,这样速度更快,延迟更低。
为服务实例配置集群属性
spring:cloud:nacos:discovery:cluster-name: HZ # 集群名称
配置好之后,启动user-service,user-service(1);
然后再修改集群名称为另一个:
spring:cloud:nacos:discovery:cluster-name: SH # 集群名称
再启动user-service(2).
此时user-service,user-service(1);会被部署到hz集群,user-service(2)会被部署到sh集群.

2.6 NacosRuler负载均衡
决定负载均衡的策略完全是由IRule决定的,当前order-service使用的是随机负载均衡策略
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡的策略
那么并不会按照集群本地访问优先的规则进行访问。所以修改负载均衡策略为NacosRule,优先选择本地集群,本地集群内使用随机方式访问。
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡的策略
配置之后,会优先访问同集群内服务user-service(hz集群)

user-service(1)(hz集群)

user-service(2)(sh集群)

当停掉HZ服务之后,只剩下SH服务:

仍能访问成功,但是order-service控制台会给出一个警告信息,提醒这是一个跨越集群的访问:

2.7 NacosRuler负载均衡的权重设置
当出现不同机器需要承担不同比例的请求时,就不能单纯的按照优先本地集群,集群内随机的方式负载均衡了。需要配置权重。直接在Nacos控制台配置权重即可,配置的权重通常是0-1之间,当某个服务的权重为0时,表示该服务不会被任何用户访问(可以用于不停服更新,丝滑过渡等场景)。

2.8 NacosRuler负载均衡的权重设置
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做外层隔离。

namespace可以用于隔离开发环境,生产环境,测试环境等。
通过nacos控制台新建一个命名空间dev

可以看到,新建的命名空间dev中没有任何服务。

如果要修改服务所在命名空间,需要在代码中修改对应的服务yml配置文件。
spring:cloud:nacos:discovery:namespace: d3811bbe-1b14-449f-b984-85bdbcdf16dd # 命名空间ID
添加上述代码到order-service中,重启order-service服务,刷新nacos控制台,发现public命名空间中只剩下一个user-service;

命名空间dev中却有了order-service

此时由于二者位于不同的命名空间,二者便无法再相互访问…
2.9 Nacos与Eureka注册中心的比较
二者访问服务的逻辑基本一致。
区别一:服务提供者的健康检测
Nacos分为临时实例和非临时实例,二者的健康检测是不同的,临时实例的健康检测同Eureka,每隔30s向nacos注册中心报告一次状态(心跳检测),如果nacos注册中心在一定时间内未收到临时实例的报告,会直接认为该服务已经挂掉了,将该服务直接从列表中剔除。而非临时实例则是nacos主动询问目标服务,即使非临时服务挂掉了,nacos注册中心也不会把非临时实例从列表中剔除,而是会等着该服务,等着该服务回复健康。

区别二:服务消费者的获取服务方式不同
eureka的服务消费者只通过定时拉取服务的方式拉取服务列表pull,由于是定时拉取,因此当服务列表更新时,可能更新之后的服务获取不及时。
nacos的服务消费者不仅通过定时拉取服务的方式拉取服务列表pull,同时加入主动推送变更消息的机制push,这样当服务变更时可以及时的提醒服务消费者。

设置临时实例/非临时实例
默认为临时实例,在修改配置之后变为非临时实例。
spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例

相关文章:
微服务day02-Ribbon负载均衡与Nacos安装与入门
一.Ribbon负载均衡 在上一节中,我们通过在RestTemplte实例中加上了注解 LoadBalanced,表示将来由RestTemplate发起的请求会被Ribbon拦截和处理,实现了访问服务时的负载均衡,那么他是如何实现的呢? 1.1 Ribbon负载均衡的原理 Rib…...
深度学习-神经网络原理
文章目录 神经网络原理1.单层神经网络1.1 回归单层神经网络:线性回归1.2 二分类单层神经网络:sigmoid与阶跃函数 1.3 多分类单层神经网络:softmax回归 神经网络原理 人工神经网络(Artificial Neural Network,ANN&…...
Chat GPT:智能对话的下一步
Chat GPT:智能对话的下一步 介绍 Chat GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的强大对话模型,可以产生自然流畅的回答,并实现人机对话的感觉。本文将探讨Chat GPT在智能对话领域的影响和…...
[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):792 标注数量(xml文件个数):792 标注数量(txt文件个数):792 标注类别…...
RabbitMQ实战学习
RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…...
插混、油混、增程式、轻混、强混,啥区别
这里写自定义目录标题 随着我国新能源汽车的大力推进,电车可以说是世界未来的主流,只不过现在是处在一个过渡时代 这是个好时代,因为我们见证并体验着历史过渡的细节 这是个不好的时代,因为我们可能只是未来新新人类的试验品 帮他…...
React 模态框的设计(八)优化补充
在之前的弹窗的设计中,有两处地方现在做一点小小的优化,就是把_Draggable.jsx中的 onPointerEnter 事件 用 useLayoutEffect来规换,效果更佳,同样的,在_ModelContainer.jsx中也是一样。如下所示: _Draggabl…...
知识积累(三):深度学习相关概念(查看检索时看到)
文章目录 1. 知识蒸馏2. 可微搜索索引(DSI)参考资料 在找论文时,发现的相关概念。 1. 知识蒸馏 知识蒸馏(knowledge distillation)是模型压缩的一种常用的方法,不同于模型压缩中的剪枝和量化,知…...
计算机专业必看的几部电影
目录 编辑 1. 《第九区》(District 9,2009) 2. 《谍影重重》(The Bourne Identity,2002) 3. 《源代码》(Source Code,2011) 4. 《她》(Her,…...
工业人工智能需要注意的10件事
我们无法逃避人工智能这个风口,宣传人工智能软件的广告铺天盖地,似乎每个供应商都在推出最新的工具包,每天都有关于 ChatGPT、Bard 等新用例的文章。似乎全世界都在说:你现在需要人工智能! 人工智能确实正在成为自动化…...
软考-系统集成项目管理中级-信息系统建设与设计
本章重点考点 1.信息系统的生命周期 信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等。信息系统的生命周期可以分为四个阶段:立项、开发、运维和消亡。 2.信息系统开发方法 信息系统常用的开发方法有结构化方法、原型法、面向对象方法等 1)结构化方法 …...
C++从零开始的打怪升级之路(day39)
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于模板的知识点 1.非类型模板参数 模板参数分为…...
Java面试题之并发
并发 1.并发编程的优缺点?2.并发编程三要素?3.什么叫指令重排?4.如何避免指令重排?5.并发?并行?串行?6.线程和进程的概念和区别?7.什么是上下文切换?8.守护线程和用户线程的定义?9.什么是线程死锁?10.形成死锁的四个条件?11.怎么避免死锁?12.创建线程的四种方式?…...
Python GUI自动化定位代码参考
一、pyautogui原始逻辑 import pyautogui # 获取指定图片在屏幕上的位置 image_path path/to/image.png target_position pyautogui.locateCenterOnScreen(image_path) if target_position is not None: # 获取偏移量 offset_x 10 offset_y 10 # 计算实际点…...
11.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏接收网络数据包的操作
内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏发送数据的操作 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:8256eb53e8c16281bc1a29cb8d26d352bb5bbf4c 代…...
特斯拉一面算法原题
来自太空的 X 帖子 埃隆马斯克(Elon Musk)旗下太空探索技术公司 SpaceX 于 2 月 26 号,从太空往社交平台 X(前身为推特,已被马斯克全资收购并改名)发布帖子。 这是 SpaceX 官号首次通过星链来发送 X 帖子&a…...
【Leetcode每日一题】二分查找 - 山脉数组的峰顶索引(难度⭐⭐)(23)
1. 题目解析 Leetcode链接:852. 山脉数组的峰顶索引 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于找到题目中所说的峰值所在的下标并返回他们的下标即可。 2. 算法原理 峰顶及两侧数据特点分析 峰顶数据…...
Linux添加用户分组练习
一、复制/etc/skel目录为/home/tuser1(/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限)。 cp -a /etc/skel /home/tuser1 chown -R tuser1:tuser1 /home/tuser1 chmod -R 700 /home/tuser1 二、编辑/etc/group文件,添加组h…...
云快充充电桩系统设计书
充电桩系统设计书 一、系统设计概述 随着新能源汽车市场的快速发展,充电桩作为电动汽车的重要配套设施,其市场需求日益增长。本系统旨在提供一套稳定、高效、易用的充电桩解决方案,以满足市场上新能源充电桩的主流需求。通过实现云快充V1.6协…...
oracle DG 原理
在Oracle中,什么是DG?DG有哪些优缺点? DG(Data Guard,数据卫士)不是一个备份恢复的工具,然而,DG却拥有备份的功能,在物理DG下它可以和主库一模一样,但是它存…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
