知识库
并发编程
  • 分类
  • 标签
  • 归档
友情连接

luoliang

吾生也有涯,知也无涯
并发编程
  • 分类
  • 标签
  • 归档
友情连接
  • openfeign拦截器
  • 基于redis的分布式
  • 服务发现之nacos
  • 负载均衡
    • 微服务
    weiluoliang
    2024-04-22
    目录

    负载均衡

    # 简介

    使用了微服务后,一般会有多个服务提供者,为了提高系统的性能和可用性,需要对请求进行负载均衡。负载均衡算法有轮询算法,加权轮询算法,随机算法,加权随机算法,最小活跃数算法,一致性Hash算法。

    # 负载均衡算法

    1. 轮询算法
    2. 随机算法
    3. 加权随机算法

    # spring-cloud-loadbalancer

    spring cloud 提供的客户端负载均衡和实现。

    1. ReactiveLoadBalancer 响应式编程使用 webClient
    2. BlockingLoadBalancerClient 传统的请求RestTemplate

    # 目前实现的算法

    1. RoundRobinLoadBalancer   // 轮询
    2. RandomLoadBalancer  // 随机
    
    1
    2

    # ServiceInstanceListSupplier

    spring-cloud-loadbalancer 提供了很多的 **ServiceInstanceListSupplier ** ,对应不同的场景使用。

    CachingServiceInstanceListSupplier 缓存实现,如果每次请求都访问一次注册中心那么会很浪费性能。提供了缓存的能力,当放生远程调用时先到缓存里面找,如果能找到要调用的服务,就直接使用。

    注意

    这里有一个坑,我在做优雅服务停机的时候遇到。当我关闭某个服务,该服务会主动下线,按道理调用方应该能感知到,我看nacos的源码,下线后会立马发送UDP报文通知其他服务,感知下线,但是我再实验的时候,发现下线的服务依然被调用,最后定位到是因为loadbalancer加了缓存,解决方案是起一个监听器,监听到服务下线,就清空缓存。

    ZonePreferenceServiceInstanceListSupplier 按区路由,优先调用同一个zone的服务,如果找不到就返回全部服务,再进入下一步负载均衡策略(随机or轮询)

    SameInstancePreferenceServiceInstanceListSupplier 使用同一个服务进行调用

    # 程序启动初始化

    在LoadBalancerAutoConfiguration中初始化了LoadBalancerInterceptor,并把LoadBalancerInterceptor加入到restTemplate中restTemplate.setInterceptors(list);

    # 执行流程

    1. restTemplate请求远程服务
    2. 进入到拦截器LoadBalancerInterceptor
    3. 拦截器从注册中心获取服务列表
    4. 根据配置的负载均衡策略选择服务
    5. 最后把地址的url替换成IP和端口
    6. 发送HTTP请求。

    # 参考

    官方文档-spring-cloud-loadbalancer (opens new window)

    上次更新: 2024/04/23, 18:11:13
    服务发现之nacos

    ← 服务发现之nacos

    最近更新
    01
    Linux常用命令
    09-04
    02
    SpringBoot启动脚本
    08-31
    03
    安装监控grafana
    08-30
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式