【Spring Cloud Alibaba】005-Ribbon 与 LoadBalancer 负载均衡
文章目录
一、负载均衡介绍
不错的文章:https://www.jianshu.com/p/cba6b0da0541
**负载均衡器ribbon和LoadBalancer:**https://blog.youkuaiyun.com/qq_40182873/article/details/128210251
1、目前主流的两种负载均衡方案
- 集中式负载均衡,在客户端和服务器之间提供中间方使用独立的代码方式进行负载均衡。硬件(如 F5 (直接与交换机连接)),软件(如 Nginx ,一般够用,除非是一线互联网公司才会用到硬件的负载均衡)。
- 客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端做负载均衡。
2、Spring Cloud Ribbon
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具,Ribbon 客户端组件提供一系列完善的配置,如超时、重试等。通过 Load Balancer 获取到服务提供的所有实例,Ribbon 会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon 也可以实现我们自己的负载均衡算法。
3、常见的负载均衡算法
-
随机,通过随机选择服务进行执行,一般这种方式使用较少;
-
轮询,负载均衡默认实现方式,请求来之后排队处理;
-
加权轮询,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
-
地址Hash,通过客户端请求的地址的 HASH 值取模映射进行服务器调度。 ip —>hash
-
最小连接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分
配到当前压力最小的服务器上。
二、默认负载均衡策略
1、Nacos 使用 Ribbon
低版本默认集成了,高本版需要添加依赖!
注意:因为Netflix的组件从2020年开始停止维护,因此spring cloud会逐渐弃用他家的组件,Ribbon就在其中,你可以搜一个github里面spring-cloud-alibaba的issues,有人有这部分的回答,解决方案有两种:
1.使用spring-cloud-loadbalancer代替ribbon,在项目中引用
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
- 降级,参照spring-cloud-alibaba的版本对应关系,不要使用2021.1,尽可能使用红框中版本,这些版本是包含ribbon的
https://img.mukewang.com/szimg/6107ff3409267b7815601086.jpg
来源:https://coding.imooc.com/learn/questiondetail/Ggzqw6j5J1zXDxW0.html
<!-- ribbon,高版本排除 guava 否则报错 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.10.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
2、修改默认负载均衡策略
@Configuration
public class RibbonConfig {
/**
* 全局配置
* 指定负载均衡策略
* @return
*/
@Bean
public IRule iRule() {
// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
return new NacosRule();
}
}
3、Ribbon 已经停更了,用 LoadBalancer 替代 Ribbon
三、LoadBalancer 替代 Ribbon
前面使用过:【Spring Cloud Alibaba】003-Nacos 概述与单机搭建
1、简介
Spring Cloud LoadBalancer 是Spring Cloud 官方自己提供的客户端负载均衡器,用来替代 Ribbon。
Spring官方提供了两种负载均衡的客户端:
RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问
远程 Http 服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖
jdk 的 HTTP 连接工具。
WebClient
WebClient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请
求的客户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对
应的get、post、put、delete等方法,可以用来发起相应的请求。
2、依赖
<!-- loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
3、注解
package com.zibo.alibaba.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
}
4、基本使用
package com.zibo.alibaba.order.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/add")
public String add() {
System.out.println("下单成功!");
// 远程调用库存服务,ip 和端口改成服务名(如stock-service)
String forObject = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
return "hello world 下单成功!" + forObject;
}
}