1 负载均衡简介
负载均衡是实现系统高可用、支持系统高并发的重要手段,当请求达到一定体量之后,单个服务已经无法支撑,需要多个服务共同受理请求,如何让每个服务根据自身的性能合理分配请求量就是负载均衡干的事情,负载均衡可以放在服务端也可以放在客户端,我们通常说的负载均衡是指服务端负载均衡,可以借助硬件实现,比如F5,也可以使用软件实现,比如negix,不论使用哪种方式,架构原理都是一样的,如下图所示:
客户端负载均衡和服务端负载均衡实现的原理不一样,客户端负载均衡的每个客户端节点都会从服务注册中心拉取服务列表,根据配置的负载均衡算法计算出需要访问哪个服务节点,客户端也需要给注册中心发送心跳,确定服务端的健康性。springcloud ribbon组件实现了客户端负载均衡,实现原理如下图所示:
2 搭建负载均衡器
创建项目springcloud-ribbon,pom.xml文件配置如下所示:
<?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-ribbon-demo</artifactId>
<groupId>com.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud</groupId>
<artifactId>springcloud-ribbon</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
application.yml文件配置文件如下所示:
server:
port: 9001
spring:
application:
name: Ribbon-Consumer
eureka:
#客户端
client:
#注册中心地址
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
创建启动类RibbonApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
创建客户端请求类ConsumerController.java
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer")
public String helloConsumer() throws ExecutionException, InterruptedException {
return restTemplate.getForEntity("http://HELLO-SERVICE/helloprovider", String.class).getBody();
}
}
服务提供者springcloud-provider1添加处理类ProviderController.java
@RestController
public class ProviderController {
@RequestMapping("/helloprovider")
public String hello(){
return "hello-provider1";
}
}
同样服务提供者springcloud-provider2添加处理类ProviderController.java
@RestController
public class ProviderController {
@RequestMapping("/helloprovider")
public String hello(){
return "hello-provider2";
}
}
启动注册中心、服务提供者、服务消费者,登录注册中心,地址:http://localhost:7001/ 得到如下所示服务列表:
浏览器输入http://localhost:9001/consumer 刷新会发现hello-provider1和hello-provider2交替出现。
3 总结
springcloud ribbon是netflix提供的实现客户端负载均衡的组件,只需要引入相应的包就可以使用,本文通过实例演示了springcloud ribbon的使用方法,实例代码下载地址:https://github.com/xiaoyususu/springcloud-ribbon-demo.git