SpringCloud LoadBalancer

SpringCloud LoadBalancer

1.什么是LoadBalancer

LoadBalancer(负载均衡器)是一种网络设备或软件机制,用于分发传入的网络流量负载请求到多个后端目标服务器上,从而实现系统资源的均衡利用和提高系统的可用性和性能。
负载均衡器(LoadBalancer)就像是一位交通指挥官,它的工作是管理到达一个网站或应用的所有网络流量。想象一下,如果很多人同时访问同一个网站,就像是一群车辆同时开进一个十字路口。如果没有交通指挥,路口就会变得非常拥堵,车辆难以通行。同样地,在网络世界里,如果很多用户同时向一个服务器发送请求(比如打开网页、下载文件等),服务器可能会因为处理不过来而变得缓慢甚至崩溃。这时候,负载均衡器就像交通指挥一样,它会将流量分散到多个服务器上,确保每台服务器只处理它能够应付的流量量。这样,就算有很多用户同时访问,网站或应用也能平稳运行,每个用户都能获得良好的体验。
简而言之,负载均衡器的任务就是确保网络流量均匀分布,防止任何单一服务器因为过载而出现问题,从而保持整个网络系统的稳定和高效。

1.1负载均衡的分类

对于java程序员,只需要知道负载均衡分为服务器负载均衡和客户端 负载均衡
1.服务器负载均衡指的是存放在服务器端的负载均衡器,例如Nginx,HAProxy,F5
服务器端负载均衡是指负载均衡逻辑被实现在网络层面,通常由专门的硬件或软件(如负载均衡器)完成。在这种策略中,客户端向一个统一的地址发送请求,负载均衡器负责将请求分发到后端的多个服务器上。
步骤:
1.接收请求:负载均衡器接收到客户端的请求。
2.选择算法:负载均衡器使用某种算法选择一个后端服务器。
3.转发请求:负载均衡器将请求转发到选定的服务器。

优点:
对客户端透明,客户端不需要知道后端服务的具体分布。
统一管理,负载均衡策略的更改和维护更容易。

缺点:
可能会成为性能瓶颈和单点故障。
网络延迟可能会稍微增加,因为所有请求都需要经过负载均衡器。

2.客户端负载均衡值得是嵌套在客户端的负载均衡器,例如Ribbon,SpringCloud LoadBalancer
客户端负载均衡是指负载均衡逻辑被实现在客户端。在这种策略中,客户端负责决定将请求发送到哪个服务器。这通常涉及到以下几个步骤:
1.服务发现:客户端首先从服务注册中心获取所有可用服务实例的列表。
2.选择算法:客户端使用某种算法(如轮询、随机、最少连接等)从这些服务实例中选择一个。
3.发送请求:客户端直接将请求发送到选定的服务实例。

优点:
更灵活,可以根据客户端的具体需求和环境定制负载均衡策略。
减少了网络延迟,因为决策是在客户端本地进行的。

缺点:
增加了客户端的复杂性。
所有客户端都需要实现负载均衡逻辑。

1.2常见的负载均衡策略(不区分类型的)

  1. 轮询(Round Robin)
    描述:轮询是最简单的负载均衡策略,它按顺序将每个新请求分配给下一个服务器。当到达列表末尾时,它会重新开始。
    使用场景:适用于服务器性能相似且负载相对均衡的情况。
  2. 加权轮询(Weighted Round Robin)
    描述:与轮询类似,但给每个服务器分配一个权重。服务器的权重越高,分配给该服务器的请求就越多。
    使用场景:适用于服务器性能不均或希望给特定服务器更多流量的情况。
  3. 随机(Random)
    描述:随机选择一个服务器来处理新的请求。
    使用场景:适用于服务器数量较多且请求分布均匀的场景。
  4. 加权随机(Weighted Random)
    描述:类似于随机策略,但考虑服务器的权重。权重越高的服务器被选中的概率越大。
    使用场景:当服务器性能不均匀时,希望根据性能分配不同的请求量。
  5. 最小连接(Least Connections)
    描述:选择当前连接数最少的服务器来处理新的请求。这种方法考虑了服务器的当前负载。
    使用场景:适用于请求处理时间波动较大的场景。
  6. 加权最小连接(Weighted Least Connections)
    描述:与最小连接策略类似,但考虑了服务器的权重和当前连接数。
    使用场景:当服务器性能不同且请求处理时间不一致时使用。
  7. 基于资源(Resource Based)
    描述:根据服务器的实际资源使用情况(如CPU、内存使用率)来分配请求。
    使用场景:适用于资源敏感型应用,如高CPU或内存需求的应用。
  8. IP哈希(IP Hash)
    描述:根据请求的源IP地址进行哈希计算,然后分配到特定的服务器。这样可以保证来自同一IP地址的请求总是被发送到同一个服务器。
    使用场景:适用于需要保持用户会话(session)一致性的场景。
    SpringCloud LoadBalancer内置的策略只有轮询和随机,其他可以自己写

2.如何使用SpringCloud LoadBalancer

在项目种添加Spring Cloud OpenFeign和Nacos之后,再添加SpringCloud LoadBalancer,就会在进行接口调用的时候直接使用SpringCloud LoadBalancer

3.轮询负载均衡策略

SpringCloud LoadBalancer默认是轮询的负载均衡策略
具体配置请看我nacos文章,我直接上代码了
消费者

import com.example.consumer.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getname")public String getName(@RequestParam("id") Integer id){return userService.getName(id);}
}
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Service
@FeignClient("loadbalancer-service")
public interface UserService {@RequestMapping("/user/getname")String getName(@RequestParam("id") Integer id);
}

生产者

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate ServletWebServerApplicationContext context;@RequestMapping("/getname")public String getName(@RequestParam("id") Integer id){return context.getWebServer().getPort()+":Producer-port-"+id;}
}

4.随机负载均衡

实现随机负载均衡策略的步骤如下:
1.创建随机负载均衡策略(不用记,用的时候直接复制粘贴)
在这里插入图片描述


import org.springframework.cloud.client.ServiceInstance;
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.core.env.Environment;public class RandomLoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

2.设置随机负载均衡策略
2.1设置局部随机负载均衡策略(有时候可能会失灵,官方bug)
在这里插入图片描述

import com.example.consumer.config.RandomLoadBalancerConfig;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Service
@FeignClient("loadbalancer-service")
@LoadBalancerClient(name="loadbalancer-service",configuration = RandomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")String getName(@RequestParam("id") Integer id);
}

2.2设置全局随机负载均衡策略(建议)
在这里插入图片描述

@SpringBootApplication
@EnableFeignClients
@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

6.Nacos权重负载均衡器

1.新建Nacos负载均衡器
在这里插入图片描述

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
import com.alibaba.nacos.client.env.NacosClientProperties;
import jakarta.annotation.Resource;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
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.core.env.Environment;@LoadBalancerClients(defaultConfiguration = NacosLoadBalancerConfig.class)
public class NacosLoadBalancerConfig {@Resourceprivate NacosDiscoveryProperties nacosDiscoveryProperties;@BeanReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new NacosLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name,nacosDiscoveryProperties);}
}

2.设置负载均衡器
和上面一样,只不过configuration /defaultConfiguration 后面变成NacosLoadBalancerConfig.class,这个Nacos的负载均衡器,局部的就没问题,可以自己在nacos里面调整权重自己测,官方bug

7.缓存

SpringCloud LoadBalancer在获取实例的时候有两种选择
1.及时获取:每次从注册中心得到最新健康的实例,效果好,开销大
2.缓存服务列表:每次得到服务列表之后,缓存一段时间,这样既能保证性能,同时也能兼容一定的及时性
而SpringCloud LoadBalancer中默认开启了缓存服务列表的功能
SpringCloud LoadBalancer默认缓存的重要特性有两项:
1.缓存的过期时间为35秒
2.缓存保存个数为256个
设置方式如下

server:port: 8080
spring:cloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-enabled: false # 当前服务不注册到nacos里面loadbalancer:cache:enabled: false # 关闭LoadBalancer缓存ttl: 35scapacity: 1024 #重启就没有了,因为是内存级别的

PS:建议开启缓存,因为效率高

8.执行原理

OpenFeign底层是通过HTTP客户端对象RestTemplate实现接口请求的,而负载均衡器的作用只是在请求客户端发送之前,得到一个服务器的地址给RestTemplate对象。
它可以执行:
1.流量分发:当用户或客户端发起请求时,请求首先到达负载均衡器。负载均衡器根据预定义的规则(比如轮询、最少连接数、最快响应时间等)决定将请求发送到哪个服务器。

2.健康检查:负载均衡器定期检查所有服务器的健康状态。如果某个服务器出现问题(比如宕机或响应过慢),负载均衡器会将其从流量分配中移除,直到该服务器恢复正常。

3.提高可用性:通过分散流量到多个服务器,负载均衡器减少了任何单点故障的可能性,并确保高可用性。

4.弹性扩展:根据流量的增加,可以向负载均衡器后面添加更多的服务器来处理增加的负载。

9.RestTemplate 和@RequestMapping 区别

RestTemplate 主要用于在你的应用程序中作为客户端发送请求到其他服务。
@RequestMapping 主要用于在你的 Spring MVC 应用程序中处理来自客户端的请求。
两者的主要区别在于 RestTemplate 是用于发出请求的,而 @RequestMapping 是用于接收和处理请求的。

10.Rest服务

REST服务(Representational State Transfer,表现层状态转移)指的是遵循REST原则和约束的Web服务。REST是一种软件架构风格,它定义了一套规则和原则,用于设计网络应用程序中的分布式系统。REST服务通常使用HTTP协议作为通信手段,并广泛应用于构建网络服务(如API)。

REST服务的主要特点包括:
1.无状态(Stateless):每个请求从客户端到服务器必须包含理解和处理请求所需的所有信息,不依赖于服务器的上下文或会话状态。

2.统一接口(Uniform Interface):REST定义了一组操作原则,使不同的系统可以通过统一的接口交互。这包括使用标准的HTTP方法(如GET, POST, PUT, DELETE等)。

3.可寻址资源(Addressable Resources):在REST架构中,所有的东西都被认为是资源,并且每个资源都有一个唯一的标识符,通常是URI。

4.表示(Representation):资源可以有一个或多个表示形式,例如JSON, XML, HTML等。客户端和服务器通过这些表示形式交换资源状态。

5.客户端-服务器(Client-Server):REST应用遵循客户端-服务器架构。客户端负责用户界面和用户状态,而服务器负责存储数据和资源状态。

6.可缓存(Cacheable):REST服务的响应应该被明确标记为可缓存或不可缓存,以提高网络效率。

让我用更简单的话来解释一下什么是REST服务。
想象一下,你正在使用一个手机应用来查看天气。当你打开这个应用,它会向某个服务器发送一个请求,比如“请告诉我北京今天的天气”。这个请求通过互联网发送,服务器接收到后,就会查找北京今天的天气信息,并把这个信息以一种易于理解的格式(比如JSON)发送回你的手机应用。然后,你的应用就会展示这些天气信息。

在这个过程中,你的手机应用和天气信息服务器之间就是通过REST服务进行交互的。这里的关键点是:

1.请求和响应:你的应用发送一个请求,服务器回应这个请求。

2.无状态:每次请求都是独立的,服务器不需要记住之前的请求。每次请求都包含了服务器需要的全部信息。

3.简单的通信方式:这些请求通常通过HTTP(就是你在网址栏看到的http://那部分)完成,使用标准的方法,如GET(获取信息)、POST(发送新信息)、PUT(更新信息)和DELETE(删除信息)。

4.资源的标识:在REST服务中,每个可以获取的信息(比如天气信息)被视为一个资源,这些资源通过URI(统一资源标识符,类似网址)来识别。

所以,简单来说,REST服务就是一种规则,它定义了应用程序如何通过网络(比如互联网)发送和接收数据的方法。

REST服务由于其简洁性、易用性和可扩展性,在现代Web应用和微服务架构中非常受欢迎。

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

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

相关文章

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

Springboot做查询数据库某个表的数据时,后台一切正常前台显示不了数据

当我在用springboot做项目的时候查询整个表的数据或者条件查询的时候发现我的后台功能一切正常但是我的前台界面就是显示不了数据&#xff0c;这个问题解决也很简单&#xff0c;就是需要我们平时多加注意&#xff0c;不要漏代码&#xff01;&#xff01;&#xff01; Builder …

Visual Studio 2022 打开“程序包管理器控制台”失败

Visual Studio 2022 打开“程序包管理器控制台”失败 昨天下午&#xff0c;正在用Visual studio 2022写代码&#xff0c;当使用EF core 做数据迁移时&#xff0c;需要用到“程序包管理器控制台”&#xff0c;打开失败&#xff0c;前一秒还好好的&#xff0c;怎么突然就用不了了…

互联网加竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

力扣136、只出现一次的数字(简单)

1 题目描述 图1 题目描述 2 题目解读 在非空整数数组nums中&#xff0c;有一个元素只出现了一次&#xff0c;其余元素均出现两次。要求找出那个只出现一次的元素。 3 解法一&#xff1a;位运算 位运算&#xff0c;是一种非常简便的方法。 3.1 解题思路 异或运算&#xff0c;有…

CPN故障诊断(MATLAB)

CPN(Colored Petri Net,彩色Petri网)是在传统Petri网的基础上进行扩展的高级Petri网。它在故障诊断领域有着广泛的应用。 CPN故障诊断的主要思想和步骤如下: 建模:根据系统的结构和功能,采用CPN构建系统的模型。将系统不同组件表示为网的位置,数据/信号流表示为网的转换,故障…

如何通过Hive/tez与Hadoop的整合快速实现大数据开发

一、Hive的功能 Hive是基于Hadoop的一个外围数据仓库分析组件&#xff0c;可以把Hive理解为一个数据仓库&#xff0c;但这和传统的数据库是有差别的。 传统数据库是面向业务存储&#xff0c;比如 OA、ERP 等系统使用的数据库&#xff0c;而数据仓库是为分析数据而设计的。同时…

4D毫米波雷达分类和工程实现

4D毫米波目标检测信息丰富&#xff0c;可获得目标3维位置信息、径向速度vr和rcs等&#xff0c;能够对目标准确分类。 4D毫米波和激光做好时空同步&#xff0c;可以用激光目标给4D毫米波做标注&#xff0c;提升标注效率。 1 激光用做4D毫米波分类真值 128线激光推理的结果作为4…

ChatGPT学python: 用json文件传参

目录 json语法最简陋版python解析语法小结 json语法最简陋版 param.json [{"Table_name": "table1","Event_name_colum": 4,"update_colum": 9},{"Table_name": "table2","Event_name_colum": 3,&quo…

Windows编程入门-窗口控件-资源操作

window控件&#xff1a; 控件是常见的窗口上的交互元素例如&#xff1a;一个按钮&#xff0c;一个复选框&#xff0c;一个列表框等。 当控件的特定功能被触发后&#xff0c;会主动发送消息通知父窗口&#xff0c;父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…

[AG32VF407]国产MCU+FPGA Verilog编写控制2路gpio输出不同频率方波实验

视频讲解 [AG32VF407]国产MCUFPGA Verilog编写控制2路gpio输出不同频率方波实验 实验过程 根据原理图&#xff0c;选择两个pin脚作为输出 修改VE文件&#xff0c;clk选择PIN_OSC&#xff0c;使用内部晶振8Mhz&#xff0c;gpio使用PIN_51和52&#xff0c;pinout是数组 添加pll…

Uniapp小程序端打包优化实践

背景描述&#xff1a; 在我们最近开发的一款基于uniapp的小程序项目中&#xff0c;随着功能的不断丰富和完善&#xff0c;发现小程序包体积逐渐增大&#xff0c;加载速度也受到了明显影响。为了提升用户体验&#xff0c;团队决定对小程序进行一系列打包优化。 项目优化点&…

CentOS 7如何修改用户密码

一、问题 CentOS 7如何修改用户密码&#xff1f; 二、解答 1、passwd命令 [rootlocalhost ~]# passwd 用户名#需要在root用户下修改 [rootlocalhost ~]# su root#切换到root下&#xff0c;输入密码 #修改用户的密码&#xff0c;按提示输入新密码和确认密码&#xff0c;密码是…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器&#xff0c;未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】&#xff0c;查看运行结果

安装并开始设置 Windows 终端(命令提示符或Windows PowerShell或Azure Cloud Shell)

安装 安装 若要试用最新的预览功能&#xff0c;可能还需要安装 Windows 终端预览。 ‼️备注 如果你无法访问 Microsoft Store&#xff0c;GitHub 发布页上发布有内部版本。 如果从 GitHub 安装&#xff0c;Windows 终端将不会自动更新为新版本。 有关使用包管理器&#xff…

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标&#xff1a; Application.cpp:把渲染循环里的glad代码封装成自己的类&#xff1a; #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

Android Studio使用小记

复制了一个原来的项目&#xff0c;准备基于它调整一个OEM版本 因为svn服务器上分出了一个单独的版本&#xff0c;于是在工程目录下手工删除了.svn文件&#xff0c;并手工去除了vcs.xml <?xml version"1.0" encoding"UTF-8"?> <project versi…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容&#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例&#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…

高通GAIA V3命令参考手册的研读学习(十三):GAIA通知

如前文《高通GAIA V3命令参考手册的研读学习&#xff08;四&#xff09;》所述&#xff0c;PDU一共有四种&#xff0c;前面已经讲了命令、回应以及错误码&#xff0c;现在来看最后一种&#xff1a;通知。 4. QTIL GAIA通知 通知发送的方向&#xff0c;是由设备发送到移动应用…