微服务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 # 设置为非临时实例

在这里插入图片描述

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

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

相关文章

链表的归并排序-LeetCode(Python版)

双指针归并排序&#xff01;图解排序链表&#xff01;-知乎 class ListNode(object):def __init__(self, val0, nextNone):self.val valself.next nextclass Solution(object):def find_mid(self, head): # 快慢指针slow, fast head, headwhile fast.next and fast.next.n…

linux 硬盘存储剩余容量自动化监控+报警通知

linux 硬盘存储剩余容量自动化监控报警通知 编写shell脚本 #!/bin/bash# 获取系统存储大小&#xff08;单位为GB&#xff09; storage_size$(df -h / | awk NR2 {print $4} | sed s/G//)# 阈值&#xff08;小于10GB触发报警&#xff09; threshold10# 钉钉机器人 Webhook UR…

LabVIEW非接触式电阻抗层析成像系统

LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像&#xff08;NEIT&#xff09;技术以其无辐射、非接触、响应速度快的特点&#xff0c;为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统&#xff0c;实现了数据的在线采集及实时成像&#xff0c;提高…

代码随想录算法训练营第四十四天|139.单词拆分、56.携带矿石资源

139.单词拆分 思路&#xff1a;将字符串s看作为背包容量&#xff0c;从字符串中获取物品&#xff0c;刚好满足背包容量的过程&#xff0c;因为可以从字符串中多次取值&#xff0c;相当于物品的数量是不限制&#xff0c;这就是一个完全背包的问题&#xff01;这个题有个关键点&a…

Python中的windows路径问题

在Python中处理Windows路径时,经常会遇到一些特殊的问题。这主要是因为Windows和大多数其他操作系统(如Linux和macOS)使用不同的路径分隔符。在Windows中,路径使用反斜杠(\)作为分隔符,而在其他操作系统中,路径使用正斜杠(/)作为分隔符。 以下是在Python中处理Windo…

Java SE:多线程(Thread)

1. 线程两个基本概念 并发&#xff1a;即线程交替运行多个指令并行&#xff1a;即多个线程同时运行指令 并发并行不矛盾&#xff0c;两者可同时发生&#xff0c;即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1&#xff1a;* 1. 创建thread类的…

mybatis plus 深入学习 【Base Mapper】的方法 【IService】的方法

mybatis plus 深入学习 常见注解 1.TableName 描述&#xff1a;表名注解&#xff0c;标识实体类对应的表使用位置&#xff1a;实体类 TableName("sys_user") public class User {private Long id;private String name;private Integer age;private String email;…

【Linux系统化学习】信号的保存

目录 阻塞信号 信号处理常见方式概览 信号的其他相关概念 在内核中的表示 sigset_t 信号集操作函数 sigprocmask函数 sigpending函数 信号的捕捉 内核如何实现信号的捕捉 sigaction函数 可重入函数 volatile 阻塞信号 信号处理常见方式概览 当信号来临时&#x…

c++算法入门教程(2)

C是一种功能强大且广泛应用的编程语言&#xff0c;对于想要深入学习编程和算法的人来说&#xff0c;掌握C是一个重要的里程碑。本文将带你逐步了解C编程的基础知识&#xff0c;并介绍一些常见的算法和编程技巧帮你入门c算法。 ​在c算法入门教程(1) 中&#xff0c;我讲解了什么…

GEE:使用Sigmoid激活函数对单波段图像进行变换(以NDVI为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上,对任意单波段影像进行 Sigmoid 变换的代码。并以对 NDVI 影像像素值的变换为例。 文章目录 一、Sigmoid激活函数1.1 什么是 Sigmoid 激活函数1.2 用到遥感图像上有什么用?二、代码链接三、完整代码一…

查询每个会话使用内存大小(DM8达梦数据库)

DM8达梦数据库查询每个会话使用内存大小 1 环境介绍2 查询每个sql会话使用内存大小3 达梦数据库学习使用列表 1 环境介绍 在某些环境数据库内存增长到服务器内存用完,发生OOM事件,可以分析sql会话使用内存大小; 2 查询每个sql会话使用内存大小 --创建SQL会话占用内存记录表 …

共享栈的C语言实现

共享栈&#xff1a;所谓共享栈就是为了节省空间&#xff0c;让两个栈共享一片连续的存储空间&#xff0c;两个栈从这片连续的共享空间的两端向中间扩充自己的存储空间&#xff0c;设这片存储空间的大小为maxSize&#xff0c;采用栈顶指针始终指向当前栈顶元素的方式来实现共享栈…

简单认识算法的复杂度

时间复杂度与空间复杂度 1.算法的复杂度 ​ 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 ​ 时间复杂度主要衡量一个算法…

MYSQL02高级_目录结构、默认数据库、表文件、系统独立表空间

文章目录 ①. MySQL目录结构②. 查看默认数据库③. MYSQL5.7和8表文件③. 系统、独立表空间 ①. MySQL目录结构 ①. 如何查看关联mysql目录 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

前端src中图片img标签资源的几种写法?

在 Vue 项目中引用图片路径有几种不同的方法&#xff0c;具体取决于你的项目结构和配置。以下是几种常见的方式&#xff1a; 1. 静态资源目录 (Public) 如果你的图片放在了项目的 public 目录下&#xff08;例如&#xff0c;Vite 和 Create Vue App 脚手架工具通常使用这个目…

05 OpenCV图像混合技术

文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1&#xff1a;输入图像Mat …

2024年【广东省安全员A证第四批(主要负责人)】考试试卷及广东省安全员A证第四批(主要负责人)作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试试卷根据新广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员A证第四批&#x…

钉钉机器人发送折线图卡片 工具类代码

钉钉机器人 “创建并投放卡片 接口 ” 可以 发送折线图、柱状图 官方文档&#xff1a;创建并投放卡片 - 钉钉开放平台 0依赖、1模板、2机器人放到内部应用、3放开这个权限 、4工具类、5调用工具类 拼接入参 卡片模板 自己看文档创建&#xff0c;卡片模板的id 有用 0、依赖…

Springboot项目中定时任务的四种实现方式

文章目录 1. 使用Scheduled注解1.1 时间间隔执行1.2 固定时间点执行 2. 使用EnableScheduling注解启用定时任务3. 实现SchedulingConfigurer接口4. 使用Quartz框架4.1 配置QuartzScheduler4.2 定义Job类和Trigger类 5. 总结 在开发现代应用时&#xff0c;定时任务是一个非常常见…

地图可视化绘制 | R-ggplot2 NC地图文件可视化

在推出两期数据分享之后&#xff0c;获取数据的小伙伴们也知道&#xff0c;数据格式都是NetCDF(nc) 格式网格数据&#xff0c;虽然我在推文分享中说明使用Python、R或者GIS类软件都是可以进行 处理和可视化绘制的&#xff0c;但是&#xff0c;还是有小伙伴咨询使用编程软件Pyth…