【微服务】基于Ribbon实现负载均衡

news2025/4/8 11:55:19

前言

我们在上篇文章中讲解了如何通过Nacos实现服务治理,由此引发的负载均衡的问题。这篇文章就介绍一个SpringCloud alibaba的另一个组件:Ribbon,如何通过Ribbon实现负载均衡。

负载均衡

什么是负载均衡?

通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。

根据负载均衡发生位置的不同,一般分为服务端负载均衡客户端负载均衡

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡

客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。

在这里插入图片描述
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。

自定义实现负载均衡

1、通过idea再启动一个 shop-product 微服务,设置其端口为8082

在这里插入图片描述
2、通过nacos查看微服务的启动情况

在这里插入图片描述
3、修改 shop-order 的代码,实现负载均衡

@RestController
@Slf4j
public class OrderController {
	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private OrderService orderService;
	@Autowired
	private DiscoveryClient discoveryClient;
	
	//准备买1件商品
	@GetMapping("/order/prod/{pid}")
	public Order order(@PathVariable("pid") Integer pid) {
	 	log.info(">>客户下单,这时候要调用商品微服务查询商品信息"); 
	 	//从nacos中获取服务地址
		//自定义规则实现随机挑选服务
		List<ServiceInstance> instances = discoveryClient.getInstances("service- product");
		int index = new Random().nextInt(instances.size());
		ServiceInstance serviceInstance = instances.get(index);
		String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
		log.info(">>从nacos中获取到的微服务地址为:" + url); 
		
		//通过restTemplate调用商品微服务
		Product product = restTemplate.getForObject("http://" + url + "/product/" + pid, Product.class);
		log.info(">>商品信息,查询结果:" + JSON.toJSONString(product));
		
		Order order = new Order();
		order.setUid(1);
		order.setUsername("测试用户");
		order.setPid(product.getPid());
		order.setPname(product.getPname()); order.setPprice(product.getPprice());
		order.setNumber(1);
		orderService.save(order);
		return order;
	}
}

第3步:启动两个服务提供者和一个服务消费者,多访问几次消费者测试效果

在这里插入图片描述

基于Ribbon实现负载均衡

Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡。

第1步:在RestTemplate 的生成方法上添加@LoadBalanced注解

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}

第2步:修改服务调用的方法

@RestController
@Slf4j
public class OrderController {
	 @Autowired
	private RestTemplate restTemplate; 
	@Autowired
	private OrderService orderService; 
	
	//准备买1件商品 
	@GetMapping("/order/prod/{pid}")
	public Order order(@PathVariable("pid") Integer pid) {
		log.info(">>客户下单,这时候要调用商品微服务查询商品信息");
		  //直接使用微服务名字, 从nacos中获取服务地址
		String url = "service-product"; 
		
		//通过restTemplate调用商品微服务
		Product product = restTemplate.getForObject("http://" + url + "/product/" + pid, Product.class);
		log.info(">>商品信息,查询结果:" + JSON.toJSONString(product)); 
		
		Order order = new Order();
		order.setUid(1);
		order.setUsername("测试用户"); 
		order.setPid(product.getPid()); 
		order.setPname(product.getPname());
		order.setPprice(product.getPprice());
		order.setNumber(1);
		orderService.save(order);
		return order;
	}
}

Ribbon支持的负载均衡策略

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.IRule , 具体的 负载策略如下图所示:

在这里插入图片描述
我们可以通过修改YAML配置来调整Ribbon的负载均衡策略,具体代码如下:

service-product: # 调用的提供者的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

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

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

相关文章

C语言学习笔记

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言C的面向过程和C的面向对象1.C的数据类型与常量2.C中的变量1、什么是变量&#xff1f;2、变量名字的命名规则&#…

openlayer 加载4547坐标系 以及 wfs服务数据(或其他坐标系)

1.首先查看坐标系基础信息如范围等&#xff1a;如下图&#xff1a; 2.若将地图设置成4547坐标系&#xff1a; 核心代码&#xff1a; proj4.defs("EPSG:4547","projtmerc lat_00 lon_0114 k1 x_0500000 y_00 ellpsGRS80 unitsm no_defs typecrs");register…

ModelBox姿态匹配:抖抖手动动脚勤做深呼吸

摘要&#xff1a;本案例使用Windows版本的ModelBox SDK进行二次开发&#xff0c;主要是针对姿态匹配案例开发实践。本文分享自华为云社区《姿态匹配&#xff1a;抖抖手动动脚勤做深呼吸》&#xff0c;作者&#xff1a;吴小鱼。 在之前发布的AI说ModelBox推理真的高效吗一文中&…

对于含有琥珀酰亚胺酯的叠氮试剂Azidoacetic Acid NHS Ester,N3-C5-NHS ester,N3-C3-NHS ester 知识分享

本文重点为大家总结关于含有琥珀酰亚胺酯基团的叠氮基相关试剂的性质特点&#xff0c;西安凯新生物科技有限公司​主要从Azidoacetic Acid NHS Ester、N3-C5-NHS ester、N3-C3-NHS ester进行分享。 一、Azidoacetic Acid NHS Ester CAS&#xff1a;824426-32-6 中文名&#xff…

Linux shell脚本之回顾及实用笔记

一、前言 我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相…

【学习笔记】《模式识别》2:聚类分析

聚类分析 文章目录聚类分析一、聚类分析的概念二、相似性的测度1.距离的四条基本公理2.欧氏距离&#xff08;Euclid,欧几里得&#xff09;--距离3.马氏距离&#xff08;Maharanobis&#xff09;4.马氏距离与欧氏距离之间的关系5.明氏距离&#xff08;Minkowaki&#xff09;6.汉…

4款实用的黑科技软件,白嫖党最爱,功能强大到离谱

闲话少说&#xff0c;直上干货。 1、Dism 这是一款国人研发&#xff0c;免费又好用的电脑优化工具&#xff0c;备受全球电脑爱好者追捧&#xff0c;它解决了系统安装与维护两大痛点问题——自定义设置与优化&#xff0c;相当于给电脑请了免费“保姆”。从系统安装到调校&#x…

LabVIEW基础-VI Scripting

文章目录使用过程前面板界面修改属性节点VI属性无输入时默认当前VI。输入VI引用的静态方法输入VI引用的动态方法获取对象引用从VI获取前面板所有控件的引用设置修饰物的前景色获取选项卡1上所有的数值控件并设置标签前景色从VI获取前面板选项卡的引用-转换为特定的类-获取选项卡…

B+树的插入、删除和分裂,注意国内教材和国外的对于B+树的定义的不同

B树 1 国内教材上B树的定义 一棵 m 阶的B树满足 (考研教材)&#xff1a; 每个非叶子结点最多有 m 棵子树&#xff08;孩子结点&#xff09;根结点至少有2棵子树 (1层除外)&#xff0c;非叶结点至少有 m/2 (向上取整) 棵子树结点的子树的个数与关键字的个数相等: 介于 m/2 (向…

DSL查询文档

目录一、DSL查询语法二、DSL查询分类全文检索查询精确查询地理坐标查询复合查询复合查询——fuction score复合查询——Boolean Query三、搜索结果处理排序分页高亮一、DSL查询语法 DSL Query基本语法 查询成功 二、DSL查询分类 DSL Query的分类 Elasticsearch提供了基于…

【数据结构基础】之树的介绍,生动形象,通俗易懂,算法入门必看

前言 本文为 数据结构基础【树】 相关知识&#xff0c;下边将对树的定义与相关概念&#xff0c;二叉树的定义、特点与性质&#xff0c;二叉树的存储结构&#xff0c;二叉树的遍历&#xff0c;二叉查找树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B-树与B树等进行详…

六十九、Vue3

Vue3一 Vue3的变化二 创建Vue3项目的两种方式2.1 vue-cl创建2.2 vite创建三 常用API3.1 setup3.2 ref和reactive3.3 计算和监听属性3.4 生命周期3.5 自定义hook函数一 Vue3的变化 性能的提升 打包大小减少41% 初次渲染快55%, 更新渲染快133% 内存减少54% 源码的升级 使用Proxy…

Spring Boot 并行任务,这才是优雅的实现方式!

Spring Boot 的定时任务&#xff1a; 第一种&#xff1a;把参数配置到.properties文件中&#xff1a; 代码&#xff1a; package com.accord.task;import java.text.SimpleDateFormat; import java.util.Date;import org.springframework.scheduling.annotation.Scheduled; …

不会Python迟早失业?Python何以成为找工作必备技能(资料下载)

前言 大数据时代&#xff0c;没听说过Python的人可能很少。&#xff08;文末送福利&#xff09; 未来和data与AI紧密连接的当下&#xff0c;金融公司纷纷改成Fintech&#xff08;financial technology&#xff09;&#xff0c;投行热衷于向科技公司砸钱&#xff0c;就连卖汉堡…

推进生态社会化分工 与伙伴共担未来 数商云受邀出席京东科技合作伙伴论坛

11月1日&#xff0c;2022京东云城市峰会上海站正式启幕。京东科技携手生态伙伴&#xff0c;共聚“合作伙伴论坛”。作为京东集团科技生态的总担当&#xff0c;京东科技秉承“生态社会化分工”理念&#xff0c;与伙伴共担未来。会上&#xff0c;8大场景合作案例依次分享&#xf…

STM32单片机可变频率幅度DDS信号发生器正弦波三角波方波AD9833

实践制作DIY- GC0094-DDS信号发生器 一、功能说明&#xff1a; 基于STM32单片机设计-DDS信号发生器 功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C系列最小系统板 LCD1602显示器AD9833信号模块4*4矩阵键盘多个按键 1.通过4*4键盘来设定频率值和三角波正弦波的幅度&…

内网搭建图片网站:软件安装配置 1-3

现代的手机功能越来越强大&#xff0c;也让我们能随时随地抓拍有趣瞬间。而照片越来越多&#xff0c;全都存放在手机上并不现实&#xff0c;存在云端又有安全隐患&#xff0c;只能存放在自己的电脑上。而这又带来难以随时与他人分享的问题。不过&#xff0c;我们完全可以在自己…

智能网联赋能汽车品牌全球化 第五届全球汽车发展趋势论坛将召开

当前&#xff0c;全球汽车产业正处于百年未遇的大变革时期&#xff0c;全球汽车产业格局正在重塑&#xff0c;其中&#xff0c;中国汽车产业正在依靠智能化、网联化优势不断加深在全球汽车市场中的影响力&#xff0c;正在迈入高质量发展的新阶段。如何利用智能网联技术以及顺应…

单片机毕业设计 stm32智能婴儿床系统

文章目录1 简介2 项目背景3 设计概要4 设计方案5 硬件清单5.1 stm32主控5.2 OLED显示屏5.3 继电器模块5.4 L298N电机驱动板模块5.5 MAX声音传感模块 一个5.6 Jdy-311蓝牙模块5.7 音乐播放模块6 软件部分设计6.1 声音传感器子函数6.2 声音传感器软件7 实现效果8 关键代码1 简介 …

大数据行业现在工作很难找吗?

工作到底好不好找&#xff0c;市场需求是一方面&#xff0c;更多的还是要看个人成长背景和实际能力~ 抛开两点都不谈就单说好找或者不好找纯属有点耍流氓了~ 大数据开发主要是负责大数据挖掘&#xff0c;大数据清洗处理&#xff0c;大数据建模等&#xff0c;负责大规模数据的处…