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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…

Watir 试用手记——一个很不错的开源 Web 自动化测试框架

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

融资项目——JWT令牌

1.JSON Web Token (JWT)是一种自包含令牌。自包含令牌本身已经包含了用户的相关信息&#xff0c;然后将这些信息通过例如加密的形式形成的令牌&#xff0c;由服务器进行解密从而完成对用户信息的确认。JWT一共由头、载荷与认证签名三个部分组成。然后由这三段字符拼接形成&…

Python Web开发记录 Day5:jQuery(JavaScript库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 五、jQuery1、jQuery-选择器和菜单案例①快速上…

CentOS7安装MySQL5.7

查看并卸载系统自带的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 检查系统是否安装过MySQL rpm -qa | grep mysql 检查有无MySQL用户组 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 创建MySQL用户组和用户 groupadd m…

年轻人怎么搞钱?

年轻人想要搞钱&#xff0c;可以考虑以下几个方面&#xff1a; 1. 创业&#xff1a;年轻人可以通过自己的创意&#xff0c;找到一个市场的空缺&#xff0c;开创自己的业务。可以从比较小的项目开始&#xff0c;逐渐扩大范围&#xff0c;积累经验和财富。 2. 投资&#xff1a;…

泰山派学习笔记(二)一步一步编译SDK文件

上一节&#xff0c;我们安装了基于虚拟机的ubuntu系统&#xff0c;并且建立了samba服务打通了win10和ubuntu系统中的文件传输。本节课我们继续对立创官方提供的SDK文件进行编译&#xff0c;学习编译的方法。引用官方的话&#xff1a;如果只想下载别人编译好的固件并且做一些应用…

基于springboot+vue的智慧图书管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Java缓存简介

内存访问速度和硬盘访问速度是计算机系统中两个非常重要的性能指标。 内存访问速度&#xff1a;内存是计算机中最快的存储介质&#xff0c;它的访问速度可以达到几纳秒级别。内存中的数据可以直接被CPU访问&#xff0c;因此读写速度非常快。 硬盘访问速度&…

APP攻防-实战拿下某seseAPPSpringboot未授权HeapDump提取OSS利用

知识点 1、APK-抓包 2、资产信息收集 3、SpringBoot-漏洞利用 4、自动化工具 5、HeapDump-分析提取 6、AccessKEY-利用后续 演示案例&#xff1a; 1、APK-抓包 2、资产信息收集 3、SpringBoot-漏洞利用 SpringBoot漏洞利用&#xff1a; https://github.com/LandGrey/Spring…

“内容+科技” 2023爱奇艺拿稳了“高质量增长”指南

“无论影视行业还是互联网行业&#xff0c;最难的时候应该是过去了&#xff0c;接下来我们要高质量增长。” 2023年5月10日&#xff0c;爱奇艺创始人、CEO龚宇在爱奇艺世界大会上给出了这样的判断。大半年之后&#xff0c;爱奇艺公布的2023年全年财报&#xff0c;最终诠释了高…

HMAC算法

HMAC HMAC可以用来加密、数字签名、报文验证等。 1. 消息认证码 消息认证码(Message Authentication Code,MAC)是基于消息和秘钥的公开函数,输出为定长数据: MAC=C(M,K) 假定通信双发共享秘钥K,发送方A向接收方B发送报文M并附上MAC,记为: A→B:M||MAC 当B收到后,使…

JavaScript继承 寄生组合式继承 extends

JavaScript继承 1、JS 的继承到底有多少种实现方式呢? 2、ES6 的 extends 关键字是用哪种继承方式实现的呢? 继承种类 原型链继承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…

基于 ECharts的Python 数据可视化库,它允许用户使用 Python 语言生成各种类型的交互式图表和数据可视化

pyecharts 是一个基于 ECharts 的 Python 数据可视化库&#xff0c;它允许用户使用 Python 语言生成各种类型的交互式图表和数据可视化。 ECharts 是由百度开发的一款强大的开源数据可视化库&#xff0c;而 Pyecharts 则是 ECharts 的 Python 封装&#xff0c;使得在 Python 中…

C++前言

目录 什么是C C发展史 C的重要性 如何学习C 什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年…

CVPR2024 | 加速Diffusion,韩松团队提出分布式并行推理方案DistriFusion,加速6.1倍,质量不下降,已开源

https://arxiv.org/pdf/2402.19481.pdf https://github.com/mit-han-lab/distrifuser 本文概述 扩散模型在合成高质量图像方面取得了巨大成功。然而&#xff0c;由于巨大的计算成本&#xff0c;利用扩散模型生成高分辨率图像仍然具有挑战性&#xff0c;导致交互式应用程序的延…

bvh文件,人体骨骼重定向

关于两个bvh文件&#xff0c;人体骨骼重定向&#xff0c;小白记录 1、打开 Motionbuilder &#xff0c;选择 打开特定路径下的bvh文件。 绑定骨骼&#xff08;在绑定骨骼过程中&#xff0c;如果骨骼角度&#xff0c;大小之类的不方便&#xff0c;可以shift键加鼠标拖拽界面&…

谈谈高并发系统的设计方法论

何为高并发系统&#xff1f; 在理解高并发系统之前&#xff0c;我们先来理解几个相关概念。 什么是并发&#xff08;Conurrent&#xff09;&#xff1f; 在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同…

图片的处理库Thumbnailator

摘要&#xff1a;最近遇到图片处理的问题&#xff0c;借助了Thumbnailator库&#xff0c;记录下使用步骤如下…… 图片处理&#xff0c;JDK中也提供了对应的工具类&#xff0c;不过处理较麻烦&#xff0c;Thumbnailator 是Google一个 开源Java 图像处理库&#xff0c;用于简化 …