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

news2024/11/17 3:01:34

文章目录

  • 什么是负载均衡
  • 自定义实现负载均衡
    • 启动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后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

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

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

相关文章

什么是nginx 、安装nginx

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

数据的结构

数据结构介绍 数据结构是一门介于数学、计算机硬件和计算机软件三者之间的核心课程。数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。 数据结构研究的是数据对象内部各数据元素之间逻辑关系问题…

【C++练级之路】【Lv.8】【STL】list类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、结点二、迭代器2.1 成员变量与默认成员函数2.2 operator*2.3 operator->2.4 operator2.5 operator- …

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密&#xff1a;深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置&#xff1a;tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…

[设计模式Java实现附plantuml源码~行为型]遍历聚合对象中的元素——迭代器模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

基于springboot+vue的教学资源库系统(前后端分离)

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

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

嵌入式Qt 计算器核心算法_1

一.表达式分离算法分析 二.分离算法实现 QCalculatorDec.cpp #include "QCalculatorDec.h"#include <QDebug>QCalculatorDec::QCalculatorDec() {m_exp "";m_result "";QQueue<QString> r split("9.11 ( -3 - 1 ) * -5 &…

SpringCloud Ribbon负载均衡的策略总结及其配置

1. 轮询策略 2. 权重轮询策略 3. 随机策略 4. 最少并发数策略 5. 在选定的负载均衡策略基础上重试机制 6. 可用性敏感策略。 7. 区域敏感策略 —————————————————————— Ribbon负载均衡策略的配置&#xff1a; 在application.yml中配置如下&am…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存&#xff0c;看下图 我们先声明出指针p和指针q&#xff0c;还有指针head&#xff08;主要用于return上而已&#xff09;&#xff0c;然后进行一系列操作&#xff0c…

Disentangled Transfer Learning for Visual Recognition

DTL: Disentangled Transfer Learning for Visual Recognition 论文链接&#xff1a;https://arxiv.org/pdf/2312.07856.pdf源码链接&#xff1a;https://github.com/heekhero/DTL 简介 大规模预训练加微调的框架已经在各个领域推广。但是由于GPU内存或时间预算的原因&#…

Sora:打开视频创作新纪元的魔法钥匙

随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未…

ctfshow web入门 web141-145

1.web141 ^\w$表示在开头和末尾匹配字母数字_&#xff0c;传入的v3值不能有字母数字_&#xff0c;即无字母的命令执行 php中1-phpinfo()是可以执行的&#xff0c;加减乘除都可以实现 这里或&#xff0c;异或&#xff0c;取反等运算都可以 这里采用羽师傅的异或脚本生成paylo…

代码随想录第二十三天 回溯算法 77.组合 216.组合总和 17.电话号码的字母组合

回溯算法 LeetCode 77 组合 题目描述 思路 递归函数的返回值以及参数 在这里要定义两个全局变量&#xff0c;一个用来存放符合条件单一结果&#xff0c;一个用来存放符合条件结果的集合。 代码如下&#xff1a; vector<vector<int>> result; // 存放符合条件…

如何使用Docker本地部署Jupyter+Notebook容器并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

思科Cisco下输入问号“?”命令help

Cisco CLI &#xff08;Command-Line Interface&#xff09;命令下输入问号“&#xff1f;” 一、在Cisco CLI下&#xff0c;“&#xff1f;”被认为是 – help的帮助命令&#xff0c;当在默认情况下输入“&#xff1f;”&#xff0c;系统会自动识别为 help 命令。 二、那么&a…

【Java面试系列】Nginx

目录 为什么要用Nginx&#xff1f;为什么Nginx性能这么高&#xff1f;Nginx 是如何实现高并发的&#xff1f; Nginx怎么处理请求的&#xff1f;Nginx的工作流程 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日…