三、集成负载均衡ribbon

一、整合ribbon

第一步:给三个模块引入依赖

不需要引入依赖,因为nacos以来用引用了ribbon

第二步:编写代码

AApplication.java

package com.badcat.a;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author 50244
 */
@SpringBootApplication
public class AApplication {
    public static void main(String[] args) {
        SpringApplication.run(AApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

TestRibbonController.java

package com.badcat.a.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author 50244
 */
@Slf4j
@RestController
@RequestMapping("/ribbon")
public class TestRibbonController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/let_module-b_say_hello")
    public String letModuleBSayHello(){
        String result = restTemplate.getForObject("http://b/hello/say_hello", String.class);
        log.info("module-b say : [{}]", result);
        return String.format("module-b say : [%s]", result);
    }
}

调用结果

第三步:启动两个module-b,测试负载均衡,端口分别是11000和11001

调用6次,查看日志,可见请求被分发到两个端口上了

二、内置负载均衡规则

使用全局配置的方式将负载策略修改为随机策略
添加两个Java类

package com.badcat.a.config;

import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClients(defaultConfiguration = RibbonConfiguration.class)
public class RibbonConfig {
}
package com.badcat.a.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

调用module-b呈现了随机现象:

三、负载策略细粒度控制

目标:调用module-b使用随机策略,调用module-c使用轮询策略

方式一:Java代码方式,添加4个java文件:

注意:如下代码中BRibbonConfiguration、CRibbonConfiguration上边一定不要加@Configuration,加上的话,如果像这样有多个RibbonConfiguration,启动会报错;如果只有一个RibbonConfiguration(例如只有BRibbonConfiguration),虽然启动不报错,但这个配置不只是影响调用module-b,也会影响调用module-c,也就说是一个全局配置了。所以一定不要加@Configuration。
package com.badcat.a.config;

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClient(name = "b", configuration = BRibbonConfiguration.class)
public class BRibbonConfig {
}
package com.badcat.a.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class BRibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}
package com.badcat.a.config;

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClient(name = "c", configuration = CRibbonConfiguration.class)
public class CRibbonConfig {
}
package com.badcat.a.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class CRibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        return new RoundRobinRule();
    }
}

调用结果:
调用module-b呈现随机现象:

调用module-c呈现轮询现象:

方式二:配置文件方式

将之前的java代码方式的注解都去掉,使之无效,然后application.yml中添加如下配置

b:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
c:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

调用结果:
调用module-b呈现随机现象:

调用module-c呈现随机现象:

四、饥饿加载

添加配置

ribbon:
  eager-load:
    enabled: true
    clients: b,c

这部分代码放到了码云 study_badcat/spring-cloud-alibaba-study (gitee.com)
,v3.0分支

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容