微服务day02-Ribbon负载均衡与Nacos安装与入门

news2024/9/20 20:32:49

一.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
     */
    @Bean
    public 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.coloradmin.cn/o/1481934.html

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

相关文章

(定时器/计数器)中断系统(详解与使用)

讲解 简介 定时器/计数器 定时器实际上也是计数器,只是计数的是固定周期的脉冲 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值…

[pdf]《软件方法》2024版部分公开-共196页

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 潘加宇《软件方法》2024版部分公开pdf文件&#xff0c;共196页&#xff0c;已上传CSDN资源。 也可到以下地址下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html 如果…

韦东山嵌入式Liunx入门驱动开发四

文章目录 一、异常与中断的概念及处理流程1-1 中断的引入1-2 栈(1) CPU实现a ab的过程(2) 进程与线程 1-3 Linux系统对中断处理的演进1-4 Linux 中断系统中的重要数据结构(1) irq_desc 结构体(2) irqaction 结构体(3) irq_data 结构体(4) irq_domain 结构体(5) irq_domain 结构…

T3SF:一款功能全面的桌面端技术练习模拟框架

关于T3SF T3SF是一款功能全面的桌面端技术练习模拟框架&#xff0c;该工具针对基于主场景事件列表的各种事件提供了模块化的架构&#xff0c;并包含了针对每一个练习定义的规则集&#xff0c;以及允许为对应平台参数定义参数的配置文件。 该工具的主模块能够执行与其他特定模…

BetterDisplay Pro for Mac v2.0.11激活版:屏幕显示优化专家

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版下载 &#x1f50d; 精准校准&#xf…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;3&#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍&#xff1a; DMI (趋向指标&#xff09; 用法 1.PDI线从下向上突破MDI线&#xff0c;显示有新多头进场&#xff0c;为…

vscode+remote突然无法连接服务器以及ssh连接出问题时的排错方法

文章目录 设备描述状况描述解决方法当ssh连接出问题时的排错方法 设备描述 主机&#xff1a;win11&#xff0c;使用vscode的remote-ssh插件 服务器&#xff1a;阿里云的2C2GUbuntu 22.04 UFIE 状况描述 之前一直使用的是vscode的remote服务&#xff0c;都是能够正常连接服务…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求&#xff0c;通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求&#xff0c;展现了其在实验研究中的经济性、可靠性和实用性&#xff0c;具有良好的推广价值。 项…

在学习云原生的时候,一直会报错ImagePullBackOff Back-off pulling image

在学习云原生的时候&#xff0c;一直会报错 &#xff08;见最后几张图&#xff09; ImagePullBackOff Back-off pulling image 然后我就在像。这个配置的镜像是不是可以自己直接下载&#xff0c;但是好像不怎么搜索得到 然后就在想&#xff0c;这个lfy_k8s_images到底是个啥玩…

TikTok矩阵系统功能怎么写?常用源代码是什么?

TikTok矩阵系统的功能是如何编写的?又有哪些常用的源代码支撑这些功能呢?本文将通过五段源代码的分享&#xff0c;为大家揭开TikTok矩阵系统的神秘面纱。 一、TikTok矩阵系统的核心功能 TikTok的矩阵系统涵盖了多个核心功能&#xff0c;包括但不限于用户管理、内容分发、推…

飞腾平台编译安装openGauss数据库

1. 环境检查 1.1 检查OS版本 openGauss支持的操作系统&#xff1a; CentOS 7.6&#xff08;x86_64 架构&#xff09;openEuler-20.03-LTS&#xff08;aarch64 架构&#xff09;openEuler-20.03-LTS&#xff08;x86_64架构&#xff09;Kylin-V10&#xff08;aarch64 架构&…

mysql-Synch-clickhouse

Synch GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster) 环境&#xff1a; mysql5.7 redis > 5.0 clickhouse21.2 postgresql python3 binlog_formatrow XREAD default pg_config synch 1&#xff1a;安装clickhouse rpm下载地址&…

map和set例题应用

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 第一题 第二题 第三题 第一题 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍历旧链表&#xff0c;并创建新节点&#xff0c;同时用map将旧节点与新节点…

ICASSP2024 | ICMC-ASR 车载多通道语音识别挑战赛总结

为促进驾驶场景中语音处理和识别研究&#xff0c;在ISCSLP 2022上成功举办智能驾驶座舱语音识别挑战 (ICSRC)的基础上&#xff0c;西工大音频语音与语言处理研究组 (ASLPNPU)联合理想汽车、希尔贝壳、WeNet社区、字节、微软、天津大学、南洋理工大学以及中国信息通信研究院等多…

动态规划--(算法竞赛、蓝桥杯)--二维费用背包

1、B站视频链接&#xff1a;E15 背包DP 二维费用背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; int f[101][101]; //f[j][k]第i件物品&#xff0c;体积<j,重量<k的最大价值int main(){int n,V,W;//物品、容量、承重int v,w,val;//体积、重…

IIS部署.Net 7项目

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;前端领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、发布项目二、解决发布失败1.发布失败2.托管…

【论文笔记】An Effective Adversarial Attack on Person Re-Identification ...

原文标题&#xff08;文章标题处有字数限制&#xff09;&#xff1a; 《An Effective Adversarial Attack on Person Re-Identification in Video Surveillance via Dispersion Reduction》 Abstract 通过减少神经网络内部特征图的分散性攻击reid模型。 erbloo/Dispersion_r…

Scratch 第十四课-打地鼠游戏

第十四课-打地鼠游戏 学习目标 这节课我们一起来做一款打地鼠游戏 如何画圆形以及如何使用复制粘贴功能随机数在游戏中的实际应用逻辑运算符与判断语句的使用 程序设计 程序分析 &#xff1a; 打地鼠游戏小朋友们都玩过&#xff0c;在多个洞里面随机伸出老鼠的头&#xff0…

Github配置ssh key的步骤

1. 检查本地主机是否已经存在ssh key 是否存在 id_rsa 和 id_rsa.pub文件&#xff0c;如果存在&#xff0c;说明已经有SSH Key 如下图所示&#xff0c;则表明已经存在 如果存在&#xff0c;直接跳到第三步 2. 生成ssh key 如果不存在ssh key&#xff0c;使用如下命令生…

机器学习(II)--样本不平衡

现实中&#xff0c;样本&#xff08;类别&#xff09;样本不平衡&#xff08;class-imbalance&#xff09;是一种常见的现象&#xff0c;如&#xff1a;金融欺诈交易检测&#xff0c;欺诈交易的订单样本通常是占总交易数量的极少部分&#xff0c;而且对于有些任务而言少数样本更…