SpringCloud的Ribbon负载均衡

本文介绍了SpringCloud的Ribbon如何实现客户端负载均衡。Ribbon是一个基于Http和TCP的客户端负载均衡器,当与Eureka结合使用时,可以从注册中心获取服务列表并进行负载均衡。通过实例演示了Ribbon的配置和使用,展示了轮询和随机两种执行策略,实现了服务调用的均衡负载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud的负载均衡

服务器端的负载均衡:在客户端向服务器端发送请求的时候,会先请求到负载均衡器,然后负载均衡器根据自身的算法来将请求转发给某台真正提供业务的服务器。然后该服务器将请求返回的数据给负载均衡器,再由负载均衡器将数据返回给客户端

客户端的负载均衡:在客户端的内部执行的一种算法,在向服务器端发送请求的时候,先执行自己的调度算法算出向哪台服务其发送请求,然后直接发送到该服务器。
特点:由客户端的内部程序实现,不需要额外的负载均衡器软硬件的投入。

springcloud的负载均衡有两种方式:

这篇先说Ribbon的负载均衡:

Ribbon实现客户端的负载均衡
Ribbon是一个基于Http和TCP客户端的负载均衡器。Ribbon可以通过客户端中配置的ribbonServerList服务端列表去轮训的访问以达到负载均衡的作用。当Ribbon和Eureka联合使用时,ribbonServerList会被DiscoveryEnableNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。

下面通过实例来使用Ribbon实现负载均衡。

首先需要有一个服务注册中心eureka-server,还需要两个服务提供方。然后建立一个新的springboot,叫做eureka-ribbon。

这里写图片描述

启动eureka-server,first-service,second-service 可以看到如下界面,两个服务提供方都叫COMPUTE-SERVICE已经被注册进去。

这里写图片描述

然后开始编写eureka-ribbon的项目

首先在pom.xml中加入如下代码:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

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

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

在应用主类中加上@EnableDiscoveryClient注解来添加发现服务能力,然后创建RestTemplate实例,并通过@LoadBalanced注解来开启负载均衡的能力。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {

@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaRibbonApplication.class, args);
}
}

创建ServiceController来消费service中的add服务,通过restTemplage对象来调用服务,计算10+20的值。

@RestController
public class ServiceController {
@Autowired
private RestTemplate restTemplate;

@RequestMapping(value = "/add",method = RequestMethod.GET)
public String add(){
return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20";,String.class).getBody();
}
}

在application.properties配置文件中配置eureka服务注册中心

spring.application.name=eureka-ribbon
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

启动四个应该用,访问两次localhost:3333/add。
可以看到控制台的first-service和second-service各打印一行日志
打开服务端口为1111的可以看到:
这里写图片描述
打开服务端口为2222的可以看到:
这里写图片描述

可以看到,之前启动的两个first-service和second-service服务端分别被调用了一次。到这里,我们已经通过Ribbon在客户端已经实现了对服务调用的均衡负载

Ribbon的执行策略
1.RoundRobinRule(轮询模式) 轮询访问 如果有两个服务 那么就会先访问服务1然后再访问服务2 然后再是1和2 轮流访问。
2.RandomRule(随机策略) 随机调用服务来执行。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值