SpringCloud 客户端负载均衡Ribbon Hoxton版本

Spring Cloud Ribbon简介:Spring Cloud Ribbon是Spring Cloud Netflix子项目的核心组件之一,是一个基于HTTP和TCP的客户端负载均衡器,它既可以通过在客户端中配置ribbonServerList服务列表以达到均衡负载的作用,也可以结合Eureka或Consul等,从注册中心中获取服务实例列表以完成负载均衡。

本文主要对Spring Cloud Ribbon的基本使用进行简单总结,其中SpringBoot使用的2.2.2.RELEASE版本,SpringCloud使用的Hoxton.SR1版本。这里将沿用SpringCloud 服务注册与发现Eureka Hoxton版本eureka-server作为注册中心,eureka-client作为服务生产者,并通过Maven新建一个名为spring-cloud-netflix-ribbon的项目。

一、引入依赖

SpringBoot和SpringCloud依赖这里就不列出来了,还需引入以下依赖:

<!-- Spring Cloud Eureka Client 起步依赖 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Spring Cloud Ribbon 起步依赖 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!-- SpringRetry 重试框架依赖 -->
<dependency>
	<groupId>org.springframework.retry</groupId>
	<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、主启动类和RestTemplate配置类

package com.rtxtitanv;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.RibbonApplication
 * @description 主启动类
 * @date 2020/2/18 15:28
 */
@EnableEurekaClient
@SpringBootApplication
public class RibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}
package com.rtxtitanv.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.config.RestTemplateConfig
 * @description RestTemplate配置类
 * @date 2020/2/18 15:35
 */
@Configuration
public class RestTemplateConfig {

    /**
     * 配置RestTemplate
     *
     * @return RestTemplate
     */
    @LoadBalanced
    @Bean(name = "restTemplate")
    public RestTemplate getRestTemplate() {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        // 可以解决ribbon超时时间设置不生效问题
        httpRequestFactory.setReadTimeout(5000);
        httpRequestFactory.setConnectTimeout(5000);
        return new RestTemplate(httpRequestFactory);
    }
}

三、.编写配置文件

application.yml中进行如下配置:

server:
  port: ${PORT:9100}

spring:
  application:
    name: ribbon
  cloud:
    loadbalancer:
      retry:
        # 开启重试机制
        enabled: true

eureka:
  client:
    # 服务注册,是否将服务注册到Eureka注册中心,true:注册,false:不注册
    register-with-eureka: true
    # 服务发现,是否从Eureka注册中心获取注册信息,true:获取,false:不获取
    fetch-registry: true
    # 配置Eureka注册中心即Eureka服务端的地址,集群地址以,隔开
    service-url:
      defaultZone: http://rtxtitanv:rtxtitanv@eureka-server-01:8001/eureka/,http://rtxtitanv:rtxtitanv@eureka-server-02:8002/eureka/,http://rtxtitanv:rtxtitanv@eureka-server-03:8003/eureka/
  instance:
    # 将ip地址注册到Eureka注册中心
    prefer-ip-address: true
    # 该服务实例在注册中心的唯一实例ID,${spring.cloud.client.ip-address}获取该服务实例ip
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    # 该服务实例向注册中心发送心跳间隔,单位秒,默认30秒
    lease-renewal-interval-in-seconds: 20
    # Eureka注册中心在删除此实例之前收到最后一次心跳后的等待时间,单位秒,默认90秒
    lease-expiration-duration-in-seconds: 60

# ribbon指定客户端配置
eureka-client:
  ribbon:
    # 指定Ribbon负载均衡策略,ribbon自带七种负载均衡策略,RoundRobinRule:轮询,RandomRule:随机
    # RetryRule:重试,WeightedResponseTimeRule:响应时间加权,BestAvailableRule:最小并发请求
    # AvailabilityFilteringRule:可用过滤,ZoneAvoidanceRule:区域权重
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

# ribbon全局配置
ribbon:
  # 处理请求的超时时间,单位ms,默认1000
  ReadTimeout: 5000
  # 连接建立的超时时间,单位ms,默认1000
  ConnectTimeout: 5000
  # 切换实例的最大重试次数,不包括首次调用,默认0次
  MaxAutoRetriesNextServer: 3
  # 对当前实例的最大重试次数,不包括首次调用,默认1次
  MaxAutoRetries: 1
  # 是否对所有操作请求都进行重试,true:是,false:否,只针对get请求进行重试
  # 设置为true时,如果是put或post等写操作,如果服务器接口不能保证幂等性,会产生不好的结果,所以OkToRetryOnAllOperations设置为true需慎用
  # 默认情况下,get请求无论是连接异常还是读取异常,都会进行重试,非get请求,只有连接异常时,才会进行重试
  OkToRetryOnAllOperations: true
  # 对指定Http响应码进行重试
  retryableStatusCodes: 404,500,502
  eager-load:
    # 是否开启ribbon立即加载,true:开启,false:关闭,默认false
    enabled: true
    # 指定需要立即加载的服务名,也就是你需要调用的服务,有多个则用逗号隔开
    clients: eureka-client

Ribbon参数配置通常有以下两种方式:

  • 全局配置:格式为ribbon.<key>=<value>
  • 客户端配置:格式为<client>.ribbon.<key>=<value>

其中<key>表示参数名称,<value>表示参数值,<client>表示客户端名称。全局配置可以作为默认值设置,当指定客户端配置了相应key时将会覆盖全局配置内容。

禁用Eureka配置

这里使用了Eureka注册中心,如果想要禁用Eureka注册中心,需配置:

ribbon: 
  eureka:
    # 是否使用Eureka,true:使用,false:禁用,默认为true,禁用后需手动配置服务列表 
    enabled: false
eureka-client:
  ribbon:
    # 禁用Eureka后手动配置服务列表
    listOfServers: localhost:9001,localhost:9002,localhost:9003

使用参数配置自定义Ribbon客户端

从版本1.2.0开始,Spring Cloud Netflix支持使用参数与Ribbon文档兼容来自定义Ribbon客户端,对应的参数如下,应以<client>.ribbon.为前缀:

<client>: 
  ribbon:
    # 配置负载均衡器
    NFLoadBalancerClassName: ILoadBalancer(负载均衡器接口)实现类
    # 配置Ribbon负载均衡策略
    NFLoadBalancerRuleClassName: IRule(负载均衡策略接口)实现类
    # 配置Ribbon实例检查策略
    NFLoadBalancerPingClassName: IPing(实例检查策略接口)实现类
    # 配置服务列表维护机制
    NIWSServerListClassName: ServerList(服务列表维护接口)实现类
    # 配置服务列表过滤机制
    NIWSServerListFilterClassName: ServerListFilter(服务列表过滤接口)实现类

四、Ribbon使用测试

Controller层:

package com.rtxtitanv.controller;

import com.rtxtitanv.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.controller.RibbonController
 * @description RibbonController
 * @date 2020/2/18 15:35
 */
@RestController
public class RibbonController {

    @Autowired
    private RibbonService ribbonService;

    @GetMapping("/ribbon")
    public String ribbon() {
        return ribbonService.ribbon();
    }
}

Service层:

package com.rtxtitanv.service;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.RibbonService
 * @description RibbonService
 * @date 2020/2/18 15:48
 */
public interface RibbonService {
    /**
     * ribbon负载均衡测试
     *
     * @return 调用eureka-client返回的结果
     */
    String ribbon();
}
package com.rtxtitanv.service.impl;

import com.rtxtitanv.service.RibbonService;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.impl.RibbonServiceImpl
 * @description RibbonService实现类
 * @date 2020/2/18 15:48
 */
@Service
public class RibbonServiceImpl implements RibbonService {

    @Resource(name = "restTemplate")
    private RestTemplate restTemplate;

    @Override
    public String ribbon() {
        return restTemplate.getForObject("http://eureka-client/home", String.class);
    }
}

IDEA启动eureka-server集群,eureka-client集群和ribbon,其中eureka-client共3个节点,访问eureka-server中的一个节点,注册信息见下图:
注册中心中的服务注册列表
不断访问http://localhost:9100/ribbon,这里负载均衡策略设置的随机策略,根据下面动图中的测试过程和结果,说明Ribbon成功实现负载均衡。随机负载均衡策略结果
测试Ribbon的超时重试,根据下面动图中的测试过程和结果,说明Ribbon成功实现超时重试。
超时重试测试结果

代码示例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RtxTitanV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值