springcloud 入门(2) 之Ribbon

简介: springcloud 入门(2) 之Ribbon

springcloud 搭建更多请查看:

springcloud多模块项目一步一步搭建(1)之eureka


Ribbon简介

Ribbon在springcloud中担任着负载均衡的角色,它是一个基于HTTP和TCP的客户端负载均衡工具。springcloud Ribbon只是一个工具类框架,它可以独立部署但是也不需要独立部署,它几乎存在于所有springcloud 构建的微服务和基础设施中。


Ribbon使用

1、在消费者的restTemplate对象上加上 @LoadBalanced注解

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2、创建多个生产者,我创建了三个生产者,

三个生产者的application.properties如下:

provider1

server.port=9001
# 生产者应用名称 -
spring.application.name=PROVIDER
# 生产者实例名,同一个spring.application.name 名称唯一
eureka.instance.instance-id=provider1
eureka.client.register-with-eureka=true
eureka.client.service-url.defaultZone=http://localhost:8001/eureka
# 设置心跳的时间间隔(默认是30秒)
eureka.instance.lease-renewal-interval-in-seconds=5
# eureka server 最后一次收到心跳时等待的时间,超时将会移除client(默认是90秒)
eureka.instance.lease-expiration-duration-in-seconds=3

provider2和provider3除了端口和实例id外其他都是一样的,就不粘贴了。

对外提供的接口如下:

HelloProvider1.java

@RestController
@RequestMapping("/hi")
public class HelloProvider1 {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num one provider,nice to meet you!";
    }
}

HelloProvider2.java

@RestController
@RequestMapping("/hi")
public class HelloProvider2 {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num two provider,nice to meet you!";
    }
}

HelloProvider3.java

@RestController
@RequestMapping("/hi")
public class HelloProvider3 {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am num three provider,nice to meet you!";
    }
}

实例测试

1、分别启动eureka server 、三个生产者和消费者

eureka server启动后,看到如下界面证明三个生产者创建成功,会显示有三个生产者,左边红框内是生产者集群名称,消费者在通过IP和port调用生产者接口时都是通过集群名称调用的,右边红框是实例名称

image.png

2、通过消费者调用生产者

消费者调用生产者代码

@RestController
@RequestMapping("/hi")
public class HelloConsumer {
    @Autowired
    private RestTemplate restTemplate;
    private final String providerUrl = "http://PROVIDER/hi/hello";
    @RequestMapping("/pro")
    public String provider(){
        return restTemplate.getForObject(providerUrl , String.class);
    }
    @RequestMapping("/hello")
    public String hello(){
        return "hello,I am consumer,nice to meet you!";
    }
}

消费者启动成功后,通过浏览器访问http://localhost:7001/hi/pro,你会发现消费者调用生产者的顺序是按照你启动的顺序访问的,或者说是注册到eureka server的顺序访问 的,这是由于Ribbon默认采用的负载均衡策略是轮询。


Ribbon负载均衡策略配置

Ribbon 负载均衡有两种配置方式

1、全局配置

全局配置的话是将消费者调用的所有服务所采用的负载均衡算法都设置为相同的,全局只需写个配置类,在配置类中注入负载均衡策略,这个配置类要能被扫描到。我这里注入的负载策略是随机策略RandomRule

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    /**
     * 负载均衡算法
     * @return
     */
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

2、局部配置

局部配置是针对某个生产者服务设置负载策略的,分两步:

1、在启动类扫描不到的包中创建一个配置类,在配置类中注入负载策略

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
/**
 * @author Aaron
 * @Date 2019/7/12 13:23
 **/
public class RibbonConfig {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

2、在启动类中加入@RibbonClient注解,该注解的class为外部配置类名称,name为生产者服务唯一的名称,例如我创建了三个生产者provider1、provider2、provider3,他们共同的应用名称为PROVIDER,这里的name就是PROVIDER

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER" , configuration = RibbonConfig.class)
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

Ribbon 负载均衡策略

Ribbon 负责负载均衡就会存在负载均衡策略。Ribbon 默认有7种负载均衡策略,当然也可以实现com.netflix.loadbalancer.IRule接口,自定义负载均衡策略。


  • RoundRobinRule: 轮询策略,按顺序循环选择 server。默认策略
  • RandomRule: 随机策略,随机选择一个 server
  • RetryRule:重试策略,在一个配置时间段内当选择 server 不成功,则一直尝试选择一个何用的 server
  • BestAvailableRule:最低并发策略,逐个考察 server ,如果 server 断路器打开,则忽略,再选择其中并发连接最低的 server
  • AvailabilityFilteringRule:可用过滤策略,过滤掉一直连接失败并被标记为 circuit tripped 的 server , 过滤掉那些高并发连接的 server ( active connections 超过配置的阈值)
  • ResponseTimeWeightedRule: 响应时间加权策略,根据 server 的响应时间分配权重。响应时间越长,权重越低,被响应时间选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、 IO 等,这些因素直接影响着响应时间
  • ZoneAvoidanceRule:区域权衡策略,综合判断 server 所在区域的性能和 server 的可用性轮询选择,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 server


访问消费端http://localhost:7001/hi/pro,会看到随机访问生产者接口。

这样Ribbon就能简单使用了


系列文章:

springcloud多模块项目一步一步搭建(2)之Ribbon

springcloud多模块项目一步一步搭建(3)之Feign

GitHub地址:

https://github.com/ArronSun/micro-services-practice.git


能力一般,水平有限,如有错误,请多指出。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
64 0
|
1月前
|
负载均衡 算法 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
23 0
|
1月前
|
负载均衡
【二十】搭建SpringCloud项目四(Ribbon)
【二十】搭建SpringCloud项目四(Ribbon)
19 0
|
1月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
1月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
|
2月前
|
Java 调度 开发工具
SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)
SpringCloud【微服务架构进化论、微服务的拆分规范和原则、为什么选择Spring Cloud、什么是服务治理 】(一)-全面详解(学习总结---从入门到深化)
176 0
|
3月前
|
负载均衡 Java 应用服务中间件
springcloud3-服务到服务调用ribbon及openfeign
springcloud3-服务到服务调用ribbon及openfeign
45 0
|
3月前
|
存储 负载均衡 算法
spring cloud 之 Ribbon
spring cloud 之 Ribbon
49 0
|
6月前
|
负载均衡
09SpringCloud - Ribbon项目示例
09SpringCloud - Ribbon项目示例
18 0
|
7月前
|
开发框架 负载均衡 Java
Spring Cloud 介绍及负载均衡Ribbon、服务容错Hystrix 组件使用详解
Spring Cloud 介绍及负载均衡Ribbon、服务容错Hystrix 组件使用详解
115 0

热门文章

最新文章