文章目录
- 前言
- 【idea版】springcloud微服务(5)之整合Ribbon负载均衡使用
-
- 1.负载均衡介绍
-
- 1)什么是负载均衡?
- 2)负载均衡业务使用情况
- 3)服务器端负载均衡和客户端负载均衡
- 2.Ribbon是什么?
- 4.创建项目
- 5.引包(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
-
- 1)父pom.xml依赖
- 2)pom.xml的基础web包文件
- 3)核心包
- 6.新建配置文件(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
- 7.创建入口RibbonAApplication.java(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
- 8.创建配置类RibbonConfig.java(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
- 9.创建接口方法controller
- 10.创建调用服务类RibbonClient.java
- 11.启动服务,开始访问接口实现调用
- 12.完成配置使用
前言
【idea版】springcloud微服务系列搭建教程,包括整合nacos、mybatisplus、redis、gateway、ribbion、Rocketmq等
【idea版】springcloud微服务(5)之整合Ribbon负载均衡使用
1.负载均衡介绍
1)什么是负载均衡?
负载均衡(Load Balance),其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而达到一个高可用网络。
用微服务来举例就是:把http请求,分摊到多个服务器上。
2)负载均衡业务使用情况
没有负载均衡的web请求情况:
用户是直接通过http连到 web 服务器来获取结果,如果这个服务器宕机了,那么用户自然也就没办法访问了。另外,如果同时有很多用户试图访问服务器,超过了其能处理的极限,就会出现加载速度缓慢或根本无法连接的情况。
有负载均衡的web请求情况(必须有两个web server以上):
用户访问负载均衡器,再由负载均衡器将请求转发给后端服务器,缓冲单机的压力,同时有一个web server服务器宕机了,也不影响用户请求。
3)服务器端负载均衡和客户端负载均衡
服务器端负载均衡:
负载均衡是我们处理高并发、缓解网络压力和进行服务器扩容的重要手段之一,但是一般情况下我们所说的负载均衡通常都是指服务器端负载均衡,服务器端负载均衡又分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。
- 硬件负载均衡主要通过在服务器节点之前安装专门用于负载均衡的设备,常见的如:F5。
- 软件负载均衡则主要是在服务器上安装一些具有负载均衡功能的软件来完成请求分发进而实现负载均衡,常见的如:LVS 、 Nginx 、Haproxy。
- 无论是硬件负载均衡还是软件负载均衡,它的工作原理都不外乎下面这张图:
客户端负载均衡:
是从微服务的出现,则为负载均衡的实现提供了另外一种思路:把负载均衡的功能以库的方式集成到服务的消费方,而不再是由一台指定的负载均衡设备集中提供。这种方案称为软负载均衡(Soft Load Balancing)或者客户端负载均衡。
两者特点
服务器端负载均衡 VS 客户端负载均衡的特点如下:
服务器端负载均衡
客户端先发送请求到负载均衡服务器,然后由负载均衡服务器通过负载均衡算法,在众多可用的服务器之中选择一个来处理请求。
如图:
客户端负载均衡
客户端自己维护一个可用服务器地址列表,在发送请求前先通过负载均衡算法选择一个将用来处理本次请求的服务器,然后再直接将请求发送至该服务器。
2.Ribbon是什么?
Srping Cloud Ribbon 是基于 Netflix Ribbon实现,是一个基于HTTP和TCP的一套客户端 负载均衡的工具。
Ribbon是从nacos/eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。
Ribbon自带的负载均衡策略,首先Ribbon默认的负载策略为轮询算法,那么除了轮询算法Ribbon还包括以下几种负载策略。
策略类 | 命名 | 说明 |
---|---|---|
RandomRule | 随机策略 | 随机选择一个服务 |
RoundRobinRule | 轮询策略 | 按顺序循环选择一个服务 |
RetryRule | 重试策略 | 在一个配置时间段内选择服务不成功会一直尝试选择一个可用的服务 |
BestAvailabelRule | 最低并发策略 | 忽略熔断器打开的服务,选择并发连接最低的服务 |
AvailibilityFilterRule | 可用过滤策略 | 过滤掉一直链接失败和高并发连接的服务 |
ResponseTimeWeightedRule | 响应时间加权策略 | 服务响应时间越短,权重越大,被选中提供服务的概率越高 |
ZoneAviodanceRule | 区域权衡策略 | 综合服务所在区域性能和服务的可用性来轮询选择服务,会剔除不可用的服务 |
4.创建项目
根据教程:【idea版】springcloud微服务(1)之多模块版本新建一个springcloud项目
创建两个子模块:springcloud-ribbonA-example和springcloud-ribbonB-example
5.引包(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
1)父pom.xml依赖
<properties>
<spring-boot.version>2.4.3</spring-boot.version>
<spring-cloud.version>2020.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2)pom.xml的基础web包文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-example</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-ribbonA-example</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.5.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3)核心包
ribbon负载均衡调用都需要注册中心,所以引入
spring-cloud-starter-alibaba-nacos-discovery
,因为
spring-cloud-starter-alibaba-nacos-discovery
已经把
spring-cloud-starter-netflix-ribbon
包含,所以使用ribbon就只需要一个包就可以了
<!-- nacos服务注册中心 begin-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos服务注册中心 begin-->
6.新建配置文件(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
在resources里新建文件application.yml,两个服务的端口需要不一样
1)子模块springcloud-ribbonA-example:
server:
port: 9003
spring:
application:
name: ribbonA-server
# 设置注册中心
cloud:
nacos:
discovery:
#nacos服务地址
server-addr: 192.168.56.121:8848
#命名空间
namespace: f99717b6-4b29-443a-afac-c949d634e648
2)子模块springcloud-ribbonB-example:
server:
port: 9004
spring:
application:
name: ribbonB-server
# 设置注册中心
cloud:
nacos:
discovery:
#nacos服务地址
server-addr: 192.168.56.121:8848
#命名空间
namespace: f99717b6-4b29-443a-afac-c949d634e648
7.创建入口RibbonAApplication.java(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonAApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonAApplication.class, args);
}
}
8.创建配置类RibbonConfig.java(两个子模块springcloud-ribbonA-example和springcloud-ribbonB-example都是一样)
开启Ribbon的负载均衡加入注解: @LoadBalanced
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
修改负载均衡的策略:(注册类修改)
在配置类里,加上IRule的注册bean,然后返回自己要用的负载均衡策略就行了
注:使用nacos的注册中心,可以使用NacosRule
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* 更改 负载均衡策略算法
* RandomRule #配置规则 随机
* RoundRobinRule #配置规则 轮询
* RetryRule #配置规则 重试
* WeightedResponseTimeRule #配置规则 响应时间权重
* NacosRule #是用nacos注册中心的一套负载均衡规则,可以通过权重来控制访问量
* 也可以自定义负载均衡策略的类 MyCustomRule
* @return
*/
@Bean
public IRule myRule(){
return new NacosRule();
}
}
9.创建接口方法controller
1)子模块springcloud-ribbonA-example:
创建TestController.java
@RestController
public class TestController {
@Autowired
private RibbonClient ribbonClient;
@RequestMapping(value = "/a",method = RequestMethod.POST)
public String getA(){
return "success-A";
}
@RequestMapping("/getServerByRibbon")
public String getServerByRibbon(){
return ribbonClient.getA();
}
}
2)子模块springcloud-ribbonB-example:
创建TestController.java
@RestController
public class TestController {
@Autowired
private RibbonClient ribbonClient;
@RequestMapping(value = "/b",method = RequestMethod.POST)
public String getA(){
return "success-B";
}
@RequestMapping("/getServerByRibbon")
public String getServerByRibbon(){
return ribbonClient.getA();
}
}
10.创建调用服务类RibbonClient.java
子模块springcloud-ribbonA-example:
ribbonB-server是服务名,在注册中心上的服务名字
@Component
public class RibbonClient {
@Autowired
private RestTemplate restTemplate;
public String getA() {
ResponseEntity<String> message =
restTemplate.postForEntity("http://ribbonB-server/b",null, String.class);
return message.getBody();
}
}
子模块springcloud-ribbonB-example:
ribbonA-server是服务名,在注册中心上的服务名字
@Component
public class RibbonClient {
@Autowired
private RestTemplate restTemplate;
public String getA() {
ResponseEntity<String> message =
restTemplate.postForEntity("http://ribbonA-server/a",null, String.class);
return message.getBody();
}
}
11.启动服务,开始访问接口实现调用
访问:http://127.0.0.1:9003/getServerByRibbon
返回值:success-B
访问:http://127.0.0.1:9004/getServerByRibbon
返回值:success-A