LoadBalancer

一、手写随机负载均衡

1、引入依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


<!--引入nacos discovery-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、controller定义

复制代码
@Resource
private RestTemplate restTemplate;

@Resource
private DiscoveryClient discoveryClient;

@RequestMapping("/restLoadbalance")
public String manualLoadBlance(){
    //1、获取order服务urls
    List<ServiceInstance> instances = this.discoveryClient.getInstances("order");
    List<String> urls = instances.stream().map(instance->instance.getUri().toString()+"/order/query").collect(Collectors.toList());

    //2、随机负载请求
    int index = ThreadLocalRandom.current().nextInt(urls.size());
    return this.restTemplate.getForObject(urls.get(index),String.class);
}

二、LoadBalancer

2.1、API

(1)、引入依赖

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

(2)、代码

复制代码
//2、loadbalancer api
@Resource
private LoadBalancerClient loadBalancerClient;


@RequestMapping("/loadbanlancerapi")
public String loadBanlancerApi(){
    ServiceInstance serviceInstance = this.loadBalancerClient.choose("order");
    return this.restTemplate.getForObject(serviceInstance.getUri().toString()+"/order/query",String.class);
}

2.2、注解

(1)、引入依赖

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

(2)、自定义@LoadBanlancer注解得RestTemplate

复制代码
@Bean
@LoadBalanced   // 相当于为restTemplate整合了lb的能力
public RestTemplate restTemplateLoadBalancer(){
    return new RestTemplate();
}

(3)、controller代码

复制代码
@Resource
private RestTemplate restTemplateLoadBalancer;
@RequestMapping("/loadbanlanceraop")
public String loadBanlancerAop(){
    return this.restTemplateLoadBalancer.getForObject("http://order/order/query",String.class);
}

三、默认负载算法

默认轮询负载:RoundRobinLoadBalancer

更改默认负载算法:Cloud Native Applications

(1)、自定义负载算法

复制代码
public class CustomLoadBalancerConfiguration {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

(2)、启动类增加注解

复制代码
@SpringBootApplication
@LoadBalancerClients(defaultConfiguration = CustomLoadBalancerConfiguration.class)
public class UserApplicaiton implements ApplicationRunner {
}

四、源码分析

(1)、RestTemplate流程

(2)、LoadBalancerClient#choose(String serviceId)

相关推荐
摇滚侠8 小时前
2025最新 SpringCloud 教程,从单体到集群架构,笔记02
笔记·spring cloud·架构
摇滚侠16 小时前
2025最新 SpringCloud 教程,编写微服务 API,笔记08
笔记·spring cloud·微服务
q***428220 小时前
SpringCloud-持久层框架MyBatis Plus的使用与原理详解
spring·spring cloud·mybatis
KotlinKUG贵州20 小时前
SpringGateway-MVC对SSE转发出现阻塞响应问题的分析和解决
spring·spring cloud·kotlin
b***46241 天前
IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤
物联网·spring cloud·开源
稚辉君.MCA_P8_Java1 天前
Gemini永久会员 containerd部署java项目 kubernetes集群
后端·spring cloud·云原生·容器·kubernetes
q***51891 天前
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
java·spring cloud·微服务
q***72191 天前
springBoot 和springCloud 版本对应关系
spring boot·后端·spring cloud
q***38511 天前
SpringCloud实战【九】 SpringCloud服务间调用
java·spring boot·spring cloud
q***49451 天前
SpringGateway网关(Spring Gateway是Spring自己编写的,也是SpringCloud中的组件)
spring·spring cloud·gateway