06-微服务相互调用-Ribbon

微服务相互调用-Ribbon

稍微LOW,也是不常用的技术

RestTemplate->Ribbon

前面,已经通过RestTemplate可以实现微服务之间的相互调用,但是RestTemplate有一定的问题,问题:1、必须要确定的具体地址。2、如果具体地址出问题了,就无法正常的做自动切换。3、微服务都是以集群的方式来部署,无法去选择集群中其他地址

解决方案

Ribbon

Ribbon概述

Ribbon是NetFlex的一个负载均衡器,例外它还可以同样使用RestTemplate完成对微服务之间的调用

你可以认为:Ribbon就是在RestTemplate的基础之上,提供了负载均衡的能力

Ribbon一般是配合Eureka注册中心来使用,意味着:Ribbon可以从Eureka中去发现自己需要的微服务实例

负载均衡

Ribbon提供的这种负载均衡的原理,是一种客户端的负载均衡机制

负载均衡:将负载(HTTP的请求)较为平均的分配到服务器上去

负载均衡常见的算法:轮询,权重,IP地址黏贴,最少连接

负载均衡的分类

**服务端负载均衡:**服务端的这种方式,一定是有服务器(Apache/Nginx)在参与,它的原理:包工头-工人之间的关系,它是属于任务分配的一种方式

**客户端负载均衡:**客户端的负载均衡一般是发生在分布式应用程序内容,它的原理:是属于调用者与被调用者之间的关系

Ribbon使用
1、导入Ribbon的依赖

但是Ribbon只要是你使用Eureka,那么程序已经自带了

2、开启负载均衡

在调用的一方,开启负载均衡

配置Ribbon实际上就是开启它的负载均衡

说Ribbon的底层就是RestTemplate,那么配置Ribbon实际上就是在配置RestTemplate

    /**
     * 产生一个RestTemplate 模板对象
     * @return
     */
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


**默认情况下:**Ribbon使用的轮询模式

3、客户端调用方式
    /**
     * RestTemplate一定要写详细地址
     * @return
     */
    public String getUrl(){
//        return "http://127.0.0.1:9091/";
        //127.0.0.1:9091替换成 micro-base-server(被调用者的spring.application.name)
        return "http://micro-base-server/";
    }
4、Ribbon提供的负载均衡

com.netflix.loadbalancer.RoundRobinRule 轮询(默认)

com.netflix.loadbalancer.RandomRule 随机

com.netflix.loadbalancer.RetryRul 重试

com.netflix.loadbalancer.WeightedResponseTimeRule 权重

com.netflix.loadbalancer.BestAvailableRule 最佳

com.netflix.loadbalancer.AvailabilityFilteringRule 请求过滤

5、全局配置Ribbon的负载均衡

在SpringMvcConfiguration中

    /**
     * 定义自己的负载均衡策略
     * @return
     */
    @Bean
    public IRule myRandomRule(){
        return new RandomRule();
    }
6、局部配置Ribbon的负载均衡

每个单独的微服务调用,可能使用的负载均衡策略不一致,那么如何设置呢?

以RetryRule的方式来讲解,注释掉 上述的全局负载均衡的代码

image-20201231101002327

Ribbon在使用restTemplate调用其他的微服务时,调用可能由于某些原因失败了,失败了肯定要解决,采用重试机制解决

1、导入重试依赖包

在调用者一方的pom.xml中

<dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
  </dependency>
2、修改application.yml文件
spring:
  application:
    name: micro-user-server
  datasource: #配置Druid的数据源连接池
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/micro-user-server?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true
    username: root
    password: 123456
    druid:
      initial-size: 5
      max-active: 20
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select now() from dual
      test-while-idle: false
      test-on-borrow: true
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      filters: stat,wall
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=3000
      stat-view-servlet:
        enabled: true
        login-username: druid
        login-password: druid
        reset-enable: true
        url-pattern: /druid/*
      web-stat-filter:
        enabled: true
        exclusions:
          -*.js
          -*.gif
          -*.jpg
          -*.png
          -*.css
          -*.ico
          -/druid/*
        url-pattern: /*
        
micro-base-server: #微服务的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
    ConnectTimeout: 250 # Ribbon的连接超时时间(毫秒)
    ReadTimeout: 1000 # Ribbon的数据读取超时时间
    OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
    MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
    MaxAutoRetries: 1 # 对当前实例的重试次数

#设置其他微服务的负载均衡策略
#micro-admin-server:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#

server:
  port: 9092
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/
mybatis:
  mapper-locations: classpath:mapper/*.xml #配置Mapper映射文件所在的位置
  type-aliases-package: com.woniuxy.microuserserver.bean #别名包
  configuration:
    lazy-loading-enabled: true #延迟加载
    aggressive-lazy-loading: false
logging:
  level:
    root: debug #将日志下调至Debug

logging.level.root 为了查看效果, 可以将日志级别下调至Debug

micro-base-server 单独为该微服务,定制化的设置 负载均衡规则

3、查看重试效果

image-20201231103546900

g:
level:
root: debug #将日志下调至Debug


> logging.level.root 为了查看效果, 可以将日志级别下调至Debug
>
> micro-base-server 单独为该微服务,定制化的设置 负载均衡规则

##### 3、查看重试效果

[外链图片转存中...(img-METyJF0i-1615996793648)]







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值