Spring Cloud LoadBalancer基础知识

news2024/12/23 10:31:53

LoadBalancer

  • 概念
  • 常见的负载均衡策略
  • 使用随机选择的负载均衡策略
    • 创建随机选择负载均衡器
    • 配置
  • Nacos 权重负载均衡器
    • 创建 Nacos 负载均衡器
    • 配置
  • 自定义负载均衡器(根据IP哈希策略选择)
    • 创建自定义负载均衡器
    • 封装自定义负载均衡器
    • 配置
  • 缓存

概念

LoadBalancer(负载均衡器)是一种网络设备或软件机制, 用于分发传入的网络流量负载(请求)到多个后端目标服务器上, 从而实现系统资源的均衡利用和提高系统的可用性和性能
负载均衡分为服务器端负载均衡和客户端负载均衡

  1. 服务器端负载均衡是指放在服务器端的负载均衡器(反向代理), 如: Nginx, HAProxy, F5等
  2. 客户端负载均衡器是指嵌套在客户端的负载均衡器(正向代理), 如: Ribbon, Spring Cloud LoadBalancer等

服务器端负载均衡器所有请求都会发送到服务器端, 就会造成服务器端压力大的情况

常见的负载均衡策略

  1. 轮询(默认): 按照顺序将请求发送到服务器
  2. 随机选择: 随机选择一个服务器处理请求
  3. 最少连接: 选择连接数最少的一个服务器
  4. IP 哈希: 使用客户端IP地址计算哈希值然后发送到与之对应的服务器
  5. 加权轮询: 按照权重值的比例发送请求
  6. 加权随机选择: 按照权重值随机选择后端服务器
  7. 最短响应时间: 将请求发送到响应时间最短的服务器

Spring Cloud LoadBalancer 默认只支持轮询和随机选择, 但是可以自定义负载均衡策略

使用随机选择的负载均衡策略

创建随机选择负载均衡器

public class MyRandomLoadBalancer {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

配置

image.png
注意: 配置局部负载均衡器有可能不起作用, 可以配置全局负载均衡器
image.png

Nacos 权重负载均衡器

Nacos 中支持两种负载均衡器, 一种是权重负载均衡器, 另一种是第三方的CMDB(地域就近访问)标签负载均衡器, 我们可以将Spring Cloud LoadBalancer 直接配置为 Nacos 的负载均衡器

创建 Nacos 负载均衡器

@LoadBalancerClients(defaultConfiguration = MyNacosLoadBalancer.class)
public class MyNacosLoadBalancer {
    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    @Bean
    public ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment,
                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new NacosLoadBalancer(
                loadBalancerClientFactory.getLazyProvider
                        (name, ServiceInstanceListSupplier.class),
                name, nacosDiscoveryProperties);
    }
}

配置

image.png

自定义负载均衡器(根据IP哈希策略选择)

创建自定义负载均衡器

public class CustomLoadBalancer implements ReactorServiceInstanceLoadBalancer {
    private static final Log log = LogFactory.getLog(RandomLoadBalancer.class);
    private final String serviceId;
    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;

    public CustomLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {
        this.serviceId = serviceId;
        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
    }

    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = (ServiceInstanceListSupplier)this.serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);
        return supplier.get(request).next().map((serviceInstances) -> {
            return this.processInstanceResponse(supplier, serviceInstances);
        });
    }

    private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {
        Response<ServiceInstance> serviceInstanceResponse = this.getInstanceResponse(serviceInstances);
        if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
            ((SelectedInstanceCallback)supplier).selectedServiceInstance((ServiceInstance)serviceInstanceResponse.getServer());
        }

        return serviceInstanceResponse;
    }

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {
        if (instances.isEmpty()) {
            if (log.isWarnEnabled()) {
                log.warn("No servers available for service: " + this.serviceId);
            }

            return new EmptyResponse();
        } else {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            String ipAddress = request.getRemoteAddr();
            System.out.println("ip地址:" + ipAddress);
            int hash = instances.hashCode();
            int index = hash % instances.size();
            ServiceInstance instance = (ServiceInstance) instances.get(index);
            return new DefaultResponse(instance);
        }
    }
}

由于自定义负载均衡器和内置的负载均衡器只是在服务器选择的时候有所不同, 所以我们可以直接复制 RandomLoadBalancer 然后 在 getInstanceResponse()方法中进行改动即可

封装自定义负载均衡器

image.png

配置

image.png

缓存

Spring Cloud LoadBalancer 在获取实例时有两种选择:

  1. 及时获取: 每次都从注册中心获取到最新的实例, 效果好但是开销大
  2. 缓存服务列表: 每次得到服务列表后, 缓存一段时间,

spring Cloud LoadBalancer 默认缓存过期时间为 35s, 保存个数为 256个
我们也可以通过配置来改变这两个值

spring:
  cloud:
    loadbalancer:
      cache:
        ttl: 10
        capacity: 1000
#       enabled: false 关闭缓存

生产环境下不要关闭缓存否则会降低性能

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

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

相关文章

【Linux】文件重定向以及一切皆文件

文章目录 前言一、重定向二、系统调用dup2三、重定向的使用四、一切皆文件 前言 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2&#xff0c; 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff…

2007-2022年上市公司工业机器人渗透度数据

2007-2022年上市公司工业机器人渗透度数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;股票代码、年份、工业机器人渗透度 3、计算方式&#xff1a;首先&#xff0c;计算行业层面的工业机器人渗透度指标&#xff1b;其次&#xff0c;构建企业层面的工业机器人渗透度…

渗透必备:Proxifier玩转代理

目录 0# 概述 1# Proxifier介绍 2# 操作过程 2.1 配置代理服务器 2.2 配置代理规则 3# Proxifier玩转代理 3.0 配置说明 3.1 通过Proxifier进行内网渗透 3.2 通过Proxifier将VM虚拟机代理 3.3 通过Proxifier进行小程序抓包 3.4 补充 4# 总结 0# 概述 在日常的渗透过…

PowerBI 一些基础功能(2)

1、表时间创建&#xff1a; 日期表2 ADDCOLUMNS( CALENDAR(date(2019,1,1),date(2019,12,31)), "年", YEAR ( [Date] ), "季度", ROUNDUP(MONTH([Date])/3,0), "月", MONTH([Date]), "周", weeknum([Date]), "年季度"…

软件测试|Monkey基本参数介绍

说到android移动端稳定性测试&#xff0c;大家通常会想到android系统自动Monkey小猴子&#xff0c;通过Monkey命令模拟用户触摸点击屏幕、滑动、系统按键等操作来对设备上的app进行压力测试&#xff0c;来测试应用的稳定性和健壮性。 下面就说说monkey常用参数的用法~~ 1、-h…

Python3简易接口自动化测试框架设计与实现

1、开发环境 操作系统&#xff1a;Ubuntu18开发工具&#xff1a;IDEAPyCharm插件Python版本&#xff1a;3.6 2、用到的模块 requests&#xff1a;用于发送请求xlrd&#xff1a;操作Excel&#xff0c;组织测试用例smtplib&#xff0c;email&#xff1a;发送测试报告logging&a…

基于 Python 的课程助教智能聊天机器人

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 课程助教是高校中一种常见的教学模式,其在学生理论知识的掌握与实践能力的提高方面起到关键性的作用,已经成为高校日常教育环节中不可或缺的一环。然而,传统的人力助教有若干关键问题亟待…

字节流操作

for i in range(100):ai.to_bytes(2,byteorderbig)print(i,a,end )if i%40:print() 字节流 a5678 先把5678转换为二进制就变成 0001_0110_0010_1110拆分两个字节&#xff0c;高字节在前&#xff0c;低字节在后 hig_byte 0001_0110 对应的16进制 0x16 little_byte 0010_11…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

H5网页漫画小说苹果cms模板源码/支持对接公众号/支持三级分销

H5网页漫画小说苹果cms模板源码&#xff0c;支持对接公众号、支持三级分销&#xff0c;评论、收藏、历史记录、三级分销。 独有的模板搜索功能&#xff0c;微信、qq防红&#xff0c;站外采集接口、记录阅读章节&#xff0c;SEO优化&#xff08;后台配置&#xff09;&#xff0…

【Kurbernetes资源管理】声明式资源管理+配置清单文件详解(附实例)

声明式 一、声明式资源管理方式1.1 简介1.2 基本语法1.3 子命令详解1.3.1 获取资源配置清单1.3.2 创建/更新资源补充&#xff1a;creat和apply的区别 1.3.3 删除资源----- delete1.3.4 编辑资源配置 -----edit1.3.5 获取资源的解释-----explain 二、资源清单格式详解2.1 yaml语…

17.复制字符串 ,包括\0

#include<stdio.h> #include <cstring>int main(){int len1,len2;char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);len1strlen(s1)1;printf("先s1的字符长度为&#xff1a;%d\n",len1) ;strcpy(s1,s2) ;printf("复制字…

【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)

简介 :::warning 【 毕设项目源码推荐 javaweb 项目】 基于 springbootvue 的图书个性化推荐系统的设计与实现适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负…

el-form添加自定义校验规则校验el-input只能输入数字

0 效果 1 代码 {1,5}是用来限制小数点后几位的 addFormRules: {investAmount: [{ validator: checkInvestAmount, trigger: blur }], }, const checkInvestAmount (rule, value, callback) > {if (value ! && value ! null && value ! undefined) {if (/…

基于SSM的汽车在线租赁管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

模态对话框和非模态对话框

创建到堆区这样非模态对话框就不会一闪而过 .exec使程序进入阻塞状态 ()[]{}lambda表达式 55号属性可以在对话框关闭的时候将堆区的内存释放掉从而防止内存泄露

Python tkinter库的Menu组件实现菜单栏、一级菜单、二级菜、三级菜单

在Python的Tkinter中&#xff0c;要显示菜单栏、一级菜单、二级菜、三级菜单&#xff0c;可以使用add_cascade方法将下一级菜单添加到上一级菜单中。 运行结果 下面是一个简单的示例&#xff1a; import tkinter as tkroot tk.Tk()# 创建菜单栏 menubar tk.Menu(root) root…

Error creating bean with name ‘apiModelSpecificationReader‘ defined in URL

问题&#xff1a; 启动项目的时候&#xff0c;报错了 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name apiModelSpecificationReader defined in URL [jar:file:/D:/.gradle/caches/modules-2/files-2.1/io.springfox/sp…

openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志

文章目录 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志118.1 前提条件118.2 背景信息118.3 操作步骤 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志 118.1 前提条件 用户必须拥有审计权限。 118.2 背景信息 与审计日…

计算机基础知识49

三板斧的使用(views.py) 三个方法&#xff1a;HttpResponse: 返回的是字符串render : 返回html文件redirect : 返回加载HTML页面的 def html(request):print(from html)# return HttpResponse(request) # 它返回的是字符串return render(request,html.html) # 返回html# ret…