vlambda博客
学习文章列表

Ribbon负载均衡服务调用

优质文章,及时送达
承接上文


Ribbon负载均衡服务调用
感谢技术支持-阳哥

8. Ribbon负载均衡服务调用

概述

是什么

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

Ribbon负载均衡服务调用

一句话,所谓ribbon就是负载均衡+RestTemplate调用

官网

https://github.com/Netflix/ribbon

ribbon已经进入维护状态,但ribbon比较优秀,仍在大规模使用,短时间内不会被替换掉

能干嘛

  • 负载均衡概述:

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

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

    • 常见的负载均衡软件有Nginx,Lvs等

    • dubbo、SpringCloud中均给我们提供了负载均衡,Springcloud的负载均衡算法可以自定义

  • Ribbon本地负载均衡客户端  VS   Nginx服务端负载均衡的区别Ribbon负载均衡服务调用

  • 负载均衡简单分类:

    • 集中式LB

    Ribbon负载均衡服务调用

    • 进程式LB

    Ribbon负载均衡服务调用



Ribbon负载均衡演示

架构说明:

  • Ribbon其实就是一个软 负载均衡的客户端组件,

    它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

  • 架构图

Ribbon负载均衡服务调用

  • ribbon在工作时分两步

    其中,Ribbon提供了多种策略,比如:轮询、随机和根据相应时间加权。

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


POM

ribbon的依赖    spring-cloud-starter-netfilx-ribbon   是不用引的Ribbon负载均衡服务调用

因为之前引的netfilx-eureka-client里面已经包含了ribbon的内容

Ribbon负载均衡服务调用

二说RestTemplate

getForObject / getForEntity

postForObject / postForEntity


  • getForObect和getForEntity的区别

    • getForObject       用的比较多

      返回对象为响应体中数据转化成的对象,基本可以理解为返回了个Json

      以consumer80中的OrderController为例

       @GetMapping("/consumer/payment/get/{id}")
       public CommonResult<Payment> getPayment(@PathVariable("id") Long id)
       {
           return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
       }
    • getForEntity

      返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等。

      以consumer80中的OrderController为例

       @GetMapping("/consumer/payment/getForEntity/{id}")
       public CommonResult<Payment> getPayment2(@PathVariable("id") Long id)
       {
           ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
       
           if(entity.getStatusCode().is2xxSuccessful()){
               return entity.getBody();
          }else{
               return new CommonResult<>(444,"操作失败");
          }
       }

    Ribbon负载均衡服务调用Ribbon负载均衡服务调用

    • 小结:两种的返回结果是一样的,

                 如果只用一个json串,就用getForObject,

                 如果想返回更多内容,可以用getForEntiry,

      但是目前直接返回一个 json串是用的比较多。


Ribbon核心组件IRule

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

默认是轮询

Ribbon负载均衡服务调用

如何替换

前提:在前面的5.3eureka集群搭建里把负载均衡的注解@LoadBalanced写上,这样就可以通过80同时调用多个 微服务了(支付模块8001,8002)

  • 修改cloud-consumer-order80

  • 注意配置细节

    • 官方文档明确给出了警告:

      这个自定义配置类不能放在@ComponentScan所扫描的当前包及子包下

      否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特定化定制的目的了。

    • 进入80的主程序类的@SpringBootApplication,可以看到@ComponentScan注解,

      也就是说不能放在主启动类所在的springcloud包及其子包下。Ribbon负载均衡服务调用

  • 新建package及新建规则类

    com.woxueit.myrule            MySelfRule.java

     @Configuration
     public class MySelfRule
     {
        @Bean
        public IRule myRule()
        {
            return new RandomRule();//定义为随机
        }
     }
  • 主启动   OrderMain80 ------->>>>加上@RibbonClient

     @SpringBootApplication
     @EnableEurekaClient
     @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)
  • 测试------------------->默认是轮询,我们给改成了随机

    • 启动8001、8002,order80

    • localhost/consumer/payment/get/1

    • 端口号8001和8002随机出现


补充:最好还是改回ribbon默认的轮询,将@RibbonClient注释掉

 //@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)


至此,就完成了ribbon项目的初步构建

注:未完待续,敬请期待 Ribbon负载均衡服务调用(下)

Ribbon负载均衡服务调用

往期干货推荐

1. 

2. 

3. 

4. 

5. 

转自网络,侵删

在看的你真好看