🌟🌟🌟 ❤️❤️❤️ 🍎🍎🍎
哈喽~大家好,欢迎进入本人【图图是个好孩纸】的博客 🥰🥰🥰
是一名主攻Java后端的程序猿,对前端也有一定的了解,未来持续更新更多的【后端技术】&【学习心得】🔆🔆🔆
如果对【Java后端技术】感兴趣的大可爱或小可爱,欢迎关注【图图是个好孩纸】💕💕💕
🌟🌟🌟 ❤️❤️❤️ 🍎🍎🍎
💦 1、为什么需要负载均衡
在网站创立初期,我们一般都使用单台机器对台提供集中式服务,但是随着业务量越来越大,无论是性能上还是稳定性上都有了更大的挑战。
这时候我们就会想到通过扩容的方式来提供更好的服务。我们一般会把多台机器组成一个集群对外提供服务。
然而,我们的网站对外提供的访问入口都是一个的,比如www.baidu.com。那么当用户在浏览器输入www.baidu.com的时候如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情。
针对以上情况的解决方案:
(1) 服务器进行硬件升级:采用高性能服务器替换现有低性能服务器。
该方案的弊端:
高成本:高性能服务器价格昂贵,需要高额成本投入,而原有低性能服务器被闲置,造成资 源浪费。
可扩展性差:每一次业务量的提升,都将导致再一次硬件升级的高额成本投入,性能再卓越 的设备也无法满足当前业务量的发展趋势。
(2)组建服务器集群:利用负载均衡技术在服务器集群间进行业务均衡
该方案的优势:
低成本
可扩展性:当业务量增长时,系统可通过增加服务器来满足需求,且不影响已有业务,不降低服务质量
高可靠性:单台服务器故障时,由负载均衡设备将后续业务转向其他服务器,不影响后续业务提供,保证业务不中断。
💦 2、负载均衡的作用
1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力)
2.提供故障转移,实现高可用
3.通过添加或减少服务器数量,提供网站伸缩性(扩展性)
4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)
通俗来讲:作用在于通过某种负载分担技术,让所有节点以最小的代价、最好的状态对外提供服务,快速获取重要数据,最大化降低了单个节点过载、甚至crash的概率,解决大量并发访问服务问题。
💦 3、负载均衡有哪些
DNS域名解析负载均衡:利用DNS处理域名解析请求的同时进行负载均衡是另一种常用的方案。
数据链路层负载均衡:在通信协议的数据链路层修改mac地址进行负载均衡。
IP负载均衡:在网络层通过修改请求目标地址进行负载均衡。
HTTP重定向负载均衡:这种负载均衡方案的优点是比较简单,缺点是浏览器需要每次请求两次服务器才能拿完成一次访问,性能较差;使用HTTP302响应码重定向,可能是搜索引擎判断为SEO作弊,降低搜索排名。
反向代理负载均衡:反向代理服务器转发请求在HTTP协议层面,因此也叫应用层负载均衡。优点是部署简单,缺点是可能成为系统的瓶颈。
Spring cloud的ribbon是客户端负载均衡
Nginx是服务器端的负载均衡
💦 4、负载均衡算法
1、随机算法
2、轮询及加权轮询
3、最小连接及加权最小连接
4、Hash(源地址散列)
5、IP地址散列
6、URL散列等算法
💦 5、使用Spring Cloud的负载均衡Ribbon
首先要有多个提供者,提供者的服务名要相同。在同一机器上端口号要不一样。消费者可以用一个来调用提供者。
💦 6、创建两个提供者
第一个工程user-provider的application.yml文件如下:
server:
port: 7001 #此处是第一个提供者的yml文件
spring:
application:
name: user-provider #应用名称不用改
eureka:
client:
service-url:
defaultZone: http://192.168.1.1:7777/eureka/ # 此处为你的注册服务机地址
第一个工程user-provider中修改UserController类
package com.dm.controller;
//导包省略
@RestController
public class UserController {
@PostMapping("/login")
public String login(@RequestBody User user) {
return "第一个提供者提供方法成功 " +user;
}
}
修改第二个工程user-provider的application.yml文件如下:
server:
port: 7002 #此处是第二个提供者的yml文件,要修改此端口号
spring:
application:
name: user-provider #应用名称不用改
eureka:
client:
service-url:
defaultZone: http://192.168.1.1:7777/eureka/ # 此处为你的注册服务机地址
第二个工程user-provider中修改UserController类
package com.dm.controller;
//导包省略
@RestController
public class UserController {
@PostMapping("/login")
public String login(@RequestBody User user) {
return "第二个提供者提供方法成功 " +user;
}
}
💦 7、修改消费者工程
常见的负载均衡策略:
- RoundRobinRule(轮询模式)
- RandomRule(随机策略)
- BestAvailableRule(并发量)
- AvailabilityFilteringRule(服务器状态)
- WeightedResponseTimeRule(根据响应时间)
- RetryRule(根据策略+重试)
- ZoneAvoidanceRule(Zone状态+服务状态)
在user-comsumer工程(消费者)的application.yml中增加策略
server:
port: 7501
spring:
application:
name: user-consumer
eureka:
client:
service-url:
defaultZone: http://192.168.1.1:7777/eureka/ #此处为你的注册服务地址
# 启动熔断器
feign:
hystrix:
enabled: true
# 配置指定项目使用负载策略 默认是轮询
dm-user-provider: #提供者spring.application.name值 下面使用了轮询策略
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
💦 8、重启测试
一共有二个提供者,一个消费者进行重启测试
访问:
http://localhost:7501/userLogin?userName=张三&age=18
首次页面提示如下表示成功
收到结果: 第一个提供者提供方法成功 张三 18
再次访问页面提示如下表示成功
收到结果: 第二个提供者提供方法成功 张三 18
最后你也可以尝试使用其他负载均衡策略,只需要在客户端(消费者)中的yaml文件修改策略