1.配置类

    1. @Configuration
    2. public class RibbonConfig {
    3. /**
    4. * 全局配置
    5. * 指定负载均衡策略
    6. * @return
    7. */
    8. @Bean
    9. public IRule iRule() {
    10. // 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
    11. return new NacosRule();
    12. }
    13. }

    注意:此处有坑。不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的 RibbonClients共享。 不建议这么使用,推荐yml方式
    image.png
    image.png
    利用@RibbonClient指定微服务及其负载均衡策略。

    1. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
    2. DruidDataSourceAutoConfigure.class})
    3. //@RibbonClient(name = "mall-order",configuration = RibbonConfig.class)
    4. //配置多个 RibbonConfig不能被@SpringbootApplication的@CompentScan扫描到,否则就是全局配置的效果
    5. @RibbonClients(value = {
    6. // 在SpringBoot主程序扫描的包外定义配置类
    7. @RibbonClient(name = "mall-order",configuration = RibbonConfig.class),
    8. @RibbonClient(name = "mall-account",configuration = RibbonConfig.class)
    9. })
    10. public class MallUserRibbonDemoApplication {
    11. public static void main(String[] args) {
    12. SpringApplication.run(MallUserRibbonDemoApplication.class, args);
    13. }
    14. }

    配置文件:调用指定微服务提供的服务时,使用对应的负载均衡算法
    修改application.yml

    1. # 被调用的微服务名
    2. mall-order:
    3. ribbon:
    4. # 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
    5. NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

    3.2.2 自定义负载均衡策略
    通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。
    1)实现基于Nacos权重的负载均衡策略

    1. @Slf4j
    2. public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {
    3. @Autowired
    4. private NacosDiscoveryProperties nacosDiscoveryProperties;
    5. @Override
    6. public Server choose(Object key) {
    7. DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
    8. String serviceName = loadBalancer.getName();
    9. NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
    10. try {
    11. //nacos基于权重的算法
    12. Instance instance = namingService.selectOneHealthyInstance(serviceName);
    13. return new NacosServer(instance);
    14. } catch (NacosException e) {
    15. log.error("获取服务实例异常:{}", e.getMessage());
    16. e.printStackTrace();
    17. }
    18. return null;
    19. }
    20. @Override
    21. public void initWithNiwsConfig(IClientConfig clientConfig) {
    22. }

    2) 配置自定义的策略
    2.1)配置文件:
    修改application.yml

    1. # 被调用的微服务名
    2. mall-order:
    3. ribbon:
    4. # 自定义的负载均衡策略(基于随机&权重)
    5. NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule

    3.3 饥饿加载
    在进行服务调用的时候,如果网络情况不好,第一次调用会超时。
    Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。
    image.png
    开启饥饿加载,解决第一次调用慢的问题

    1. ribbon:
    2. eager-load:
    3. # 开启ribbon饥饿加载
    4. enabled: true
    5. # 配置mall-user使用ribbon饥饿加载,多个使用逗号分隔
    6. clients: mall-order

    源码对应属性配置类:RibbonEagerLoadProperties
    测试:
    image.png
    3. Ribbon内核原理
    3.1 Ribbon原理
    image.png