• LoadBalancer


    一、手写随机负载均衡

        1、引入依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
    5. <!--引入nacos discovery-->
    6. <dependency>
    7. <groupId>com.alibaba.cloud</groupId>
    8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    9. </dependency>

        2、controller定义

    1. @Resource
    2. private RestTemplate restTemplate;
    3. @Resource
    4. private DiscoveryClient discoveryClient;
    5. @RequestMapping("/restLoadbalance")
    6. public String manualLoadBlance(){
    7. //1、获取order服务urls
    8. List<ServiceInstance> instances = this.discoveryClient.getInstances("order");
    9. List<String> urls = instances.stream().map(instance->instance.getUri().toString()+"/order/query").collect(Collectors.toList());
    10. //2、随机负载请求
    11. int index = ThreadLocalRandom.current().nextInt(urls.size());
    12. return this.restTemplate.getForObject(urls.get(index),String.class);
    13. }

    二、LoadBalancer

          

        2.1、API

            (1)、引入依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    4. </dependency>

            (2)、代码

    1. //2、loadbalancer api
    2. @Resource
    3. private LoadBalancerClient loadBalancerClient;
    4. @RequestMapping("/loadbanlancerapi")
    5. public String loadBanlancerApi(){
    6. ServiceInstance serviceInstance = this.loadBalancerClient.choose("order");
    7. return this.restTemplate.getForObject(serviceInstance.getUri().toString()+"/order/query",String.class);
    8. }

        2.2、注解

            (1)、引入依赖   

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    4. </dependency>

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

    1. @Bean
    2. @LoadBalanced // 相当于为restTemplate整合了lb的能力
    3. public RestTemplate restTemplateLoadBalancer(){
    4. return new RestTemplate();
    5. }

            (3)、controller代码

    1. @Resource
    2. private RestTemplate restTemplateLoadBalancer;
    3. @RequestMapping("/loadbanlanceraop")
    4. public String loadBanlancerAop(){
    5. return this.restTemplateLoadBalancer.getForObject("http://order/order/query",String.class);
    6. }

    三、默认负载算法

        默认轮询负载:RoundRobinLoadBalancer

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

        (1)、自定义负载算法

    1. public class CustomLoadBalancerConfiguration {
    2. @Bean
    3. ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
    4. LoadBalancerClientFactory loadBalancerClientFactory) {
    5. String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
    6. return new RandomLoadBalancer(loadBalancerClientFactory
    7. .getLazyProvider(name, ServiceInstanceListSupplier.class),
    8. name);
    9. }
    10. }

        (2)、启动类增加注解

    1. @SpringBootApplication
    2. @LoadBalancerClients(defaultConfiguration = CustomLoadBalancerConfiguration.class)
    3. public class UserApplicaiton implements ApplicationRunner {
    4. }

    四、源码分析

        (1)、RestTemplate流程

        (2)、LoadBalancerClient#choose(String serviceId)

  • 相关阅读:
    文本结构分析易语言代码
    使用gdb调试Android(aarch 64)可执行二进制文件
    资源:加快进入区块链的5种最佳编程语言
    CF1720 --- Codeforces Round #815 (Div. 2)
    【Hack The Box】windows练习-- Scrambled
    VTK——使用包围盒切割医学图像
    数据分析之正则表达式
    React Hooks学习笔记
    ClickHouse入门手册1.0
    关于判断点是否位于轮廓内的一点思考
  • 原文地址:https://blog.csdn.net/u011627218/article/details/139058719