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)

相关推荐
.生产的驴20 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
小扳24 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
wclass-zhengge7 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
yaosheng_VALVE10 小时前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
二十雨辰12 小时前
[Java]微服务治理
java·spring cloud
AskHarries13 小时前
Spring Cloud Gateway快速入门Demo
java·后端·spring cloud
wclass-zhengge13 小时前
SpringCloud篇(注册中心 - Eurea)
后端·spring·spring cloud
草明13 小时前
HTTP 客户端怎么向 Spring Cloud Sleuth 传输跟踪 ID
spring cloud·sleuth
.生产的驴16 小时前
SpringBootCloud 服务注册中心Nacos对服务进行管理
java·spring boot·spring·spring cloud·tomcat·rabbitmq·java-rabbitmq
customer0816 小时前
【开源免费】基于SpringBoot+Vue.JS课程答疑系统(JAVA毕业设计)
java·jvm·vue.js·spring boot·spring cloud·kafka·开源