zoukankan      html  css  js  c++  java
  • SpringCloudAlibaba-负载均衡Ribbon

    简介

    Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡,内置多种负载均衡策略,内部负载均衡顶级接口为com.netflix.loadbalancer.IRule:具体策略如下

    1:BestAvailableRule  选择一个最小的并发请求的server   
        逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server 
    2:AvailabilityFilteringRule  过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值)   
        使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 
    3:WeightedResponseTimeRule  根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。    
        一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas
        时,使用roubine策略选择server。
    4:RetryRule  对选定的负载均衡策略机上重试机制    
        在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
    5:RoundRobinRule  轮询方式轮询选择server    
        轮询index,选择index对应位置的server
    6:RandomRule 随机选择一个server
        在index上随机,选择index对应位置的server    
    7:ZoneAvoidanceRule   复合判断server所在区域的性能和server的可用性选择server 
        使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接
        数过多的Server。

    修改配置(appliaction.yml)来调整Ribbon的负载均衡策略

    service-product: # 调用的提供者的名称
     ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    RestTemplate的生成方法上添加@LoadBalanced注解

    @Bean
    @LoadBalanced //基于ribbon的负载均衡
    public RestTemplate getRestTemplate() {
       return new RestTemplate();
    }

    接下来改造下单方法

        @GetMapping("/prod/{pid}")
        public Order order(@PathVariable("pid") Integer pid){
            log.info(">>>客户下单,调用商品微服务查询商品信息<<<");
    
            //直接使用微服务实例名,从nacos中获取服务地址
            String url = "service-product";
            Product product = restTemplate.getForObject("http://"+url+"/product/"+pid, Product.class);
    
            log.info(">>商品信息,查询结果:" + JSON.toJSONString(product));
            Order order = new Order();
            order.setUid(1);
            order.setUsername("测试用户1");
            order.setPid(product.getPid());
            order.setPname(product.getPname());
            order.setPprice(product.getPprice());
            order.setNumber(1);
    //        orderService.save(order);
            return order;
        }

    通过Idea再启动一个shop-product服务,设置端口为8082如下图修改

    启动查看nacos是否注册成功(下图可以看到service-product注册了两个实例)

     现在进行测试结果调用(执行两次)结果日志如下

    Order  log
    >>商品信息,查询结果:{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}
    >>>客户下单,调用商品微服务查询商品信息<<<
    >>商品信息,查询结果:{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}
    
    product  log
    商品信息查询成功,内容为{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}
    
    product2  log
    商品信息查询成功,内容为{"pid":1,"pname":"小米","pprice":1000.0,"stock":5000}

    product、product2分别有日志输出  则说明两次调用分别执行到了两个商品微服务、也说明ribbon负载均衡使用成功

      

  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/chenpt/p/13445988.html
Copyright © 2011-2022 走看看