SpringCloud - Ribbon

1、负载均衡

1.1 负载均衡简介

负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡:
① 服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。
② 客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。
在这里插入图片描述

如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择 一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。
在这里插入图片描述

1.2 实现负载均衡

1.2.1 起一个不同端口的服务

我们需要借助IDEA再启一个服务,这个服务也是ShopProductServer,但是他的端口是不同的。
在VM option中输入需要指定的端口号即可:

-Dserver.port=8081

在这里插入图片描述
在这里插入图片描述

1.2.2 修改实现类代码实现负载均衡
 @Override
  public Order getById(Long oid, Long pid) {
    // 从nacos中获取服务
    List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
    // 定义一个随机数
    int index = new Random().nextInt(instances.size());
    // 随机获取一个服务
    ServiceInstance serviceInstance = instances.get(index);
    String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
    Product product = restTemplate
        .getForObject("http://"+url+"/product?productId=" + pid, Product.class);
    Order order = orderDao.getOne(oid);
    order.setUsername(order.getUsername()+",data form "+serviceInstance.getPort());
    return order;
  }

2、基于Ribbon实现负载均衡

2.1.1 Ribbon是什么

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。**Ribbon就是简化了上面代码的组件,其中提供了更多的负载均衡算法。**它是Spring Cloud的一个组件,它可以让我们使用一个注解就能轻松的搞定负载均衡。

2.1.2 Ribbon实现负载均衡

Ribbon如何去做负载均衡操作,调用接口用的最底层的HttpURLConnection。

2.1.2.1 引入依赖、添加注解

1)引入依赖

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring‐cloud‐starter‐netflix‐ribbon</artifactId>
</dependency>

nacos-discovery依赖了ribbon,可以不用再引入ribbon依赖
在这里插入图片描述
2)添加@LoadBalanced
我们需要在RestTemplate的生成方法上添加一个注解:@LoadBalance,这个注解是一个增强注解,它可以增强RestTemplate ,使他可以实现负载均衡。

@Configuration 
public class RestConfig {
 @Bean 
 @LoadBalanced 
 public RestTemplate restTemplate() {
   return new RestTemplate(); 
    } 
 }
2.1.2.2 修改productService实现类的代码

为了更直观,我们直接将application.yml中的端口号设置到实现类中

  @Value("${server.port}")
  private String port;

  @Override
  public Product findById(Long productId) {
    Product product = productDao.findById(productId).get();
    product.setPname(product.getPname()+",data form"+port);
    return product;
  }
2.1.2.3 修改OrderService实现类的代码
  @Override
  public Order getById(Long oid, Long pid) {
    Product product = restTemplate
        .getForObject("http://product-service/product?productId=" + pid, Product.class);
    Order order = orderDao.getOne(oid);
    order.setPname(product.getPname());
    return order;
  }
2.1.2.4 实现原理

Ribbon原理
在这里插入图片描述

为什么使用服务的名称替代url就可以实现负载均衡了呢?
1、通过反射获取到你传递过来的参数(假设传进来1),此时的url变成了:http://product-service/product?productId=1
2、按照规则进行切割,将product-service切割出来
3、根据从注册中心拉去过来的服务列表对应着的节点信息,假设1product-service对应着192.168.10.180:8081和192.168.10.180:8083。
4、根据你1配置的负载均衡的策略去选择一个信息节点,将服务名称替换成对应的ip和端口。假设此时url变成了:
http://192.168.10.180:8081/product?productId=1.
5、使用RestTemplate去发送请求
注意:一定要在RestTemplate的生成方法上添加@LoadBalance注解,这个注解表示将RestTemplate进行加强,只有进行了加强才会去实现上述的步骤,不然是无法实现负载均衡的。

3、Ribbon支持的负载均衡策略

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为com.netflix.loadbalancer.IRule,他具体支持的负载均衡策略有:
在这里插入图片描述
我们可以通过修改配置来调整Ribbon的负载均衡策略,在Shop-order-server项目的application.yml中增加如下配置:

product-service: # 调用的提供者的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值