当前位置: 首页 > 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)

相关文章:

  • DockerK8s
  • 【深度学习】与【PyTorch实战】
  • 大模型的实践应用24-LLaMA-Factory微调通义千问qwen1.5-1.8B模型的实例
  • Kubernetes常用命令
  • 【C++风云录】领略嵌入式世界:嵌入式系统与实时操作系统
  • Ai指令-公众号内训课:学会ai指令+公众号的底层逻辑(7节课)
  • Python流感常微分方程房室数学模型
  • JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解
  • React里面useMemo和useCallBack的区别
  • Hsql每日一题 | day02
  • 【simple-admin】simple-admin-core 首次服务启动 如何配置mysql数据库表 | 如何docker启动core
  • Linux安装Mysql
  • 【MySQL精通之路】InnoDB(7)-锁和事务模型
  • Docker镜像源自动测试镜像速度,并选择速度最快的镜像
  • vb.net打开CAD指指定路径文件
  • angular2 简述
  • cookie和session
  • export和import的用法总结
  • gf框架之分页模块(五) - 自定义分页
  • java 多线程基础, 我觉得还是有必要看看的
  • JS笔记四:作用域、变量(函数)提升
  • Median of Two Sorted Arrays
  • Promise面试题,控制异步流程
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Unix命令
  • Vue官网教程学习过程中值得记录的一些事情
  • yii2权限控制rbac之rule详细讲解
  • 动态规划入门(以爬楼梯为例)
  • 记录一下第一次使用npm
  • 来,膜拜下android roadmap,强大的执行力
  • 使用SAX解析XML
  • 我有几个粽子,和一个故事
  • 应用生命周期终极 DevOps 工具包
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #{}和${}的区别?
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $.ajax中的eval及dataType
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)选择元素——(17)练习(Exercises)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (zhuan) 一些RL的文献(及笔记)
  • (分布式缓存)Redis分片集群
  • (十)c52学习之旅-定时器实验
  • (源码分析)springsecurity认证授权
  • (转)关于pipe()的详细解析
  • (转载)深入super,看Python如何解决钻石继承难题
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core 发展历程和版本迭代
  • .Net Core 微服务之Consul(二)-集群搭建