Spring Cloud(4) Feign - 负载均衡Ribbon

目标

  • wallet扩展为多节点
  • 调用userInfo接口测试负载均衡
  • Ribbon参数测试

测试负载均衡

修改wallet端口配置

# 随机端口号
server.port=${random.int[8100,8199]}

# 服务名
spring.application.name=wallet

# eureka服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:5000/eureka/

修改接口返回信息

@EnableEurekaClient
@SpringBootApplication
@RestController
@RequestMapping
public class MainApplication {

    @Value("${server.port}")
    private int serverPort;

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

    @GetMapping("getWallet")
    public String getWallet() {
        return "this is wallet info. from port : " + serverPort;
    }

}

启动多实例wallet

访问 http://localhost:5000/

Spring Cloud(4) Feign - 负载均衡Ribbon_第1张图片
image.png

已有多个wallet实例注册到eureka-server中

多次访问 http://localhost:8000/userInfo

image.png

image.png

wallet的请求可以自动负载到8001、8002两个端口实例上

测试Ribbon参数

参数 | 描述 | 备注

  • | -
    spring.cloud.loadbalancer.retry.enabled | 是否开启重试 true false
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds | 断路器的超时时间需要大于Ribbon的超时时间,不然不会触发重试
    ribbon.ConnectTimeout | 连接超时时间
    ribbon.ReadTimeout | 流读取超时时间
    ribbon.OkToRetryOnAllOperations | 所有请求都允许重试
    ribbon.MaxAutoRetries | 当前实例重试次数
    ribbon.MaxAutoRetriesNextServer | 下一实例重试次数

关于MaxAutoRetries 与 MaxAutoRetriesNextServer参数,当连接超时的时候,Ribbon会先对当前实例进行重试,如果失败则重新获取新的实例进行重试。

wallet增加sleep

@EnableEurekaClient
@SpringBootApplication
@RestController
@RequestMapping
public class MainApplication {

    @Value("${server.port}")
    private int serverPort;

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

    @GetMapping("getWallet")
    public String getWallet() {
        System.out.println("请求getWallet" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));
        try {
            Thread.sleep(5000);// 休眠5秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "this is wallet info. from port : " + serverPort;
    }

}

account增加Ribbon重试配置

spring.cloud.loadbalancer.retry.enabled=true

# 该参数要大于Ribbon超时时间,否则直接触发熔断机制,不会重试请求
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000

ribbon.ConnectTimeout=3000
ribbon.ReadTimeout=3000
ribbon.OkToRetryOnAllOperations=true
ribbon.MaxAutoRetries=1
ribbon.MaxAutoRetriesNextServer=1

测试

访问 http://localhost:8000/userInfo
访问结果

Spring Cloud(4) Feign - 负载均衡Ribbon_第2张图片
image.png

wallet 1 日志:
请求getWallet2018-01-31 16:20:54:533
请求getWallet2018-01-31 16:20:57:542

wallet 2 日志:
请求getWallet2018-01-31 16:21:00:549
请求getWallet2018-01-31 16:21:03:554

从日志可以看出访问顺序:

  • 调用wallet1
  • 失败重试wallet1,重试次数受 ribbon.MaxAutoRetries 控制
  • 失败切换wallet2
  • 失败重试wallet2 ,重试次数受 ribbon.MaxAutoRetriesNextServer 控制
  • 失败返回结果

你可能感兴趣的:(Spring Cloud(4) Feign - 负载均衡Ribbon)