• SpringCloud(二)之Ribbon的实现负载均衡的基本应用


    一 Ribbon简介   
     Ribbon是Netflix发布的负载均衡器,它是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
    Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,
    API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
    在Spring Cloub 项目中  使用  feign 的更多,默认集成了ribbon,写起来更加思路清晰和方便,下一篇 讲feign。

    二 新建order_service项目
    1 为RestTemplate添加注解@LoadBalanced
    package unicom.com.cn.order_service;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;

    @SpringBootApplication
    @EnableFeignClients
    public class OrderServiceApplication {

    public static void main(String[] args) {
    SpringApplication.run(OrderServiceApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
    return new RestTemplate();
    }

    }
    2.application.yml 的配置(注册中心一定要启动 Eureka)
    server:
    port: 8781
    eureka:
    client:
    serviceUrl:
    #在此指定服务注册中心地址
    defaultZone: http://localhost:8761/eureka/
    #在此指定服务的名字
    spring:
    application:
    name: order-service
    3.对应业务中的调用

    @Service
    public class ProductOrderServiceImpl implements ProductOrderService {
    // 方式一
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public ProductOrder save(int userId, int productId) {
    Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, Map.class);
    ProductOrder productOrder = new ProductOrder();
    productOrder.setCreateTime(new Date());
    productOrder.setUserId(userId);
    productOrder.setTradeNo(UUID.randomUUID().toString());
    productOrder.setProductName(productMap.get("name").toString());
    productOrder.setPrice(Integer.parseInt(productMap.get("price").toString()));
    return productOrder;
    }
    }
    三 测试
    1 启动eureka-server微服务
    2 启动product_service微服务(和上面一样在配置文件中修改下端口就行8771)
    3 启动product_service微服务(和上面一样在配置文件中修改下端口就行8772)
    4启动order_service微服务(8781)
     
      测试结果

    注册成功。

    调用 order_service 中的方法是否成功

    测试结果(多测试几次可以得出ribbon默认采用轮询的方式进行负载均衡)

    四 修改ribbon默认采用轮询的方式(随机)

     自定义负载均衡策略:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties

    在调用方的yml 文件中加上:

    #自定义负载均衡策略(随机)
      product-service:
        ribbon:
          NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    5,策略选择:
    1、如果每个机器配置一样,则建议不修改策略 (推荐)
    2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule

  • 相关阅读:
    python 基础到字符串学习
    Newtonsoft.Json 获取匿名类数据
    Abp Wcf结合使用问题
    Ef Migration 操作出现SQLEXPRESS
    No context type was found in the assembly 'xxx.xxxx'. CodeFirst Ef错误
    Ef Code First 发生”provider: SQL Network Interfaces, error: 26
    ef 多条数据插入处理方案(据说还有更好的)
    记录一次 HttpWebRequest 尝试自动重定向太多 错误
    NetCore 下使用RSA加密,解密;并且前端使用jsencrypt.js实现Rsa相关方法。
    The specified framework version '2.0' could not be parsed 错误处理
  • 原文地址:https://www.cnblogs.com/xiaowangbangzhu/p/10396612.html
Copyright © 2020-2023  润新知