第四章 Ribbon负载均衡

目录

一、Load Balance介绍

二、Ribbon

三、Ribbon配置步骤

1、创建项目

1.1 创建商品(product-service )服务提供者集群

      1.1.1 创建商品(product-service )服务

     1.1.2  创建商品(product-service )服务提供者集群

1.2 创建项目订单(order-service )服务

    1.2.1 创建订单(order-service )服务

2 新增 Ribbon 的相关依赖

3 修改订单(order-service )服务的 OrderController 

4 配置负载均衡

方式一:使用注解@LoadBalaneced

5 进行测试

 以下为了解内容

四 Ribbon的IRule组件及负载均衡策略

1、负载均衡策略

2、案例:负载均衡-随机策略

3、负载均衡随机策略测试

五 自定义负载均衡

1、自定义定义负载均衡类

2、使用自定义负载均衡

3、测试自定义负载均衡 同3.6进行测试


一、Load Balance介绍

        LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。

       负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。

       常见的负载均衡有 硬件:F5、软件:( 用于服务器端:Nginx, 用于客户端:Ribbon,Feign

二、Ribbon

        简单的说,用于客户端的负载均衡软件Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如:连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer (简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

        Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置RibbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

三、Ribbon配置步骤

1、创建项目

1.1 创建商品(product-service )服务提供者集群

      1.1.1 创建商品(product-service )服务

       创建商品(product-service )服务见 第三章产品(product-service)服务完善商品服务 ,将二者进行组合就是一个完整的商品(product-service )服务。 详见:第三章 Spring Cloud 组件及入门案例_爱吃面的猫的博客-CSDN博客

     1.1.2  创建商品(product-service )服务提供者集群

  • 方式一

     为了搭建多个产品(product-service )服务,将创建的商品(product-service )服务复制2份,即三个产品(product-service)服,服务名统一为:product-service,项目名分别为:productServer9001,productServer9002,productServer9003,端口号分别设置为:9001、9002、9003,在application.yml中配置如下:

  •  方式二

       使用如下方式:不用创建项目复制多个项目。

1.2 创建项目订单(order-service )服务

      创建 订单(order-service )服务 和 产品(product-service)服务 。   

    1.2.1 创建订单(order-service )服务

     创建订单(order-service )服务见 第三章订单(order-service )服务完善订单服务,将将二者进行组合就是一个完整的订单(order-service )服务。详见:

https://blog.csdn.net/qq_41946216/article/details/127276089?spm=1001.2014.3001.5502

2 新增 Ribbon 相关依赖

     修改 订单(order-service )服务的 pom 文件,新增 Ribbon 相关依赖。 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloudbase</artifactId>
        <groupId>com.hwadee.springcloud2022</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hwadee.springcloud2022</groupId>
    <artifactId>orderServer9000</artifactId>

    <dependencies>
        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 管理公共api -->
        <dependency>
            <groupId>com.hwadee.springcloud2022</groupId>
            <artifactId>springcloud-api</artifactId>
        </dependency>

        <!-- Ribbon相关 开始 -->
<!--告诉微服务注册中心我是微服务的client端 Ribbon 需要和eureak整合-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!-- Ribbon相关 结束 -->

        <!--引入eureka服务的客户端组件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
</project>

3 修改订单(order-service )服务的 OrderController 

     问题描述:

     消费端服务 即  订单(order-service )服务的 OrderController 中,原本有的远程调用如下:

@RestController
@RequestMapping("/order")
public class OrderController {
 
    // 订单服务要调用远端的商品服务的ip地址和端口号
    private static final String REST_URL_PREFIX = "http://localhost:9001";
    /**
     * 使用
     * 使用restTemplate访问restfu1接口非常的简单粗暴无脑。
     * (url, requestMap, ResponseBean.class)这三个参 数分别代表
     * REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
     **/
    @Autowired
    private RestTemplate restTemplate;
 
    @RequestMapping("/buy/{id}")
    public Product buy(@PathVariable Long id) {
        System.out.println("进入OrderController的buy()  id:"+id);
        return restTemplate.getForObject(REST_URL_PREFIX + "/product/buy/"+id,Product.class);
    }

       上述代码中的 REST_URL_PREFIX = "http://localhost:9001"  的localhost和端口号都是硬编码,如果将来访问的远程服务(产品(product )服务)有多个,则ip地址 和 端口号 需要经常手动修改。因此将多个远程服务的 ip 进行统一命名为服务名,例如product-service,从而可以将REST_URL_PREFIX = "http://localhost:9001"  修改为 REST_URL_PREFIX = "http://PRODUCT-SERVICE"  ,因为@LoadBalanced是根据微服务名PRODUCT-SERVICE去查找对应的服务的ip和端口号,否则无法访问。

      修改 订单(order-service )服务的 OrderController,如下:

import com.hwadee.springboot.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/order")
public class OrderController {

    private static final String REST_URL_PREFIX = "http://PRODUCT-SERVICE";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/buy/{id}")
    public Product buy(@PathVariable Long id) {
        System.out.println("进入OrderController的buy()  id:"+id);
        return restTemplate.getForObject(REST_URL_PREFIX + "/product/buy/"+id,Product.class);
    }

}

4 配置负载均衡

       配置Ribbon的负载均衡有两种方式。有注解形式和配置文件形式,后面Feign时候讲配置文件形式。

方式一:使用注解@LoadBalanced

       @LoadBalanced注解在RestTemplate 上。 修改 订单服务 的configbean ,追加注解@LoadBalanced,因为是对客户端服务(订单(order-service )服务)远程调用进行负载均衡分配。@LoadBalanced是根据微服务名PROVIDER-SERVICE去查找对应服务的ip端口号,查找的ip端口号是进行负载均衡后获取到的。代码如下:

@Configuration//此类相当于spring中的容器对bean的管理生成。
public class ConfigBean {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

5 进行测试

  • 首先启动注册中心服务:eurekaServer 主启动类 EurekaServerApplication
  • 其次启动订单服务:order-service 主启动类 OrderServerApplication
  • 启动商品服务productServer9001:product-servie 的主启动类 ProductServerApplication
  • 启动商品服务productServer9002:product-servie 的主启动类 ProductServerApplication
  • 启动商品服务productServer9003:product-servie 的主启动类 ProductServerApplication

   多次访问订单服务: http://localhost:9000/order/buy/1 查看返回的 ip 和 端口信息


 以下为了解内容

四 RibbonIRule组件及负载均衡策略

1、负载均衡策略

       IRule:根据特定算法从服务列表选取一个要访问的服务Robin默认七种策略。

RoundRobinRule

轮询

RandomRule 随机
AvailbilityFilteringRule

首先过滤掉:

1、由于多次访问故障而处于断路器跳闸状态的服务

2、并发的连接数量超过阈值的服务

其次对剩余的服务列表按照轮询策略进行访问

WeightedResponseTimeRule

响应时间加权:

1、根据平均响应时间计算所有服务的权重,

响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,则使用RoundRobinRule轮询策略,等统计信息足够,会切换到WeightedResponseTimeRule

RetryRule:重试

先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务。

BestAvailableRule:最佳

1、首先过滤掉由于多次访问故障而处于断路器跳闸状态的服务

2、其次选择一个并发量最小的服务

ZoneAvoidanceRule

默认规则,复合判断server所在区域的性能和server的可用性选择服务器(就近原则,选择相同区域的服务器和服务。如果不存在区域概念则按线性轮询方式选择)

2、案例:负载均衡-随机策略

3、负载均衡随机策略测试

     测试如:3.6 进行测试相同。

五 自定义负载均衡

注意细节:
       官方文档明确给出了警告:
      这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目的了。

1、自定义定义负载均衡类

       定义负载均衡类,且返回值类型必须是IRule类型。但要注意:自定义的负载均衡类不能和app在同一父级别的目录下, 即 自定义的负载均衡类 的目录和 app所在的根目录同级别,包路径如下面的图。

 代码如下:

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MySelfRule {
    @Bean
    public IRule myRule() {
        return new RandomRule();// Ribbon默认是轮询,我自定义为随机
    }
}

2、使用自定义负载均衡

      修改order-service 主启动类 OrderServerApplication, 新增注解@RibbonClient (name="PRODUCT-SERVICE" , configuration=MySelfRule.class,指定自定义配置类,在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使自定义的配置类MySelfRule生效。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import rule.MySelfRule;

@SpringBootApplication
@EnableEurekaClient// 启动 eureka 客户端
@RibbonClient (name="PRODUCT-SERVICE" , configuration= MySelfRule.class)
public class OrderServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServerApplication.class, args);
    }
}

3、测试自定义负载均衡 同3.6进行测试

       测试如:3.6 进行测试相同。

第三章:Spring Cloud 组件及入门案例​​​​​​​

第五章:Feign负载均衡详解

猜你喜欢

转载自blog.csdn.net/qq_41946216/article/details/127284173
今日推荐