一、关于
Ribbon是客户端负载均衡库,在云中经过了实战测试。 它提供以下功能:
- 负载均衡
- 容错能力
- 异步和反应模型中的多种协议(HTTP,TCP,UDP)支持
- 缓存和批处理
本文代码仓库地址:https://github.com/lazyrabb1t/rabb-springcloud-demo
二、使用Ribbon
1、首先启动eureka服务端,并注册多个服务提供者,可参照eureka篇
2、创建ribbon模块
3、pom.xml引入eureka客户端以及ribbon依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>xyz.lazyrabbit</groupId>
<artifactId>rabb-ribbon-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabb-ribbon-eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4、application.yml配置
server:
port: 11000
spring:
application:
name: rabb-ribbon
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:10002/eureka/
rabb:
service:
test: http://RABB-EUREKA-PROVIDER
5、config类配置
在restTemplate上添加@LoadBalanced即可使用ribbon的负载均衡功能
@Configuration
public class RibbonConfig {
/**
* 使用@LoadBalanced开启ribbon负载均衡功能
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* 负载均衡策略
* @return
*/
@Bean
public RandomRule createRule() {
return new RandomRule();
}
}
6、调用服务,测试
@SpringBootApplication
@RestController
public class RibbonEurekaApplication {
@Autowired
RestTemplate restTemplate;
@Value("${rabb.service.test}")
private String testService;
public static void main(String[] args) {
SpringApplication.run(RibbonEurekaApplication.class, args);
}
@GetMapping
public String hello() {
return "ribbon invoke:" + restTemplate.getForObject(testService, String.class);
}
}
三、负载均衡策略
1、Ribbon框架实现的策略
- RandomRule:随机策略
- RoundRobinRule:轮询策略
- RetryRule:重试策略,先按RoundRobinRule进行轮询,如果失败就在指定时间内进行重试
- BestAvailableRule:最先过滤掉不可用的处于断路器跳闸转态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule:先过滤掉故障实例,再选择并发量较小的实例
- ResponseTimeWeightedRule:权重,响应速度越快,权重越大,越容易被选中
- ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性进行服务的选择
2、自定义策略
实现自定义策略
public class MyRule extends AbstractLoadBalancerRule {
@Override
public Server choose(Object o) {
ILoadBalancer lb = this.getLoadBalancer();
if (lb == null || CollectionUtils.isEmpty(lb.getAllServers())) {
return null;
} else {
return lb.getAllServers().get(0);
}
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
配置使用自定义策略
@Configuration
public class RibbonConfig {
/**
* 使用@LoadBalanced开启ribbon负载均衡功能
*
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* 负载均衡策略
*
* @return
*/
@Bean
public IRule loadBalancerRule() {
return new MyRule();
}
}