• 实用篇-Ribbon负载均衡


    一、负载均衡原理

    回想一下上面的 '服务发现',order-service微服务向user-service微服务发送请求,但是user-service有两个,也就是开启了两个user-service实例,且端口不同,一个是8081,另一个是8082,下面我们将详细学一下请求在过程中经历了什么,如下图

    其中负载均衡的各种策略是在IRule接口里面,下面将会深入学习这个IRule接口

    二、负载均衡策略

    Ribbon的负载均衡规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则,IRule有很多实现类,如下继承关系图

    每一个实现类都是一种规则,上图只是简单标注一下,下图是详细的

    如何修改负载均衡策略。负载均衡策略默认是轮询,如何修改为随机呢。有两种方式如下

    第一种: 代码方式(作用于全局即order服务访问任何微服务都是遵循这个规则的)。在order-service中的OrderApplication类中,定义一个新的IRule。简单理解就是在项目的引导类创建一个类型为IRule的bean

    1. /**
    2. * 配置负载均衡规则为随机
    3. * 注入spring容器
    4. * @return
    5. */
    6. @Bean
    7. public IRule randomRule(){
    8. return new RandomRule();
    9. }

    第二种: 配置文件方式(只作用于某个服务)。在order-service的application.yml文件中,添加新的配置也可以修改规则

    针对某个微服务而言的

    1. # UserService是你注册到Eureka时的服务名称。注意顶格写就行,不用写在spring:属性里面
    2. UserService:
    3. ribbon:
    4. # 负载均衡策略。不一定是RandomRule,还可以是其它,如上图那些都可。RandomRule表示把负载均衡策略修改为随机
    5. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    测试

    http://localhost:8080/order/104访问这个路径,并把参数设置为101,102,103,104,分别进行访问,可以看到8081端口访问到了3次,而8082端口只访问到了1次,可见,在访问次数较少的时候,确实是随机策略,但是当访问次数增多时,可以预见,还是均衡的

    三、Ribbon饥饿加载

    Ribbon默认是采用懒加载,即第一次访问时才会去创建Ribbon的LoadBalancerClient客户端,请求时间会很长(第一次访问时间长)

    而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置就可以开启饥饿加载。在order-service微服务的application.yml添加如下

    1. ribbon:
    2. eager-load:
    3. enabled: true # 开启饥饿加载
    4. # 指定对UserService这个服务开启饥饿加载
    5. #UserService是你注册到Eureka时的服务名称。如果有多个服务需要做饥饿加载,就-往下写
    6. clients:
    7. - UserService
    8. - xxService

    由于这里我们的调用服务只有一个,所以我们添加后配置如下

    1. server:
    2. port: 8080
    3. spring:
    4. datasource:
    5. url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    6. username: root
    7. password:
    8. driver-class-name: com.mysql.jdbc.Driver
    9. # Eureka相关配置
    10. application:
    11. # order的服务名称。也就是这个order-service注册到Eureka之后,这个order-service会叫什么名字
    12. name: OrderService
    13. mybatis:
    14. type-aliases-package: cn.itcast.user.pojo
    15. configuration:
    16. map-underscore-to-camel-case: true
    17. logging:
    18. level:
    19. cn.itcast: debug
    20. pattern:
    21. dateformat: MM-dd HH:mm:ss:SSS
    22. eureka:
    23. client:
    24. service-url:
    25. # eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个order-service微服务注册给哪个Eureka
    26. defaultZone: http://localhost:8686/eureka
    27. ribbon:
    28. eager-load:
    29. enabled: true # 开启饥饿加载
    30. # 指定对UserService这个服务开启饥饿加载
    31. #UserService是你注册到Eureka时的服务名称。如果有多个服务需要做饥饿加载,就-往下写
    32. clients:
    33. - UserService

    配置完后,重启OrderService的启动类 

  • 相关阅读:
    CG-23H 超声波风速风向传感器--易风(加热型)
    Linux 模块的初始化过程
    【深入浅出C#】章节10: 最佳实践和性能优化:内存管理和资源释放
    RuoYi-Vue Spring Security 密码加密
    React: hook(1) useState
    冰蝎Java WebShell免杀生成 -- ByPassBehinder4J​
    技术学习:Python(08)|操作MySQL
    【性能测试】Linux下Docker安装与docker-compose管理容器(超细整理)
    Contextual Transformer Networks for Visual Recognition
    TensorFlow败给PyTorch,谷歌:未来就靠你了,JAX
  • 原文地址:https://blog.csdn.net/m0_63732435/article/details/134071592