当前位置: 首页 > news >正文

【SpringCloud】LoadBalance-负载均衡

4. 负载均衡-LoadBalance

4.1 为什么需要负载均衡?

不知道各位心中有没有女神,通常来说一个女神就会有多个舔狗,那这些舔狗呢,就会心甘情愿的帮女神干活,假设女神小美现在有三个舔狗,小美喜欢让这三个舔狗帮她买奶茶喝,总不能一直让一个舔狗买吧,买着买着说不定那个舔狗不干了,所以得雨露均沾,那么就有两个雨露均沾的办法:

三个舔狗,每个舔狗轮流买一次。

三个舔狗,每次随机选一个舔狗买。

所以说,为什么需要负载均衡?因为需要雨露均沾,站在服务的角度说,就是不能让一个服务天天干活吧,总的分散下压力吧,比如说来了 十万个请求,有三台服务器,总不能这十万个请求都到让一个服务器去处理吧。

那么 Spring Cloud LoadBalancer 就是一个实现负载均衡的组件。

4.2 负载均衡策略

负载均衡策略是⼀种思想。无论是哪种负载均衡器。它们的负载均衡策略都是相似的。

Spring Cloud LoadBalancer 仅支持两种负载均衡策略:轮询策略和随机策略。

轮询策略: 三个舔狗轮着来,每个舔狗轮流买一次。

随机策略: 三个舔狗,每次随机选一个舔狗买。

LoadBalancer 的实现,主要是 LoadBalancerInterceptor,这个类会对 RestTemplate 的请求进行拦截,然后从Eureka 根据服务名获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务名(将获取到的 ip:端口号 替代掉服务名),这样一来,使用 LoadBalancer 就不需要咱们手动去获取指定的服务信息了。

4.3 代码实现

在 SpringCloud 项目中,想实现负载均衡很简单,先在需要远程方法调用的服务器引入这个依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

然后给咱们的 cook 服务的 RestTemplate 这个 Bean 加上 @LoadBalanced 注解就 OK了。

package com.zlcode.cook.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class BeanConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

咱们的代码实现就只讲解轮询这简单的策略就 OK了,随机策略在咱们这里的代码中就不演示了,想了解的可以自行查一下文档,也是比较简单的。

下面就需要修改 cook-service 的 CookController 的远程方法调用的代码:

package com.zlcode.cook.controller;

import jakarta.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/cook")
public class CookController {

    @Autowired
    private RestTemplate restTemplate;
    
    @RequestMapping("/ok")
    public String ok(@PathParam("content")String content) {
        String url = "http://waiter-service/up/{content}";
        String resp = restTemplate.getForObject(url, String.class, content);
        return "调用成功, 已收到 waiter 的响应: " + resp;
    }
}

接来启动三个 waiter-service 服务,分别运行在 9090,9091,9092 端口上,至于如何同一个项目同时运行在三个不同的端口上,这个不了解可以自行去搜索下,这里就不再赘述。

在这里插入图片描述

在浏览器多次刷新请求,然后观察控制台输出:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发现果然雨露均沾呀!

相关文章:

  • html处理Base文件流
  • 【C++项目】从零实现RPC框架「三」:项⽬抽象层实现
  • 动手实现docker全过程
  • python求解非线性方程组
  • 蓝桥杯——统计子矩阵
  • 设计模式学习(1)
  • 顺据结构(C\C++)——双向链表
  • 【Qt】游戏场景和图元
  • rbpf虚拟机-JIT和解释执行对比
  • 数据处理的两种范式:深入解析OLTP与OLAP系统
  • 自动驾驶实验
  • 13届省赛python A组:10.数的拆分
  • 【Linux】进程间通信(IPC)-- 无名管道、命名管道
  • 请求Header(Request Headers)详解
  • LeetCode算法题(Go语言实现)_22
  • 操作系统的运行机制
  • 运放的噪声计算
  • 同步SVPWM调制策略的初步学习记录
  • 六十天Linux从0到项目搭建(第二十四天)(共享内存)
  • 鸿蒙开发03样式相关介绍(二)
  • 软件开发商有哪些/汕头seo外包公司
  • 大连鼎信网站建设/外贸网络推广经验
  • 滁州做网站电话号码/百度培训
  • 做网站公司q房网/如何网上免费打广告
  • 仿网站源码/深圳推广服务
  • 学校手机网站模板/代发新闻稿的网站