美文网首页微服务技术-Spring-Cloud
Spring Cloud学习笔记-负载均衡

Spring Cloud学习笔记-负载均衡

作者: IT5 | 来源:发表于2020-07-15 14:31 被阅读0次

    Netflix Ribbon

    调度算法

    1、First Come First Served  先来先服务
    2、Earliest deadline first 最早截止时间优先
    3、Shortest remaining time first 最短保留时间优先
    4、Fixed Priority 固定优先级
    5、Round-Robin 轮训
    6、Multilevel Queue 多级别队列列
    

    引入Maven 依赖

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

    激活 Ribbon 客户端

    package com.segumentfault.springcloudlesson6;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClients;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    // 多个 Ribbon 定义
    @RibbonClients({
            @RibbonClient(name = "spring-cloud-service-provider")
    })
    public class SpringCloudLesson6Application {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudLesson6Application.class, args);
        }
    
        //声明 RestTemplate  开启负载均衡的注解
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    配置 Ribbon 客户端

    application.properties

    ### 配置ribbon 服务地提供方
    spring-cloud-service-provider.ribbon.listOfServers = \
      http://${serivce-provider.host}:${serivce-provider.port}
    

    调整 RestTemplate

    //声明 RestTemplate
    @LoadBalanced // RestTemplate 的行为变化
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    

    Neflix Ribbon 整合 Eureka

    激活服务发现的客户端

    package com.segumentfault.springcloudlesson6;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClients;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    // 多个 Ribbon 定义
    @RibbonClients({
            @RibbonClient(name = "spring-cloud-service-provider")
    })
    @EnableDiscoveryClient // 激活服务发现客户端
    public class SpringCloudLesson6Application {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudLesson6Application.class, args);
        }
    
        //声明 RestTemplate
        @LoadBalanced // RestTemplate 的行为变化 开启负载均衡的注解
        @Bean
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
    

    创建并且启动 Eureka Server

    spring-cloud-lesson6-eureka-server 为例

    激活 Eureka Server

    package com.segumentfault.springcloudlesson6eurekaserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class SpringCloudLesson6EurekaServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudLesson6EurekaServerApplication.class, args);
        }
    }
    

    配置 Eureka 服务器

    ## Eureka Serer
    spring.application.name = spring-cloud-eureka-server
    
    ## 服务端口
    server.port = 10000
    
    ## Spring Cloud Eureka 服务器作为注册中心
    ## 通常情况下,不需要再注册到其他注册中心去
    ## 同时,它也不需要获取客户端信息
    ### 取消向注册中心注册
    eureka.client.register-with-eureka = false
    ### 取消向注册中心获取注册信息(服务、实例信息)
    eureka.client.fetch-registry = false
    ## 解决 Peer / 集群 连接问题
    eureka.instance.hostname = localhost
    eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka
    

    启动 Eureka Server

    调整 Ribbon 客户端连接 Eureka Server

    applicaiont.properties

    ## 服务提供方
    spring.application.name = spring-cloud-ribbon-client
    
    ### 服务端口
    server.port = 8080
    
    ### 管理安全失效
    management.security.enabled = false
    
    ### 暂时性关闭 Eureka 注册
    ## 当使用 Eureka 服务发现时,请注释掉一下配置
    # eureka.client.enabled = false
    
    ## 连接 Eureka Sever
    eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/
    
    ### 服务提供方主机
    serivce-provider.host = localhost
    ### 服务提供方端口
    serivce-provider.port = 9090
    
    serivce-provider.name = spring-cloud-service-provider
    
    ### 配置ribbon 服务地提供方
    ## 当使用 Eureka 服务发现时,请注释掉一下配置
    # spring-cloud-service-provider.ribbon.listOfServers = \
      http://${serivce-provider.host}:${serivce-provider.port}
    

    调整服务提供方并且连接 Eureka Server

    ## 服务提供方
    spring.application.name = spring-cloud-service-provider
    
    ### 服务端口
    server.port = 9090
    
    ### 管理安全失效
    management.security.enabled = false
    
    ### 暂时性关闭 Eureka 注册
    ## 当使用 Eureka 服务发现时,请注释掉一下配置
    # eureka.client.enabled = false
    
    ## 连接 Eureka Sever
    eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka/
    

    再启动两台服务提供方实例

    --server.port=9091

    --server.port=9092

    实际请求客户端

    • LoadBalancerClient
      • RibbonLoadBalancerClient

    负载均衡上下文

    • LoadBalancerContext
      • RibbonLoadBalancerContext

    负载均衡器

    • ILoadBalancer
      • BaseLoadBalancer
      • DynamicServerListLoadBalancer
      • ZoneAwareLoadBalancer
      • NoOpLoadBalancer
    总结一下:
      ILoadBalancer接口实现类做了以下的一些事情:
        1.维护了存储服务实例Server对象的二个列表。一个用于存储所有服务实例的清单,一个用于存储正常服务的实例清单
        2.初始化得到可用的服务列表,启动定时任务去实时的检测服务列表中的服务的可用性,并且间断性的去更新服务列表,结合注册中心。
        3.选择可用的服务进行调用(这个一般交给IRule去实现,不同的轮询策略)
    
    三个很重要的概念
    
      ServerList接口:定义用于获取服务器列表的方法的接口,主要实现DomainExtractingServerList接口,每隔30s种执行getUpdatedListOfServers方法进行服务列表的更新。
      ServerListUpdater接口:主要实现类EurekaNotificationServerListUpdater和PollingServerListUpdater(默认使用的是PollingServerListUpdater,结合Eureka注册中心,定时任务的方式进行服务列表的更新)
      ServerListFilter接口:根据LoadBalancerStats然后根据一些规则去过滤部分服务,比如根据zone(区域感知)去过滤。(主要实现类ZonePreferenceServerListFilter的getFilteredListOfServers会在更新服务列表的时候去执行)。
    
    

    负载均衡规则

    核心规则接口

    • IRule
      • 随机规则:RandomRule 随机选择一个server
      • 最可用规则:BestAvailableRule 选择一个最小的并发请求的server
      • 轮训规则:RoundRobinRule 默认策略 轮询选择server
      • 重试实现:RetryRule 对选定的负载均衡策略机上重试机制
      • 客户端配置:ClientConfigEnabledRoundRobinRule
      • 可用性过滤规则:AvailabilityFilteringRule 过滤掉那些因为一直连接失败的被标记为circuittripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
      • RT权重规则:WeightedResponseTimeRule 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
      • 规避区域规则:ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择server

    PING 策略

    核心策略接口

    • IPingStrategy

    PING 接口

    • IPing
      • NoOpPing
      • DummyPing
      • PingConstant
      • PingUrl

    Discovery Client 实现

    • NIWSDiscoveryPing

    相关文章

      网友评论

        本文标题:Spring Cloud学习笔记-负载均衡

        本文链接:https://www.haomeiwen.com/subject/xcndhktx.html