LoadBalancer负载均衡

news2024/11/12 10:46:28

一、概述

1.1、Ribbon目前也进入维护模式

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

https://github.com/Netflix/ribbon?tab=readme-ov-file#project-status-on-maintenance

image-20240826184153184

https://cloud.spring.io/spring-cloud-netflix/multi/multi__modules_in_maintenance_mode.html#_modules_in_maintenance_mode

将模块置于维护模式意味着 Spring Cloud 团队将不再向该模块添加新功能。我们将修复阻止程序错误和安全问题,还将考虑和审查来自社区的小型拉取请求。我们打算从 Greenwich 发布版本正式发布开始至少一年内继续支持这些模块。以下 Spring Cloud Netflix 模块和相应的启动器将置于维护模式:

image-20240826185000093

https://spring.io/blog/2019/01/23/spring-cloud-greenwich-release-is-now-available

我们建议使用以下内容来替代这些模块提供的功能。

image-20240826185221197

1.2、spring-cloud-loadbalancer概述

LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等

spring-cloud-starter-loadbalancer组件是什么

Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient(WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求)

https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html

image-20240826190218348

image-20240826190227041

客户端负载VS服务器端负载区别

loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。

loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

二、实战

2.1、改POM

 <dependencies>
        <!--loadbalancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>

image-20240826200458210

2.2、写代码

package com.loadbalancer.consumer.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author: 史小创
 * @Time: 2024/8/23 下午7:08
 * @Description:
 */

@RestController
public class LoadbalancerConsumerController {
    public static final String URL = "http://LoadbalancerProvider/provider/";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/{id}")
    public String hello(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(URL + id, String.class);
    }
}

image-20240826200754590

package com.loadbalancer.consumer.config;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;

/**
 * @Author: 史小创
 * @Time: 2024/8/26 下午7:44
 * @Description:
 */


@Configuration
public class RestTemplateConfig {
    /**
     * 这个注解用于启用客户端负载均衡功能。
     * 注解作用在 RestTemplate 上时,Spring 会为 RestTemplate 配置一个拦截器,
     * 这个拦截器会在你调用服务时自动根据服务名称(例如通过 Consul 注册中心注册的服务名)进行负载均衡。
     * 也就是说,当你在 RestTemplate 中使用服务名称来调用服务时,@LoadBalanced 会确保请求被分发到不同的服务实例上,以实现负载均衡。
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

image-20240826200847056

2.3、测试

http://localhost:8888/consumer/66

ec7c9762-b00e-4d3a-8afe-bfda6c73ee49

2.4、负载均衡的算法

https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html#switching-between-the-load-balancing-algorithms

在负载平衡算法之间切换 默认使用的 ReactiveLoadBalancer 实现是 RoundRobinLoadBalancer。要切换到其他实现(针对选定服务或所有服务),可以使用自定义 LoadBalancer 配置机制。例如,可以通过 @LoadBalancerClient 注释传递以下配置以切换到使用 RandomLoadBalancer:

image-20240826201808347

package com.loadbalancer.consumer.config;

import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;

/**
 * @Author: 史小创
 * @Time: 2024/8/26 下午7:44
 * @Description:
 */


@Configuration
/**
 * @LoadBalancerClient 注解是 Spring Cloud 提供的,用于自定义特定服务的负载均衡配置。
 * value 属性:value = "LoadbalancerProvider" 指定了要为哪个服务自定义负载均衡配置,这里的 "LoadbalancerProvider" 是服务的名称。
 * 这个名称必须与 Consul 或其他服务注册中心中注册的服务名称完全匹配(包括大小写),因为 Spring Cloud 会根据这个名称来查找和应用负载均衡策略。
 * 
 * configuration 属性:configuration = RestTemplateConfig.class 指定了该服务的负载均衡配置使用哪个配置类,这里指向的是当前的 RestTemplateConfig 类。
 * 通过这种方式,可以为特定的服务定制负载均衡策略,例如使用随机负载均衡(RandomLoadBalancer)而不是默认的轮询负载均衡(Round Robin)。
 */
@LoadBalancerClient(
        // 下面的value值大小写一定要和consul里面的名字一样,必须一样
        value = "LoadbalancerProvider", configuration = RestTemplateConfig.class)
public class RestTemplateConfig {
    /**
     * 这个注解用于启用客户端负载均衡功能。
     * 注解作用在 RestTemplate 上时,Spring 会为 RestTemplate 配置一个拦截器,
     * 这个拦截器会在你调用服务时自动根据服务名称(例如通过 Consul 注册中心注册的服务名)进行负载均衡。
     * 也就是说,当你在 RestTemplate 中使用服务名称来调用服务时,@LoadBalanced 会确保请求被分发到不同的服务实例上,以实现负载均衡。
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);

        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

}

image-20240826221944435

http://localhost:8888/consumer/66

19bec06c-c29f-4711-a3bb-c264468d64ff

三、环境搭建

SpringBoot+SpringCloud的版本:

<spring.boot.version>3.2.0</spring.boot.version>
<spring.cloud.version>2023.0.0</spring.cloud.version>

注册中心:

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

Consul

image-20240823181110455

docker pull consul:1.9.6
docker run -d -p 8500:8500 --restart=always --name=consul -v /opt/consul:/consul/data consul:1.9.6 agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
http://192.168.200.129:8500/ui/dc1/services

image-20240823180526926

jdk:

image-20240824171950942

Maven

image-20240823181810973

IDEA

image-20240823181906302

代码汇总:

https://github.com/shixiaochuangjob/markdownfile/tree/main/20240826

image-20240826222715629

在这里插入图片描述

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

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

相关文章

监控领域的物理对抗攻击综述——Physical Adversarial Attacks for Surveillance: A Survey

介绍 文章贡献 框架提出&#xff1a;提出了一个新的分析框架&#xff0c;用于理解和评估生成和设计物理对抗性攻击的方法。全面调查&#xff1a;对物理对抗性攻击在监控系统中的四个关键任务—检测、识别、跟踪和行为识别—进行了全面的调查和分析。跨领域探索&#xff1a;讨…

OpenHarmony轻量设备Hi3861芯片开发板启动流程分析

引言 OpenHarmony作为一款万物互联的操作系统&#xff0c;覆盖了从嵌入式实时物联网操作系统到移动操作系统的全覆盖&#xff0c;其中内核包括LiteOS-M,LiteOS-A和Linux。LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核&#xff0c;主要面向没有MMU的处理器&#x…

数据结构---顺序表---单链表

目录 一、什么是程序&#xff1f; 程序 数据结构 算法 二、一个程序释放优秀的两个标准 2.1.时间复杂度 2.2.空间复杂度 三、数据结构 3.1.数据结构间的关系 1.逻辑结构 1&#xff09;线性关系 2&#xff09;非线性关系 2.存储结构 1&#xff09;顺序存储结构 …

Python的起源与发展历程:从创意火花到全球热门编程语言

目录 创意的火花名字的由来圣诞节的礼物社区的力量今天的Python Python的起源可以追溯到1989年&#xff0c;当时荷兰计算机科学家Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;在阿姆斯特丹的荷兰国家数学和计算机科学研究所&#xff08;CWI&#xff09;工作。Python的…

Android Studio 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 选择外观字体 前言 Android Studio 自定义字体大小&#xff0c;统一设置为 JetBrains Mono &#xff0c;大小为 14 具体操作 【File】>【Settings...】>【Appearance & Behavior】>【…

计算机视觉编程 3(图片处理)

目录 图像差分 高斯差分 形态学-物体计数 ​编辑 图片降噪 图像差分 # -*- coding: utf-8 -*- from PIL import Image from pylab import * from scipy.ndimage import filters import numpy# 添加中文字体支持 from matplotlib.font_manager import FontProperties font…

一键编辑,轻松实现废品回收小程序多平台发布

创建废品回收小程序&#xff0c;简化开发流程&#xff0c;让创意即刻上线&#xff01;借助乔拓云平台&#xff0c;只需简单几步&#xff0c;即可拥有个性化的小程序页面。 在乔拓云网站&#xff0c;登录小程序后端开始设计&#xff0c;点击“设计小程序”&#xff0c;一个直观易…

一场意外从 Android 开发岗到鸿蒙开发岗~

经历&#xff1a; 在 Android 开发领域已经耕耘了数年&#xff0c;对 Android 系统的架构、开发模式和各种技术都非常熟悉。然而&#xff0c;由于市场的变化和公司业务的调整&#xff0c;我所在的团队接到通知要逐步转向鸿蒙开发。 一开始&#xff0c;得知这个消息时我感到有些…

软件测试需要学习的知识有哪些?这些你一定没学过

1、测试基础 软件&#xff1a;控制计算机硬件工作的工具&#xff08;客户端&#xff0c;服务器&#xff0c;数据库&#xff09; 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求 目的&#xff1a;减少缺陷&#xff0c;保证质量 2、测试主流技能&#xff1a; 1&…

使用DDU卸载显卡驱动并更新

使用DDU卸载显卡驱动并更新 安装环境 首先到英伟达官网去下载你想要的驱动,根据你的显卡型号选择你想要的驱动,一般都是选大版本最后几个小版本 笔记本选带后缀(Notebooks) 然后下载Display Driver Uninstaller (DDU卸载工具),保存在任意位置(一般在c盘下) 卸载驱动 安全模…

【Qt】容器类控件GroupBox

容器类控件GroupBox 使用QGroupBox实现一个带有标题的分组框&#xff0c;可以把其他的控件放在里面里面作为一组&#xff0c;这些内部的控件的父元素也就不是this了。 其目的只是为了让界面看起来更加好看&#xff0c;例如当一个界面比较复杂的时候&#xff0c;包含了很多的控…

python Pillow 把一个图片复制3次

1. 先看效果 输入图片 输出图片 输入图片 输出图片 代码 来源: kimi , https://kimi.moonshot.cn/chat/cr6ug39mqu053qm0sfsg from PIL import Image import os# 对于一个 1365*2048 的图片&#xff0c;进行复制3次 def duplicate_and_combine_horizontally(image_path):# …

Java进阶13讲__第五讲

JDK8新特性-Lambda 1.认识Lambda 2.Lambda表达式的省略写法 进一步简化Lambda表达式的写法 package cn.hdc.oop5.lambda;import java.util.Arrays; import java.util.Comparator;public class Test2 {public static void main(String[] args) {double[] price {99.8, 128, 1…

Python 从入门到实战2(实例1:计算圆的面积)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 看视频太慢&#xff0c;一起照着来练习吧&#xff01;今天我们通过…

81、k8s网络配置以及k8s拉取私有仓库

一、k8s架构安装部署 k8s架构master 192.168.168.81 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.168.82 docker kubeadm kubelet kubectl flannel node02 192.168.168.83 docker、kubeadm、kubelet、kubectl、flannel#关闭防火墙 [rootk8s1 ~]# sys…

海睿思通过华东江苏大数据交易中心数商认证,提供高质量数据治理服务!

近日&#xff0c;中新赛克海睿思成功通过华东江苏大数据交易中心的数商认证&#xff0c;获得华东江苏大数据交易中心颁发的“数据治理服务商”证书。 华东数交是在实施“国家大数据战略”大背景下&#xff0c;经国家批准的华东地区首个省级特色数据要素交易平台&#xff0c;致力…

2024年8月20日~2024年8月26日周报

目录 一、前言 二、完成情况 2.1 解决网络波动问题——学习率 2.2 设计盐数据速度模型展示图 三、下周计划 一、前言 上周主要完成&#xff1a; ①与老师讨论损失函数与介绍部分内容&#xff1b;②基于盐数据设计TU-Net的网络架构&#xff0c;并思考如何引出该网络架构&a…

一. 初始 Spring Boot

一. 初始 Spring Boot 文章目录 一. 初始 Spring Boot1. Spring Boot 是什么&#xff1f;2. Spring Boot 官方文档地址3. 第一个 Spring Boot 程序3.1 我的环境工具配置 4. 第一个 SpringBoot 程序解释说明5. Spring&#xff0c;SpringMVC&#xff0c; SpringBoot 三者的关系6.…

8月27复盘日记

8月27复盘日记 前言今日感恩今日知识今日反思今日名言 前言 今天早上是七点半起床嘻嘻&#xff0c;昨晚和舍友聊天&#xff0c;分享小时候的趣事&#xff0c;以及一些观点&#xff0c;聊得有些激动&#xff0c;就比较难以入睡   今天天气又是超级让人幸福&#xff01;&#x…

c++类的封装

目录 有参构造函数对象 无参数构造函数 封装可是个好东西呢&#x1f609; 它能让你的代码更简洁、更安全&#xff0c;也更容易维护。就像把你的宝贝都放进一个漂亮的盒子里&#xff0c;不仅整齐好看&#xff0c;还能保护它们不被弄坏&#x1f381;。而且啊&#xff0c;封装还…