5.LoadBalancer负载均衡服务调用

目录

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

二、spring-cloud-loadbalancer概述

三、spring-cloud-loadbalancer负载均衡解析

1.负载均衡演示案例-理论

2.负载均衡演示案例-实操

按照8001拷贝后新建8002微服务

启动Consul,将8001/8002启动后注册进微服务

Consul数据持久化配置并且注册为Windows服务

方式一:编写脚本的方式

方式二:通过-data-dir进行设置consul持久化目录

消费者-订单80模块修改POM并注册进consul,新增LoadBalancer组件

订单80模块修改Controler并启动80

目前consul上的服务 将order也进行注册

测试

3.负载均衡演示案例-小总结 

编码使用DiscoveryClient动态获取所有上线的服务列表

代码解释,修改80微服务的Controller

结合前面实操,负载选择原理小总结

4.负载均衡算法原理

官网算法

默认算法

算法切换

测试


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

Ribbon简介
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是 提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
官网Ribbon维护模式信息
项目状态:维护中...
spring官网推荐Rabbon平替组件loadbalancer

二、spring-cloud-loadbalancer概述

官网: Spring Cloud Commons
官网学习地址: Cloud Native Applications
github地址: GitHub - spring-guides/gs-spring-cloud-loadbalancer: Client-Side Load-Balancing with Spring Cloud LoadBalancer :: Dynamically select correct instance for the request :: spring-cloud,spring-cloud-loadbalancer,spring-cloud-commons
loadbalancer目前在springcloudcommons下
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中提供的功能,可以实现响应式异步请求)
loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 
Nginx是 服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。 
loadbalancer 本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

三、spring-cloud-loadbalancer负载均衡解析

1.负载均衡演示案例-理论

架构说明:80通过轮询负载访问8001/8002/8003
LoadBalancer 在工作时分成两步:
第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,
默认轮询调用谁都可以正常执行。类似生活中求医挂号,某个科室今日出诊的全部医生,客户端你自己选一个。
第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个 客户端的 负载均衡器

2.负载均衡演示案例-实操

官网参考地址: Cloud Native Applications
按照8001拷贝后新建8002微服务
启动Consul,将8001/8002启动后注册进微服务
看到两个service已注册成功, 但是consul的key/value之前配置未进行持久化保存,已经不存在
Consul数据持久化配置并且注册为Windows服务
方式一:编写脚本的方式
1.D:\devSoftlconsul 1.17.0 windows 386日录下
  • 新建mydata文件夹
  • 新建文件consul start.bat后缀为.bat
2.consul start.bat内容信息
@echo.服务启动......  
@echo off  
@sc create Consul binpath= "D:\devSoft\consul_1.17.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir D:\devSoft\consul_1.17.0_windows_386\mydata   "
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul start is OK......success
@pause
3.右键管理员权限打开
4.启动结果
5. win后台
6.后续consul的配置数据会保存进mydata文件夹,关机重启数据也是存在的
或者也可以启动的时候设置consul持久化目录
方式二:通过-data-dir进行设置consul持久化目录
consul agent -server -config-dir=E:/consul/config -data-dir=E:/consul/data -bind=127.0.0.1 -bootstrap-expect=1 -ui
解释:
-consul agent:启动Consul的代理(agent)进程。Consul代理是Consul服务的核心组件,负责服务注册与发现、健康检查、键值存储等功能。
-server:指定此Consul代理以服务器模式运行。在服务器模式下,该代理将参与Raft一致性协议,能够处理集群的选举、日志复制等任务,是Consul集群中不可或缺的一部分。
-config-dir=E:/consul/config:指定一个目录,Consul会从该目录中加载额外的配置文件。这些配置文件可以是JSON或HCL格式,用于自定义Consul的行为,如服务定义、ACL策略等。
-data-dir=E:/consul/data:指定一个目录,Consul将在此目录中存储其运行所需的数据,包括服务注册信息、健康检查的状态、键值存储的数据以及Raft日志和快照等。这个目录对于Consul的数据持久化至关重要。
-bind=127.0.0.1:指定Consul代理绑定的IP地址。在这个例子中,Consul被配置为仅监听本地回环地址(127.0.0.1),这意味着它不会接受来自外部网络的连接请求,增强了安全性。这通常用于开发或测试环境。
-bootstrap-expect=1:这是一个引导模式配置,指定了Consul期望在集群中看到的服务器节点数。在这个例子中,-bootstrap-expect=1 表示这是一个单节点集群的配置。由于集群中只有一个节点,Consul将立即进入领导者模式,无需等待其他节点的加入。
-ui:启用Consul的内置Web UI。通过Web UI,用户可以方便地查看和管理Consul集群的状态,包括服务列表、健康检查、键值对等。
后台自启动Consul测试地址: http://localhost:8500
  • cloud-payment-service-8001:http://localhost:8001/pay/get/info
  • cloud-payment-service-8002:http://localhost:8002/pay/get/info
消费者-订单80模块修改POM并注册进consul,新增LoadBalancer组件
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
订单80模块修改Controler并启动80
cloud-payment-service 要与consul上注册名称一致。
@RestController
public class OrderController
{//public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称@Autowiredprivate RestTemplate restTemplate;/*** 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求* 我们模拟消费者发送get请求,but底层调用post方法,客户端消费者参数PayDTO可以不添加@RequestBody* @param payDTO* @return*/@GetMapping("/consumer/pay/add")public ResultData addOrder(PayDTO payDTO){return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);}@GetMapping("/consumer/pay/get/{id}")public ResultData getPayInfo(@PathVariable Integer id){return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/"+id, ResultData.class, id);}@GetMapping(value = "/consumer/pay/get/info")private String getInfoByConsul(){return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/info", String.class);}
}
目前consul上的服务 将order也进行注册
测试
测试地址: http://localhost/consumer/pay/get/info
通过该地址交替访问到8001、8002端口

3.负载均衡演示案例-小总结 

编码使用DiscoveryClient动态获取所有上线的服务列表
官网地址: Service Discovery with Consul :: Spring Cloud Consul
代码解释,修改80微服务的Controller
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/consumer/discovery")
public String discovery()
{List<String> services = discoveryClient.getServices();for (String element : services) {System.out.println(element);}System.out.println("===================================");List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");for (ServiceInstance element : instances) {System.out.println(element.getServiceId()+"\t"+element.getHost()+"\t"+element.getPort()+"\t"+element.getUri());}return instances.get(0).getServiceId()+":"+instances.get(0).getPort();
}

DiscoveryClient获取所有上线的服务列表数据:

cloud-consumer-order

cloud-payment-service

consul

cloud-payment-service    WIN-C38UV4TIS4J 8001     http://WIN-C38UV4TIS4J:8001

cloud-payment-service    WIN-C38UV4TIS4J 8002     http://WIN-C38UV4TIS4J:8002

结合前面实操,负载选择原理小总结
负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。
List instances = discoveryClient.getInstances("cloud-payment-service");
如: List [0] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理:
当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
如此类推......

4.负载均衡算法原理

官网算法
官网负载均衡算法地址: Cloud Native Applications
默认算法
默认两种算法轮询和随机
轮询源码实现类
public class RoundRobinLoadBalancer implementsReactorServiceInstanceLoadBalancer
随机源码实现类
public class RandomLoadBalancer implements
ReactorServiceInstanceLoadBalancer
@LoadBalancerClient 解释
自定义客户端每个服务的负载均衡配置,且服务期间相互隔离。
主要用于配置和定制特定的客户端负载均衡器行为。
@LoadBalancerClient 可以用来为特定的微服务配置负载均衡器的相关设置。通过指定name或value属性(两者通常可以互换使用),你可以指定一个服务的ID,该ID与Spring Cloud consul(或其他服务注册中心)中注册的服务名相对应。这样,你就 可以为特定的服务定制负载均衡策略、重试机制等。
在微服务架构中,不同的服务可能需要不同的负载均衡配置。@LoadBalancerClient 允许你通过为不同的服务定义不同的配置类来实现 配置的隔离。这样, 每个服务都可以根据自身的需求来定制负载均衡行为,而不会影响到其他服务。
还允许你通过configuration属性来指定一个配置类,该配置类中可以定义 自定义的负载均衡器、规则、拦截器等。
算法切换
从默认的轮询,切换为 随机算法,修改RestTemplateConfig
/*** LoadBalancer默认轮询算法切换随机算法* @LoadBalancerClient   @Bean*/
@Configuration
@LoadBalancerClient(//下面的value值大小写一定要和consul里面的名字一样,必须一样value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{@Bean@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力public RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
自定义算法
@LoadBalancerClient(name = "my-service", configuration = MyServiceLoadBalancerConfig.class)  
public class MyServiceConfiguration {  // 这里可以包含一些针对my-service的特定配置  
}  @Configuration  
public class MyServiceLoadBalancerConfig {  @Bean  public IRule myCustomRule() {  // 返回一个自定义的负载均衡规则  return new MyCustomRule();  }  
}
测试
测试地址: http://localhost/consumer/pay/get/info
实现效果:随机访问cloud-payment-service服务

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

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

相关文章

linux安装ffmpeg7.0.2全过程

​编辑 白眉大叔 发布于 2025年4月16日 评论关闭 阅读(341) centos 编译安装 ffmpeg 7.0.2 &#xff1a;连接https://www.baimeidashu.com/19668.html 下载 FFmpeg 源代码 在文章最后 一、在CentOS上编译安装FFmpeg 以常见的CentOS为例&#xff0c;FFmpeg的编译说明页面为h…

视频逐帧提取图片的工具

软件功能&#xff1a;可以将视频逐帧提取图片&#xff0c;可以设置每秒提取多少帧&#xff0c;选择提取图片质量测试环境&#xff1a;Windows 10软件设置&#xff1a;由于软件需要通过FFmpeg提取图片&#xff0c;运行软件前请先设置FFmpeg&#xff0c;具体步骤 1. 请将…

java精简复习

MyBatis批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO users(name, age) VALUES<foreach collection"list" item"item" separator",">(#{item.name}, #{item.age})</foreac…

IP 网段

以下是关于 IP 网段 的详细解析&#xff0c;涵盖基本概念、表示方法、划分规则及实际应用场景&#xff1a; 一、网段核心概念 1. 什么是网段&#xff1f; 网段指一个逻辑划分的 IP 地址范围&#xff0c;属于同一子网的设备可以直接通信&#xff08;无需经过路由器&#xff09…

模型微调参数入门:核心概念与全局视角

一、引言 在深度学习领域&#xff0c;模型微调已成为优化模型性能、适配特定任务的重要手段。无论是图像识别、自然语言处理&#xff0c;还是其他复杂的机器学习任务&#xff0c;合理调整模型参数都是实现卓越性能的关键。然而&#xff0c;模型微调涉及众多参数&#xff0c;这…

端口映射不通的原因有哪些?路由器设置后公网访问本地内网失败分析

本地网络地址通过端口映射出去到公网使用&#xff0c;是较为常用的一种传统方案。然而&#xff0c;很多环境下和很多普通人员在实际使用中&#xff0c;却往往会遇到端口映射不通的问题。端口映射不通的主要原因包括公网IP缺失&#xff08;更换nat123类似映射工具方案&#xff0…

Git Push 失败:HTTP 413 Request Entity Too Large

Git Push 失败&#xff1a;HTTP 413 Request Entity Too Large 问题排查 在使用 Git 推送包含较大编译产物的项目时&#xff0c;你是否遇到过 HTTP 413 Request Entity Too Large 错误&#xff1f;这通常并不是 Git 的问题&#xff0c;而是 Web 服务器&#xff08;如 Nginx&am…

docker-记录一次容器日志<container_id>-json.log超大问题的处理

文章目录 现象一、查找源头二、分析总结 现象 同事联系说部署在虚拟机里面的用docker启动xxl-job的服务不好使了&#xff0c;需要解决一下&#xff0c;我就登陆虚拟机检查&#xff0c;发现根目录满了&#xff0c;就一层一层的找&#xff0c;发现是<container_id>-json.l…

Ubuntu 24.04 LTS 和 ROS 2 Jazzy 环境中使用 Livox MID360 雷达

本文介绍如何在 Ubuntu 24.04 LTS 和 ROS 2 Jazzy 环境中安装和配置 Livox MID360 激光雷达&#xff0c;包括 Livox-SDK2 和 livox_ros_driver2 的安装&#xff0c;以及在 RViz2 中可视化点云数据的过程。同时&#xff0c;我们也补充说明了如何正确配置 IP 地址以确保雷达与主机…

电脑开机后长时间黑屏,桌面图标和任务栏很久才会出现,但是可通过任务管理器打开应用程序,如何解决

目录 一、造成这种情况的主要原因&#xff08;详细分析&#xff09;&#xff1a; &#xff08;1&#xff09;启动项过多&#xff0c;导致系统资源占用过高&#xff08;最常见&#xff09; 检测方法&#xff1a; &#xff08;2&#xff09;系统服务启动异常&#xff08;常见&a…

uniapp地图map支付宝小程序汽泡显示

先看原文地址&#xff1a;map | uni-app官网 气泡的显示&#xff0c;可以使用callout和label两个属性 但是如果想要气泡默认显示&#xff0c;而不是点击显示&#xff0c;则用label

信创 CDC 实战 | OGG、Attunity……之后,信创数据库实时同步链路如何构建?(以 GaussDB 数据入仓为例)

国产数据库加速进入核心系统&#xff0c;传统同步工具却频频“掉链子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、达梦等主流信创数据库&#xff0c;逐一拆解其日志机制与同步难点&#xff0c;结合 TapData 的实践经验&#xff0c;系统讲解从 CDC 捕获到实时入仓&#xff0…

Python爬虫实战:研究Selenium框架相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网页数据量呈爆炸式增长。从网页中提取有价值的信息成为数据挖掘、舆情分析、商业智能等领域的重要基础工作。然而,现代网页技术不断演进,越来越多的网页采用 JavaScript 动态加载内容,传统的基于 HTTP 请求的爬虫技术难…

【CSS border-image】图片边框拉伸不变形,css边框属性,用图片打造个性化边框

当用图片做边框时&#xff0c;还要考虑到一个问题&#xff0c;如何适应边框的宽高变化&#xff0c;并且图片不变形&#xff1f;本文深入解析 CSS border-image&#xff0c;用图片打造个性化边框。下图的效果就是利用border-image属性实现的图片边框自适应。 本文将border-imag…

14. LayUI与Bootstrap框架使用

引言 在前端开发中,UI框架可以大大提高开发效率。今天我将对比学习两个流行的前端UI框架:LayUI和Bootstrap。这两个框架各有特点,分别适用于不同的场景。 1. 框架概述 LayUI LayUI是一款国产的前端UI框架,由贤心开发,特点是轻量、简单、易用。它采用了经典的模块化方式…

购物车系统的模块化设计:从加载到结算的全流程拆解

购物车系统的模块化设计:从加载到结算的全流程拆解? 一、购物车信息分页加载模块:大数据量下的流畅体验二、商品信息展示三、购物车管理模块:操作逻辑的闭环设计四、商品金额计算模块:实时同步的动态数据中心在电商应用中,购物车页面是用户操作最频繁的核心场景之一。合理…

Veeam Backup Replication Console 13 beta 备份 PVE

前言 通过Veeam Backup & Replication控制台配置与Proxmox VE&#xff08;PVE&#xff09;服务器的连接&#xff0c;包括主机地址、用户名密码和SSH信任设置。随后详细说明了部署备份Worker虚拟机的步骤&#xff0c;涵盖网络配置和VM创建。接着指导用户创建PVE虚拟机备份任…

C++ 写单例的办法

先在头文件声明&#xff1a; 声明一个COemInstancer的 _this指针&#xff1a; static COemInstance* _this; .然后在文件外层这样写&#xff1a; #define CXXModule COemInstance::instance() #define ExecuteCommand(ClassName,RunCommand) class Tempclass##ClassName\ …

ETL工具:Kettle,DataX,Flume,(Kafka)对比辨析

1. 各自特点 Kettle&#xff1a; 侧重数据处理与转换&#xff1a;具备强大的数据转换和处理能力&#xff0c;能对数据进行清洗&#xff08;如去除重复值、处理缺失值 &#xff09;、转换&#xff08;如数据类型转换、计算派生字段 &#xff09;、过滤等操作。例如&#xff0c…

28、请求处理-【源码分析】-请求映射原理

28、请求处理-【源码分析】-请求映射原理 Spring Boot 的请求映射原理主要基于 Spring MVC 框架&#xff0c;通过 DispatcherServlet 前端控制器实现。以下是详细的请求映射过程&#xff1a; ### 1. 请求进入 DispatcherServlet 当客户端发送请求时&#xff0c;首先由 Dispatch…