Spring Cloud Ribbon 及 Loadbalancer

连志义
2023-12-01

Ribbon 提供了一套微服务负载均衡的解决方案。

目前业界主流的负载均衡方案可分成两类:

  • 集中式负载均衡:即在 consumer 和 provider 之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把 访问请求 通过某种策略转发至 provider;
  • 进程内负载均衡:将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。

负载均衡策略,常见的有:

策略类  命名描述
RandomRule随机策略随机选择server
RoundRobinRule轮询策略按照顺序选择server(ribbon默认策略)
RetryRule重试策略在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server
BestAvailableRule最低并发策略逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
AvailabilityFilteringRule可用过滤策略过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
ResponseTimeWeightedRule响应时间加权重策略根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
ZoneAvoidanceRule区域权重策略综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

案例:(由于Ribbon停更,且目前eureka中的负载均衡被loadbalancer取代,下面的是loadbalancer案例)

config增加配置

package com.example.eurekaclient2.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RibbonConfig {
    @Bean
    @LoadBalanced //启用负载均衡注解
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    /**
     * 策略改为随机
     */
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                                   LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

启动类增加修改策略的引用 @LoadBalancerClients

@LoadBalancerClients(defaultConfiguration = {RibbonConfig.class})
@SpringBootApplication
//如果配置文件配置了注册中心相关配置,则默认开启注册中心注解(@EnableEurekaClient)
public class EurekaClient2Application {

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

controller

@RestController
public class ClientConntroller {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/postRest")
    private String postRest(){
        Persion ps = new Persion();
        ps.setUserName("卢大宝");
        //包含响应的一些信息
        ResponseEntity<Persion> pp = restTemplate.postForEntity("http://LUDB-CLIENT-1/postUser", ps, Persion.class);
        Persion p = pp.getBody();
        return p.getUserName();
    }
}

 类似资料: