LoadBalance 负载均衡

2024-06-24 09:12
文章标签 loadbalance 负载 均衡

本文主要是介绍LoadBalance 负载均衡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是负载均衡

        负载均衡(Load Balance,简称 LB),是⾼并发,⾼可⽤系统必不可少的关键组件.

        当服务流量增⼤时,通常会采⽤增加机器的⽅式进⾏扩容,负载均衡就是⽤来在多个机器或者其他资源中,按照⼀定的规则合理分配负载.

负载均衡的⼀些实现

        服务多机部署时,开发⼈员都需要考虑负载均衡的实现,所以也出现了⼀些负载均衡器,来帮助我们实现负载均衡.

        负载均衡分为服务端负载均衡和客户端负载均衡.

服务端负载均衡

        在服务端进⾏负载均衡的算法分配.⽐较有名的服务端负载均衡器是 Nginx.请求先到达 Nginx负载均衡器,然后通过负载均衡算法,在多个服 务器之间选择⼀个进⾏访问.

        个人理解:服务端的负载均衡是在服务器前有一个负载均衡器获取所有的请求,并将请求按照负载均衡算法分发给各个服务器。

客户端负载均衡

        在客户端进⾏负载均衡的算法分配.

        把负载均衡的功能以库的⽅式集成到客户端,⽽不再是由⼀台指定的负载均衡设备集中提供.⽐如 Spring Cloud 的 Ribbon,客户端从注册中⼼(⽐如 Eureka )获取服务列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进⾏访问.Ribbon 是 Spring Cloud 早期的默认实现,由于不维护了, 所以最新版本的 Spring Cloud 负载均衡集成的是 Spring Cloud LoadBalancer(Spring Cloud 官⽅维护)

        

        个人理解:相当于在请求从客户端发出前就通过负载均衡决定好了要将请求发送给哪个服务器

Spring Cloud LoadBalancer

        SpringCloud 从 2020.0.1 版本开始,移除了 Ribbon 组件,使⽤Spring Cloud LoadBalancer 组件来代替 Ribbon 实现客户端负载均衡.

        使⽤ Spring Cloud LoadBalancer 实现负载均衡

1.添加 @LoadBalanced 注解

        给 RestTemplate 这个Bean添加 @LoadBalanced 注解就可以在发送 HTTP 请求时,获取服务列表,再根据负载均衡算法,将请求发送给选中的服务器

@Configuration
public class BeanConfig {@Bean//加上 @LoadBalanced 注解,RestTemplate 对象在发送请求给服务提供者时,如果服务提供者有多个,会进行负载均衡@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

2.修改 IP 端⼝号为服务名称

        加上 @LoadBalanced 注解后 RestTemplate 会根据服务名称去注册中心获取服务列表,并通过负载均衡算法选出其中的一个服务器,并将该服务器的 IP 地址和端口号替换掉服务名称

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url="http://product-service/product/info/"+orderInfo.getProductId();//通过 restTemplate 发送 HTTP 请求到指定的接口,并将响应数据封装成对象ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

负载均衡策略

        负载均衡策略是⼀种思想,⽆论是哪种负载均衡器,它们的负载均衡策略都是相似的.Spring Cloud LoadBalancer 仅⽀持两种负载均衡策略:轮询策略和随机策略

1. 轮询(Round Robin):轮询策略是指服务器轮流处理⽤户的请求.这是⼀种实现最简单,也最常⽤的策略.

2. 随机选择(Random):随机选择策略是指随机选择⼀个后端服务器来处理新的请求.

        Spring Cloud LoadBalancer默认负载均衡策略是轮询策略,实现是 RoundRobinLoadBalancer

        可以通过如下代码不使用 LoadBalanced 简单实现负载均衡-轮询策略

@Service
@Slf4j
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;//注入 DiscoveryClient 对象,来从注册中心拉取服务列表@Autowiredprivate DiscoveryClient discoveryClient;实例化一个原子类的 Integer 对象记录请求次数private AtomicInteger atomicInteger=new AtomicInteger(1);public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);从 eureka 注册中心获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");int index=atomicInteger.getAndIncrement()%instances.size();String uri = instances.get(0).getUri().toString();log.info(uri);String url=uri+"/product/info/"+orderInfo.getProductId();//通过 restTemplate 发送 HTTP 请求到指定的接口,并将响应数据封装成对象ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

自定义负载均衡策略

修改负载均衡策略为随机策略

1. 定义随机算法对象,通过 @Bean 将其加载到 Spring 容器中

        此处使⽤ Spring Cloud LoadBalancer 提供的 RandomLoadBalancer

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

注意:该类需要满⾜:

1. 不⽤ @Configuration 注释

2. 在组件扫描范围内

2.使⽤ @LoadBalancerClient 或者 @LoadBalancerClients 注解

        在 RestTemplate 配置类上⽅,使⽤ @LoadBalancerClient 或 @LoadBalancerClients 注解,可以对不同的服务提供⽅配置不同的客户端负载均衡算法策略.

@LoadBalancerClient(name = "product-service", configuration = 
LoadBalancerConfig.class)
@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

@LoadBalancerClient 注解说明

1. name:该负载均衡策略对哪个服务⽣效(服务提供⽅)

2. configuration:该负载均衡策略⽤哪个负载均衡策略实现.

服务部署(Linux)

服务构建打包

        采⽤ Maven 打包,需要对3个服务分别打包: eureka-server,order-service,product-service

1. 打包⽅式和 SpringBoot 项⽬⼀致,依次对三个项⽬打包即可.

启动服务

1. 上传Jar包到云服务器

第⼀次上传需要安装 lrzsz

apt install lrzsz

直接拖动⽂件到xshell窗⼝,上传成功.

2. 启动服务

#后台启动eureka-server, 并设置输出⽇志到logs/eureka.log
nohup java -jar eureka-server.jar >logs/eureka.log &
#后台启动order-service, 并设置输出⽇志到logs/order.log
nohup java -jar order-service.jar >logs/order.log &
#后台启动product-service, 并设置输出⽇志到logs/order.log
nohup java -jar product-service.jar >logs/product-9090.log &

再多启动两台 product-service 实例

#启动实例, 指定端⼝号为9091
nohup java -jar product-service.jar --server.port=9091 >logs/product-9091.log &
#启动实例, 指定端⼝号为9092
nohup java -jar product-service.jar --server.port=9092 >logs/product-9092.log &

这篇关于LoadBalance 负载均衡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089726

相关文章

Nginx基础. 防止惊群与子进程之间的负载均衡

作为服务器子进程, 每个worker进程都需要处理大量网络事件. 而网络事件的处理来源于对监听端口新连接的建立. 当有多个worker进程同时监听同一个(或多个)端口时, 建立连接就没那么简单了. Nginx出于充分发挥多核CPU性能的考虑, 则使用了多个worker子进程的设计. 这样多个子进程在accept建立连接时候就会有争抢, 产生"惊群"问题. 有的系统可能在内核就解决了这个问题

软负载均衡和F5负载均衡(硬负载均衡)区别

1. 负载均衡 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备 和 服务器 的带宽、增加 吞吐量 、加强网络数据处理能力、提高网络的灵活性和可用性。        负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

什么是负载均衡技术?

随着网络技术的快速发展,互联网行业也越来越广泛,人们的日常生活中也离不开网络技术,大量的用户进行浏览访问网站时,企业会使用负载均衡技术,降低当前网站的负载,以此来提高网站的访问速度。 今天小编就来给大家介绍一下什么是负载均衡。 负载均衡是一种计算机技术,负载均衡时建立在现有的网络结构上的,负载均衡会提供一种廉价但是有效透明的方法来扩展网络设备和服务器带宽、加强网络数据的处理能力,并且还

3D图形渲染通道负载优化的几种小技巧

一般来说, 定位渲染通道瓶颈的方法就是改变渲染通道每个步骤的工作量, 如果吞吐量也改变了, 那个步骤就是瓶颈. 找到了瓶颈就要想办法消除瓶颈, 可以减少该步骤的工作量, 增加其他步骤的工作量. 一般在光栅化之前的瓶颈称作”transform bound”, 三角形设置处理后的瓶颈称作”fill bound” 定位瓶颈的办法 1.         改变帧缓冲或者渲染目标(Ren

[负载均衡详解]

负载均衡技术: 一、负载均衡集群技术的实现: 负载均衡技术类型:基于 4 层负载均衡技术和基于 7 层负载均衡技术 负载均衡实现方式:硬件负载均衡设备或者软件负载均衡 硬件负载均衡产品:F5 、深信服 、Radware 软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx 二、四层负载均衡(基于IP+端口的负载均衡): F5:硬件负载

Windows平台分布式架构实践 - 负载均衡(上)

概述   最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行。那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可

Linux环境下,怎么排查os中系统负载过高的原因瓶颈?

在Linux环境下排查系统负载过高的原因和瓶颈,可以采取以下步骤: 使用top或htop命令观察系统整体负载情况。查看load average的值,分别表示系统在1分钟、5分钟和15分钟内的平均负载。如果负载值超过CPU核心数量的70-80%,表示系统负载过高。 使用top或htop命令查看CPU占用率。观察哪些进程占用了大量的CPU资源。如果有某个进程持续高CPU占用,可能是引起负载过高的

查看io负载的命令

查看io vmstat 2iostat 2 查看负载 uptime 隔几秒查看命令 watch 文件只读 加锁 sudo chattr +i filename 查看加锁文件 lsattr 查看要命的进程 ps awx -o pid,ppid,user,%cpu,vsz,wchan,command --sort=+%cpu,-command,+ppid,+pid | e

服务器负载均衡

什么是服务器负载 1. 常见理解的平均负载 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况。比如下列情况 [root@kube-node1 ~]# uptime09:44:37 up 74 days, 11:53, 1 user, load average: 0.49, 0.79, 0.87# 09:44:37 当前时间

nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】

Nginx是一款非常优秀的HTTP服务器软件,性能比tomcat更优秀,它支持高达50 000个并发连接数,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,提升整个站点的负载并发能力。 一、nginx负载均衡         Nginx负载均衡是通过反向代理实现的,还可以将ng