一、整合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分支