SpringCloud神兽(二)之Ribbon

一. Ribbon概述

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

说到这里,不得不介绍下LB

LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。

负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

常见的负载均衡有软件Nginx,LVS,硬件 F5等。

相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。

  • **分布式:**不同的多台服务器上面部署不同的服务模块(工程),他们之间通过Rpc/Rmi之间通信和调用,对外提供服务和组内协作。
  • RPC(Romote Procedure Call):远程过程调用,允许一台计算机程序远程调用另外一台计算机的子程序,不用关心底层网络通信。在socket基础上实现,比socket需要更多资源。
  • **集群:**不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。
  1. 集中式LB

    即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方

  2. 进程内LB

    将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

    Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

二.Ribbon初步配置

①修改microservicecloud-consumer-dept-80工程

  1. 修改pom.xml文件,添加Ribbon相关依赖

     <!-- Ribbon相关 -->
      <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
    
      <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
    
      <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
    
  2. 修改application.yml文件,追加eureka的服务注册地址

    server: 
     port: 80 
     
    eureka: 
     client: 
      register-with-eureka: false
      service-url: 
       defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
  3. 对ConfigBean进行新注解@LoadBalanced

    @SpringBootConfiguration
    public class ConfigBean {
    	
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    	return new RestTemplate();
    }
    }
    
  4. 主启动类DeptConsumer80_App添加@EnableEurekaClient

    @SpringBootApplication
    @EnableEurekaClient
    public class DeptConsumer80_App {
    	public static void main(String[] args) {
    		SpringApplication.run(DeptConsumer80_App.class, args);
    	}
    }
    
  5. 修改客户端访问类DeptController_Consumer

    @RestController
    @RequestMapping("customer")
    public class DeptController_Consumer {
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
    //修改前缀为提供服务的服务名称
    private static final String REST_URL_PREFIX = "HTTP://MICROSERVICECLOUD-DEPT";
    
    @Autowired
    private RestTemplate restTemplate;
    
    
    @RequestMapping(value = "/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
    	return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
    }
    //	@SuppressWarnings("unchecked")
    	@RequestMapping(value = "/dept/list")
    	public List<Dept> list(){
    		return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
    	}
    
    }
    
  6. 测试:先启动3个eureka集群后,再启动dept-provider-8001和consumer-dept-80

    测试结果:Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口后

三. Ribbon负载均衡

Ribbon在工作时分成两步

第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.

第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

其中Ribbon提供了多种策略:比如轮询【默认】、随机和根据响应时间加权。

负载均衡实现实例:

  1. 参考microservicecloud-provider-dept-8001,新建两份,分别命名为8002,8003

  2. 新建8002/8003数据库,各自微服务分别连接各自的数据库

  3. 修改8002/8003各自的yml文件,参考8001(修改端口、数据库链接、对外暴露统一的服务实例名)

  4. 测试:

    ①启动3个eureka集群,再启动3个Dept微服务并各自测试通过

    http://localhost:8001/dept/list; http://localhost:8002/dept/list; http://localhost:8003/dept/list;

    ②启动microservicecloud-consumer-dept-80

    客户端通过Ribbon完成负载均衡并访问上一步的Dept微服务(http://localhost/consumer/dept/list)注意观察看到返回的数据库名字,各不相同,负载均衡实现

测试总结:Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例

四. Ribbon的核心组件IRule

**IRule:**根据特定算法从服务列表中选取一个要访问的服务

五. 小结

​ 除了Ribbon提供的负载均衡的算法,我们还可以自定义自己的负载均衡算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值