【微服务】如何使用SpringCould实现客户端负载均衡?

 🌟🌟🌟  ❤️❤️❤️  🍎🍎🍎

哈喽~大家好,欢迎进入本人【图图是个好孩纸】的博客   🥰🥰🥰

是一名主攻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文件修改策略

这样就代表成功实现SpringCould客户端负载均衡!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图图是个好孩纸~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值