【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 端口上,至于如何同一个项目同时运行在三个不同的端口上,这个不了解可以自行去搜索下,这里就不再赘述。

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发现果然雨露均沾呀!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿教你打篮球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值