• 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)

  • 相关阅读:
    Ajax--初识Ajax--jQuery里面的$.get,$.post,$.ajax使用
    阅读芯片源码(RTL)
    arcgis创建postgre企业级数据库
    spring cloud 企业电子招标采购系统源码&功能清单
    安全生产管理系统——特殊作业管控
    Liunx修改IP地址后可能会遇到的问题
    centos下给es7.12.1设置密码
    腾讯云 Web 超级播放器开发实战
    戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)
    [附源码]SSM计算机毕业设计新生入学计算机配号系统JAVA
  • 原文地址:https://blog.csdn.net/u011627218/article/details/139058719