【Spring Cloud】实现微服务调用的负载均衡

文章目录

  • 什么是负载均衡
  • 自定义实现负载均衡
    • 启动shop-product微服务
    • 通过nacos查看微服务的启动情况
    • 自定义实现负载均衡
  • 基于Ribbon实现负载均衡
    • 添加注解
    • 修改服务调用的方法
    • Ribbon支持的负载均衡策略
      • 通过修改配置来调整 Ribbon 的负载均衡策略
      • 通过注入Bean来调整 Ribbon 的负载均衡策略
    • 饥饿加载
  • 总结

欢迎来到阿Q社区
https://bbs.csdn.net/topics/617897123

什么是负载均衡

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

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

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

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

自定义实现负载均衡

启动shop-product微服务

在启动 shop-product 微服务的基础上,通过idea再启动一个 shop-product 微服务,设置其端口为8082。

在这里插入图片描述
命令为-Dserver.port=8082

通过nacos查看微服务的启动情况

在这里插入图片描述

自定义实现负载均衡

修改 shop-order 的代码

public ShopOrder order(@PathVariable("pid") Long pid) {log.info("客户下单,这时候要调用商品微服务查询商品信息。。。");//从nacos中获取服务地址List<ServiceInstance> instances = discoveryClient.getInstances("shop-product");//自定义规则实现随机挑选服务int index = new Random().nextInt(instances.size());ServiceInstance serviceInstance = instances.get(index);String url = serviceInstance.getHost()+":"+serviceInstance.getPort();log.info(">>从nacos中获取到的微服务地址为:"+ url);//通过restTemplate调用商品微服务ShopProduct shopProduct = restTemplate.getForObject("http://"+url+"/product/"+pid, ShopProduct.class);log.info("当前用户信息为自己,假设我们设置为1");ShopOrder shopOrder = new ShopOrder();shopOrder.setUid(1L);shopOrder.setUsername("公众号:阿Q说代码");shopOrder.setPid(shopProduct.getId());shopOrder.setPname(shopProduct.getPname());orderService.save(shopOrder);//商品扣减库存的逻辑ProductReduceDTO productReduceDTO = new ProductReduceDTO();productReduceDTO.setProductId(pid);productReduceDTO.setReductCount(1);Integer count = restTemplate.postForObject("http://"+url+"/product/reduceStock", productReduceDTO, Integer.class);return shopOrder;}

启动两个服务提供者和一个服务消费者,多访问几次消费者,测试效果:
在这里插入图片描述

基于Ribbon实现负载均衡

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

添加注解

在 RestTemplate 的生成方法上添加@LoadBalanced注解

@Bean
@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}

修改服务调用的方法

将上一步中的代码注释掉,改为直接使用微服务名字,从nacos中获取服务地址

//从nacos中获取服务地址
//自定义规则实现随机挑选服务
//List<ServiceInstance> instances = discoveryClient.getInstances("shop-product");
//int index = new Random().nextInt(instances.size());
//ServiceInstance serviceInstance = instances.get(index);
//String url = serviceInstance.getHost()+":"+serviceInstance.getPort();//直接使用微服务名字,从nacos中获取服务地址
String url="shop-product";

重启服务进行测试,微服务调用成功。

Ribbon支持的负载均衡策略

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

在这里插入图片描述

通过修改配置来调整 Ribbon 的负载均衡策略

# 负载均衡规则
shop-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

通过注入Bean来调整 Ribbon 的负载均衡策略

 @Beanpublic IRule randomRule(){return new RandomRule();}

饥饿加载

为何要开启饥饿加载,因为在我们第一次加载时候,响应时间比较慢,原因是第一次加服务需要从服务注册列表中拉取服务实例,以及初始化相关的组件到 Spring 中。

开启饥饿加载的相关配置之后这些操作会在服务启动就会完成。

ribbon:eager-load:clients:- shop-product

总结

到这儿,我们微服务调用的负载均衡实现就结束了。下一篇将为大家带来基于feign实现微服务调用的文章,敬请期待吧!

后续的文章,我们将继续完善我们的微服务系统,集成更多的Alibaba组件。想要了解更多JAVA后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

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

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

相关文章

Shader基础的简单实现(基于URP渲染)

一个模型是很多个顶点组成&#xff0c;顶点数据中包含坐标、法线、切线、UV坐标、顶点颜色等等组成。 URP(Universal Render Pipeline)通用渲染管线&#xff0c;是Unity在2019.3版本之后推出的一种新的渲染管线。传统的渲染管线在渲染多光源的情况&#xff0c;是把每一个主要光…

由面试题“Redis是否为单线程”引发的思考

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

理论学习-ARM-内核

ARM内核 函数的调用加载、存储计算中断异常线程的切换注意事项参考文献 为了提高学习效率&#xff0c;我们要提前想好学习策略。 首先&#xff0c;使用频率越高的知识点&#xff0c;越要首先学习。假使&#xff0c;我们学习了一个知识点&#xff0c;能覆盖工作中80%的工作量&am…

大模型相关论文笔记

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 用于知识密集型NLP任务的检索增强生成 Facebook 2020 PDF CODE &#xff08;论文代码链接已失效&#xff0c;以上是最新链接&#xff09; 引言 大模型有幻觉问题&#xff08;hallucinations&#xff09;&…

【MATLAB源码-第143期】基于matlab的蝴蝶优化算法(BOA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蝴蝶优化算法&#xff08;Butterfly Optimization Algorithm, BOA&#xff09;是基于蝴蝶觅食行为的一种新颖的群体智能算法。它通过模拟蝴蝶个体在寻找食物过程中的嗅觉导向行为以及随机飞行行为&#xff0c;来探索解空间&a…

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)

随着社会的发展和科技的进步&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素&#xff0c;以确保平台的稳定性和可用…

【html学习笔记】3.表单元素

1.文本框 1.1 语法 <input type "text">表示文本框。且只能写一行 1.2 属性 使用属性size 设置文本框大小 <input type"text" size"10">2. 使用属性value 来设置文本框的默认文字 <input type"text" size"…

”戏说“ 交换机 与 路由器

一般意义上说 老哥 这文章发表 的 东一榔头 西一锤 呵呵&#xff0c; 想到哪里就啰嗦到哪里 。 交换机&#xff1a; 其实就是在通道交换 路由器&#xff1a; 不光是在通道交换还要在协议上交换 下图你看懂了吗&#xff1f; &#xff08;仅仅数据交换-交换机 协议…

petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

【MySQL调优】Join语句优化知识点

相信绝大多数开发者&#xff0c;在开发的项目&#xff0c;因业务和需求逐渐复杂化、多元化后&#xff0c;会增加 Join 语句的使用&#xff0c;但是如果您不太了解 Join语句的规则&#xff0c;也许会逐步的拖垮数据库&#xff0c;乃至整个项目。 今天我们就来分享一下 Join优化…

springboot209基于web的大学生一体化服务平台的设计与实现

大学生一体化服务平台的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统大学生综合服务信息管…

[计算机网络]---TCP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一 、TCP协…