当前位置: 首页 > news >正文

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服务urlsList<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 {@BeanReactorLoadBalancer<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)

http://www.lryc.cn/news/354130.html

相关文章:

  • 【栈】Leetcode 71. 简化路径【中等】
  • 简单操作一单利润500+,最新快手缺货赔付玩法,【找店教程+详细教程】
  • 【软件设计师】先导
  • npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • 如何用 MoonBit 实现 diff?
  • opencl色域变换,处理传递显存数据
  • COD论文笔记 Boundary-Guided Camouflaged Object Detection
  • java内存模型介绍
  • CSS语法介绍
  • Jeecg | 完成配置后,如何启动整个项目?
  • Kubectl 的使用——k8s陈述式资源管理
  • 多天线技术
  • Meta发布Chameleon模型预览,挑战多模态AI前沿
  • 声压级越大,STIPA 越好,公共广播就越清晰吗?
  • 基于springboot+vue的4S店车辆管理系统
  • 深入理解 HTTP 缓存
  • upload-labs 通关方法
  • 5-26 Cpp学习笔记
  • YOLOv8_pose的训练、验证、预测及导出[关键点检测实践篇]
  • 架构师必考题--软件系统质量属性
  • 使用AWR对电路进行交流仿真---以整流器仿真为例
  • 在UbuntuLinux系统上安装MySQL和使用
  • React 如何自定义 Hooks
  • 智能家居完结 -- 整体设计
  • 双指针用法练习题(2024/5/26)
  • Ansible02-Ansible Modules模块详解
  • 【Python特征工程系列】一文教你使用PCA进行特征分析与降维(案例+源码)
  • 【Linux】Ubuntu系统挂载NAS文件夹
  • 如何用ai打一场酣畅淋漓的数学建模比赛? 给考研加加分!
  • 深入浅出MySQL事务实现底层原理