SpringCloud(六)Ribbon的负载均衡(一)

Ribbon

何为负载均衡?

负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过在服务器节点之间按照专门用于负载均衡的设备,比如F5等;而软件负载均衡则是通过在服务器上安装一些用于负载均衡功能或模块等软件来完成请求分发工作,比如Nginx等。不论采用硬件负载均衡还是软件负载均衡,只要是服务端都能以类似下图的架构方式构建起来:

硬件负载均衡的设备或是软件负载均衡的软件模块都会维护一个下挂可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(比如线性轮询、按权重负载、按流量负载等)从维护的可用服务端清单中取出一台服务端端地址,然后进行转发。

而客户端负载均衡和服务端负载均衡最大的不同点在于上面所提到服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端端清单来自于服务注册中心,比如上一章我们介绍的Eureka服务端。同服务端负载均衡的架构类似,在客户端负载均衡中也需要心跳去维护服务端清单的健康性,默认会创建针对各个服务治理框架的Ribbon自动化整合配置,比如Eureka中的org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration。在实际使用的时候,我们可以通过查看这两个类的实现,以找到它们的配置详情来帮助我们更好地使用它。

什么是Ribbon

ribbon是netflixfa发布的一个负载均衡器,有助于控制Http和TCP客户端行为,在SprIngCloud中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载

在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon会自动的从注册中心中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务。

Ribbon的主要作用

1 服务调用

基于Ribbon实现服务调用,是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系,借助RestTemplate最终进行调用

2 负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡算法自动的选择需要调用的服务地址

使用

1 在创建RestTemplate的时候,声明@LoadBalanced(rbbion提供的负载均衡的注解)注解

2 使用RestTemplate调用远程微服务,不需要拼接微服务的URL,以待请求的服务名替代IP地址

服务端负载均衡 nignx F5

客户端负载均衡

Ribbon是典型的客户端负载均衡服务器,Ribbon会获取服务的所有地址,根据内部的负载均衡的算法获取本次请求的有效地址

实例:

准备两个商品微服务(9001,9011)

在订单系统中远程以负载均衡的形式调用商品服务

``

 server:   port: 9001 spring:   application:     name: service-product #服务名称   datasource:     driver-class-name: com.mysql.jdbc.Driver     url: jdbc:mysql://localhost:3306/shops?useUnicode=true&characterEncoding=utf8     username: root     password: 15192734369qwe   jpa:     database: mysql     show-sql: true     open-in-view: true #配置Eureka eureka:   client:     service-url:       defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个EurekaServer之间用逗号分隔   instance:     prefer-ip-address: true #使用IP地址进行注册     instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册服务ID     lease-renewal-interval-in-seconds: 5 #发送心跳的间隔默认30s(单位为s)     lease-expiration-duration-in-seconds: 60  #续约到期时间,默认90s(单位为s)

``

 server:   port: 9011 spring:   application:     name: service-product #服务名称   datasource:     driver-class-name: com.mysql.jdbc.Driver     url: jdbc:mysql://localhost:3306/shops?useUnicode=true&characterEncoding=utf8     username: root     password: 15192734369qwe   jpa:     database: mysql     show-sql: true     open-in-view: true #配置Eureka eureka:   client:     service-url:       defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ #多个EurekaServer之间用逗号分隔   instance:     prefer-ip-address: true #使用IP地址进行注册     instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册服务ID     lease-renewal-interval-in-seconds: 5 #发送心跳的间隔默认30s(单位为s)     lease-expiration-duration-in-seconds: 60  #续约到期时间,默认90s(单位为s)

在服务消费者里添加@LoadBalanced注解开启Ribbon自带的负载均衡功能

``

 @SpringBootApplication @EntityScan("com.qqq.entity") public class OrderApplication {     public static void main(String[] args) {         SpringApplication.run(OrderApplication.class,args);     }     /**      * 使用spring提供的RestTemplate发送http请求到商品服务      * 1 将RestTemplate对象交给容器管理      * 2 使用其方法完成操作      */     @LoadBalanced //Ribbon自带的负载均衡的注解     @Bean     public RestTemplate restTemplate()     {         return new RestTemplate();     } ? ? }

``

 package com.qqq.controller; ? import com.qqq.entity.Product; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; ? import java.util.List; ? @RestController @RequestMapping("/order") public class OrderController {     //注入RestTemplate对象     @Autowired     private RestTemplate restTemplate;     /**      * 注入DiscoveryClient      * SpringCloud提供的获取元数据的工具类      * 调用方法获取服务的元数据信息      */     @Autowired     private DiscoveryClient discoveryClient;     /**      * 参数:商品ID      * 通过订单系统,调用商品服务根据id查询商品信息      * 1 需要配置一个商品对象      * 2 需要调用商品服务      * 使用java中的urlConnection完成,或使用httpClient,okHttp      * RestTemplate      */ //    @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET) //    public Product findById(@PathVariable("id") Long id) //    { //        //调用DiscoveryClient的getInstances方法根据服务名获取元数据 //        List<ServiceInstance> instances = discoveryClient.getInstances("SERVICE-PRODUCT"); //        //获取唯一的元数据 //        ServiceInstance instance = instances.get(0); //        Product product=null; //        //如何调用商品服务 //        //根据元数据和端口号拼接请求的url //        product=restTemplate.getForObject("http://"+instance.getHost()+":"+instance.getPort()+"/product/"+id,Product.class); //        return product; //    } ?     /**      * 基于Ribbon的形式调用远程微服务      * @param id      * @return      */     @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)     public Product findById(@PathVariable("id") Long id)     {         Product product=null;         product=restTemplate.getForObject("http://service-product/product/"+id,Product.class);         return product;     } }

Ribbon默认的负载均衡就是轮询策略

Ribbon内置了多种负载均衡策略

可在服务消费者的application.yml配置文件中修改负载均衡策略

``

 #修改ribbon的负载均衡策略 服务名 - ribbon - NFLoadBalancedRuleClassName:策略 shop-service-product:   ribbon:     NFLoadBalancedRuleClassName: com.netflix.loadbalancer.RandomRule

原文地址:https://www.cnblogs.com/qyx66/p/12254362.html

时间: 2024-11-08 23:54:22

SpringCloud(六)Ribbon的负载均衡(一)的相关文章

springcloud 之Ribbon客户端负载均衡配置使用

pom.xml添加配置说明:这里服务注册与发现用的是Eureka,所以消费者端需要引入eureka,使用EurekaClient来调用服务 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <g

Spring Cloud Ribbon——客户端负载均衡

一.负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 1.服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后

springcloud(六)-Ribbon配置自定义算法

前言 很多场景下,可能根据需要自定义Ribbon的配置,例如修改Ribbon的负载均衡规则等.Spring Cloud Edgware允许使用java代码或属性自定义Ribbon 的配置,两种方式等价. Java代码定义 我们先说使用Java代码写配置类的方式定义负载均衡算法. 复制项目microservive-consumer-movie-ribbon,将ArtifactId修改为microservice-consumer-movie-ribbon-customizing. 1.创建Ribbo

Spring Cloud:使用Ribbon实现负载均衡详解(下)

在上一篇文章(Spring Cloud:使用Ribbon实现负载均衡详解(上))中,我对 Ribbon 做了一个介绍,Ribbon 可以实现直接通过服务名称对服务进行访问.这一篇文章我详细分析一下如何使用 Ribbon 实现客户端的负载均衡. 1. 使用 Ribbon 实现负载均衡 要实现负载均衡,首先要有多个订单服务提供者,目前我们就一个 microservice-order-provider01,端口号 8001,我们可以仿照这个服务,再创建两个子模块,也是订单服务提供者,取名为 micro

笔记:Spring Cloud Ribbon 客户端负载均衡

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,基于 Netflix Ribbon 实现,通过Spring Cloud 的封装,可以让我们轻松的将面向服务的REST 模板请求自动转换为客户端负载均衡的服务调用.客户端负载均衡在系统架构中是一个非常重要的,并且是不得不去实施的内容,因为负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段,客户端负载均衡需要通过心跳去维护服务端清单的健康性,这个需要服务注册中心配合完成,在Spring Cl

springcloud的两种负载均衡策略

前言: 之前写了通过Ribbon+RestTemplate实现调用服务,此处我再系统的说一下两者的区别 一.springcloud的负载均衡策略 1.Ribbon 是基于Netflix Ribbon实现的一套客户端 负载均衡的工具,类似Nginx主要功能时提供客户端的软件负载均衡算法LB就是负载均衡,集中式(F5),进程内(Nginx),消费者可以自动看从Eureka中拿到对应的服务列表,默认进行轮询RoundRobinRule 下图是RestTemplate的自带的7中均衡策略 我们在之前通过

SpringCloud学习系列-Feign负载均衡(2)

Feign使用步骤 1.参考microservicecloud-consumer-dept-80   新建microservicecloud-consumer-dept-feign 修改主启动类名字DeptConsumer80_Feign_App 2.microservicecloud-consumer-dept-feign工程pom.xml修改,主要添加对feign的支持 <dependency> <groupId>org.springframework.cloud</gr

(05)SpringCloud实战之Feign负载均衡

一.概述 1.官方解释 Feign是一个声明式WebService客户端.使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解.Feign也支持可拔插式的编码器和解码器.Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon组合使用以支持负载均衡. 通俗的说,Feign是一个声明式的Web

SpringCloud学习(5)——Feign负载均衡

Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. 在使用Ribbon+RestTemplate时, 利用RestTemplate对http请求的封装处理, 形成了一套模板化的调用方法.但是在实际开发中, 由于对服务依赖的调用可能不止一处, 往往一个接口会被多出调用, 所以通常都会针对每个微服务自行封装一些客户端类来包装这些以来服务的调用.所以Fe