【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
@LoadBalanced
 public 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 的负载均衡策略

 @Bean
 public IRule randomRule(){
     return new RandomRule();
 }

饥饿加载

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

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

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

总结

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

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

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

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

相关文章

【Vue】本地使用 axios 调用第三方接口并处理跨域

前端处理跨域 一. 开发准备 开发工具&#xff1a;VScode框架&#xff1a;Vue2项目结构&#xff1a;vue脚手架生成的标准项目&#xff08;以下仅显示主要部分&#xff09; 本地已搭建好的端口&#xff1a;8080要请求的第三方接口&#xff1a;http://1.11.1.111:端口号/xxx-api…

3.1 XPath的使用

目录 3.1.1 XPath的作用 3.1.2 XPath使用前提 3.1.3 XPath的使用 &#xff08;1&#xff09;属性匹配和获取一个属性值节点的内容 &#xff08;2&#xff09;属性多值匹配 &#xff08;3&#xff09;获取<>中的内容 &#xff08;4&#xff09;多属性匹配 &#…

通知:全面停工停产6个月,员工解雇工

随着新能源汽车兴起&#xff0c;汽车行业涌现出许多造车新势力&#xff0c;包括蔚来、理想、小鹏、哪吒、零跑等。然而&#xff0c;近日&#xff0c;高合汽车陷入了困境&#xff0c;宣布全面停工停产&#xff0c;员工被解雇&#xff0c;新车降价清仓。 据百能云芯电子元器件商城…

力扣225 用队列实现栈

题目链接 如果用两个栈来实现队列&#xff0c;那么可以用两个队列来实现栈吗 首先看入栈操作和入队是一样的&#xff0c;直接用 就是这个出栈&#xff0c;每次出栈的是队列里的最后一个元素&#xff0c;那么将前面的元素依次入到第二个队列&#xff0c;然后再将所剩的最后一个…

Spring解决循环依赖

目录 什么是spring循环依赖 什么情况下循环依赖可以被处理&#xff1f; spring 如何解决循环依赖 创建A这个Bean的流程 答疑 疑问&#xff1a;在给B注入的时候为什么要注入一个代理对象&#xff1f; 初始化的时候是对A对象本身进行初始化&#xff0c;而容器中以及注入到B…

windows系统下载安装 memcached

好 之前说 带大家要用spring boot整合cache 其中包括 memcached 那么今天就带大家 下载安装一下 我们先访问地址 https://cloud.tencent.com/developer/article/2049577 这也是别人发的一个网址 里面放了他放在网上的资源 简单归纳为 windows 32位 链接 https://share.weiyun…

Java 学习和实践笔记(16):类的理解以及初始值

类&#xff0c;英文名叫class。基本上对应的就是语言里的名词。 比如&#xff0c;房子、人、树、花、汽车等等&#xff0c;这些名词&#xff0c;这些可以定义成类。 以房子为例&#xff0c;作为一个房子&#xff0c;它一定有相应的属性&#xff0c;比如房顶、墙、门、窗等等&…

redis复习笔记06(小滴课堂)

分布式锁核心知识介绍和注意事项 基于Redis实现分布式锁的几种坑 综合伪代码&#xff1a; 运行&#xff1a;

乱评?口碑不错老牌TOP期刊竟也被预警?预警名单再遭质疑!

【SciencePub学术】 2024年《国际期刊预警名单》 2024年预警原因&#xff1a;引用操纵 FUEL IF(2022)&#xff1a;7.4&#xff0c;JCR1区&#xff0c;中科院1区TOP 期刊数据指标 ISSN&#xff1a;0016-2361 IF(2022)&#xff1a;7.4 自引率&#xff1a;20.30% 年发文量&…

我有一个自解压的文件,格式EXE的.我想加密.怎么弄? 给人家要密码才能解压.

要加密一个自解压的EXE文件&#xff0c;使其需要密码才能解压&#xff0c;你可以使用加密软件或者对EXE文件进行一些特殊的处理。以下是一些建议的方法&#xff1a; 1. 使用加密软件 WinRAR&#xff1a;WinRAR是一个常用的压缩和解压缩工具&#xff0c;它也提供了加密功能。你…

大模型相关论文笔记

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

UiAutomator2自动化测试框架带你玩转APP操作

前言 很早以前&#xff0c;我用uiautomatorjava实践过Android APP自动化测试&#xff0c;不过今天要提的不是uiautomator&#xff0c;而是uiautomator2。听起来uiautomator2像是uiautomator的升级版&#xff0c;但是这两款框架仅仅是名字上比较相似&#xff0c;实际上没有任何…

11、内网安全-横向移动NTLM-Relay重放Responder中继攻击LdapEws

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 目录 前提知识&#xff1a; 一、横向移动-NTLM 中继攻击-Relay 重放-SMB 上线 1、CS权限转给MSF: 2、MSF: 3、添加路由&#xff1a; 4、smb_relay重发模块&#xff1a; 5、受控主机输…

关于dxf文件中,多段线凸度的计算

1.前言 在前面的CAD中的dxf文件解析(二)中讲到了一些CAD的dxf文件解析点、线、圆弧、圆、块等的思路。下面提供链接&#xff1a; &#xff08;二): CAD中的dxf文件解析(二):dxflib的使用_不爱学习 未完待续的博客-CSDN博客_dxflib (一)&#xff1a;CAD中的dxf文件解析(一):准备…

[ 2024春节 Flink打卡 ] -- Paimon

2024&#xff0c;游子未归乡。工作需要&#xff0c;flink coding。觉知此事要躬行&#xff0c;未休&#xff0c;特记 Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合&#xff0c;推出新一代的 Streaming Lakehouse 技术&#xff0c;…

缓存篇—缓存雪崩、缓存击穿、缓存穿透

缓存异常会面临的三个问题&#xff1a;缓存雪崩、击穿和穿透。 其中&#xff0c;缓存雪崩和缓存击穿主要原因是数据不在缓存中&#xff0c;而导致大量请求访问了数据库&#xff0c;数据库压力骤增&#xff0c;容易引发一系列连锁反应&#xff0c;导致系统奔溃。不过&#xff0…

揭秘安秉网盾加密软件芯片制造业的5个神奇点

安秉网盾加密软件在芯片制造业有着许多神奇的应用点&#xff0c;以下是其中的五个&#xff1a; 芯片行业的数据的安全性与保密性 安秉网盾加密软件提供强大的加密算法和安全机制&#xff0c;可以对芯片研发行业的图纸及源代码文件进行加密保护&#xff0c;加密后的文件只能在安…

三、创建脚手架和脚手架分析

三、创建脚手架 一、环境准备 1、安装node.js **下载地址&#xff1a;**https://nodejs.org/zh-cn/界面展示 2、检查node.js版本 查看版本的两种方式 node -vnode -version 出现版本号则说明安装成功&#xff08;最新的以官网为准&#xff09; 3、为了提高我们的效率&…

VK36N3B SOP8/DFN8L抗噪3键触摸感应/高抗干扰触控IC/工控触摸触控IC BCD 输出

产品型号&#xff1a;VK36N3B 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP8/DFN8L 工程服务&#xff0c;技术支持&#xff01; 概述 VK36N3B具有3个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度&#xff0c;仅需…

关于RestCloud iPaaS平台的板块详解

当今的企业分工越来越细&#xff0c;上下游合作越来越紧密、各企业之间的业务系统需要相互协作完成业务、外部API依赖越来越多、同时企业系统运行在多个混合云环境及SaaS中&#xff0c;私有端大量业务系统与云端系统形成了错综复杂的集成关系&#xff0c;企业面临集成技术复杂多…